网易云音乐api整理(神坑慎入)

写在前面

云音乐api通过抓包整理,仅供开发学习使用,因此产生的纠纷与本人无关
参考:musicbox 命令行网易云音乐
npm包:netease-cloud-music-api

PS:以下未标注的均为GET方式

登陆和个人信息

POST
网易帐号登录
https://music.163.com/weapi/login/
手机登录
https://music.163.com/weapi/login/cellphone/
参数

{
  params: encText,
  encSecKey: encSecKey
}

参数部分加密很复杂。。搞了好久才搞清楚
基本的参数如下(密码需要经过md5加密)

# 如果是帐号密码,phone要改成username
{
    Text: JSON.stringify({phone:"xxx",password:"md5 hashed Data",rememberLogin:"true"})
    pubKey: 010001
    nonce: 0CoJUm6Qyw8W8jud
    modulus: 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
}

encText和encSecretKey的代码如下

aesRsaEncrypt = function (text, pubKey, modulus, nonce) {
  var secKey = createSecretKey(16);
  return {
    encText : aesEncrypt(aesEncrypt(text, nonce), secKey),
    encSecKey : rsaEncrypt(secKey, pubKey, modulus)
  }
}

上述是js实现,python实现可以看贴在最上面的参考repo
总的来说,就是有一个本地私钥secKey,十六位在本地生成,之后encText通过aes加密(AES-128-CBC,输出为base64,需要lv: 0102030405060708)生成,在通过rsa吧secKey加密作为参数一起传回

确实挺复杂的。。
返回json太长就不贴了

私人FM

http://music.163.com/api/radio/get
每次返回三首歌

用户歌单

http://music.163.com/api/user/playlist

{
  "offset": offset,
  "limit": limit,
  "uid": uid
}

歌单详情

http://music.163.com/api/playlist/detail

{"id": id}
//或者
{"ids": [id1, id2, ...]}

歌曲详情

http://music.163.com/api/song/detail

{"ids": [id1, id2, ...]}

获取歌词

http://music.163.com/api/song/media

{"id": id}

获得mp3地址

每个单曲对应一个dfsId,在获取歌曲信息时会返回,真实播放地址格式为:
http://m2.music.126.net/[encodedId]/[id].mp3
其中中间的encode函数为:

function encode(id){
  var magic = _bytearray('3go8&$8*3*3h0k(2)2');
  var song_id = _bytearray(id.toString());
  var len = magic.length;
  for(var i=0;i<song_id.length;i++){
      song_id[i] = song_id[i] ^ magic[i % len]
  }
  song_id = _bytestring(song_id);
  return Crypto.MD564(song_id).replace(/\//g, "_").replace(/\+/g, "-");
}

function _bytearray(str){
  var res = [];
  for(var i=0;i<str.length;i++){
      res.push(str.substr(i,1).charCodeAt());
  }
  return res;
}

function _bytestring(array){
  var res = "";
  for(var x in array){
      res += String.fromCharCode(array[x]);
  }
  return res;
}

喜欢歌曲

http://music.163.com/api/radio/like

{
  like: true,
  trackId: 歌曲id,
  alg: "itembased",
  time: 25
}

搜索

POST
http://music.163.com/api/search/get

{
  s: "word",            // 搜索词
  type: 1,              // 单曲(1),歌手(100),专辑(10),歌单(1000),用户(1002)
  offset: 0,            // 偏移量
  total: true,          // 是否加上总数等信息
  limit: 60             // 结果数
}

待续