一个音乐搜索模块~ 用的网易云音乐PC端API
发布于 3个月前 作者 zvenshy 1324 次浏览 来自 分享

学弟想要做一个WEB电台,需要搜索功能,然后就想封装一个node模块专门用来干这个(后面还会做JSONP API)。 本人喜欢用网易云音乐听歌,所以抓包分析了一下它的API(逼我下客户端 = = ) 这是链接 下面贴代码,作为一枚纯正的node新人,虚心接受大家的批评教育!

var request = require('request');
var qs = require('querystring');
//我的一个辅助函数库(未完成)
var v = require('vutils');
//Default config
var origin = 'http://music.163.com';
var defaultConfig = {
    headers: {
        'Origin': origin,
        'Referer': origin,
        'Content-Type': 'application/x-www-form-urlencoded'
    }
};
//获取URL
var _get163Url = {
    search: function () {
        return origin + '/api/search/suggest/web';
    },
    artist: function (key) {
        return origin + '/api/artist/' + key;
    },
    album: function (key) {
        return origin + '/api/album/' + key;
    },
    song: function () {
        return origin + '/api/song/detail';
    },
    mv: function () {
        return origin + '/api/mv/detail';
    },
    lyc: function () {
        return origin + '/api/song/lyric';
    }
};
//参数配置
var setConfig = function (c) {
    c = v.extend(v.clone(defaultConfig), c);
    var method  = c.method,
        resType = c.resType,
        body    = c.body;
    c.uri = _get163Url[resType](c.key);
    c.body = body ? qs.encode(body) : '';
    if (method === 'GET') {
        if (resType === 'song') c.body = c.body.replace('=', '=%5B') + '%5D';
        c.uri += '?' + c.body;
        delete c.body;
    }
    if (c.key) delete c.key;
    delete c.resType;
    console.log(c);
    return c;
};
//request music.163.com API
var api = function (c, callback) {
    request(setConfig(c), callback);
};

//module exports extend
v.extend(exports, {
    search: function (key, callback,args) {
        if (!key || !v.isFunction(callback)) return false;
        args = args ?
            v.extend(args, {s: key}) :
            {s: key, limit: 3};
        return api({
            resType: 'search',
            method: 'POST',
            body: args
        }, callback);
    },
    id: function (key, resType, callback, args) {
        if (!key || !v.isFunction(callback)) return false;
        if (resType === 'song' || resType === 'mv' || resType === 'lyc') {
            var idObj = resType === 'song' ? {ids: key } : {id: key};
            args = args ? v.extend(args, idObj) : idObj;
        }
        return api({
            resType: resType,
            key: key,
            method: 'GET',
            body: args || undefined
        }, callback);
    }
});
11 回复

抓包分析?用wireshark么?

@AdamsMao 欢迎使用我的模块丰富功能啊!

@zvenshy 抓包很难吧,亲:)

@chapgaga 不难啊 配合postman测试API 用不了多少时间的

@zvenshy 呵呵,为何不用firebug分析呢?

@chapgaga 我分析的客户端呀

@zvenshy wireshark抓到的数据太多,分析起来太麻烦了吧:(

@chapgaga 有筛选功能 足以快速找到所需的数据 完全不会麻烦 而且它的信息会更全 应用场景也更多 当然如果是一般网页的request浏览器插件早够用了

楼主是怎么抓取数据包的?我用fiddle2怎么截取不到网易云音乐pc客户端的数据

回到顶部