在这种之前 写过一个音乐助手 集齐了主流音乐网站的web解析接口 但是这些接口提供的音乐的质量都不高 只有个别网站能够提供较高音质的音乐。在开发过程中想到了 网易云音乐 但是通过实际抓包操作发现网易云音乐对参数实行了AES和RSA加密 从而无法得到真实的数据。后来通过参考网上的文档以及各路大神的分析 大多都提供的python的实例PHP的却很少。
通过参考 知乎用户 @平胸小仙女 在【如何爬网易云音乐的评论数?】的回答得到了一些重要信息。
通过上面的大神的完整分析 知道了其参数
params
和encSecKey
是存在必要联系 一个是使用AES
加密(需要填充)
另一个则采用了RSA
对参数进行了混淆加密。然而通过开发者的调试找到相关函数function d(d, e, f, g)
和分析后明白了这个加密params
先使用key
加密后再使用一个随机数i
进行加密,然而参数encSecKey
则是相对于随机数i
进行生成的 也就是说i
不变的话encSecKey
也就不会发生变化。
在此之后 参考了 Github 用户 @darknessomi 的项目 MusicBOX 的虽然这个项目是Python写的 但是也不太影响 经过对代码的阅读后。上手开始使用PHP对算法进行仿写并使用chrome断点实时调试。
一次加密:关于
params
参数的AES用到的
填充。因为个人对加密解密这块没什么研究所以只能根据现有的Python代码揣测。
16-len(text)%16解释为 使用16减去params原文余16。根据PHP写出对应的代码。算出来后再通过
chr()`传入结果取出ASCII的对应字符,并使用函数进行重复 ,重复次数为上面的结果。 之后再使用key对其进行第一次加密。
二次加密:对上面加密后的结果进行加密,key是一个随机数但是这个随机数只要一固定下来 encSecKey 也就不用去算了 所以直接固定掉这个随机数 不必再做 encSecKey 的计算。
对params
计算完成后通过测试和chrome断点计算的一模一样 至此就算完成了。
其实在这之前有尝试过两次直接分析js但是由于一些因素都放弃了 。没想到这次带来了意外的成功 非常感谢 知乎的 @平胸小仙女 、以及 Github的@darknessomi。
Notes: 这些代码可能不能在
PHP 5.4.0
以下的版本中工作。下载地址 :NetEase.php(1.68 KB)
<?php
/**
* @name 网易云音乐 ID解析直链
* @author 唯一丶 <[email protected]>
* @version 1.0
* @date 2107-11-13
* @Documented 根据注释修改云音乐id即可。参考实例: https://github.com/darknessomi/musicbox/ 非常感谢。
*/
(PHP_VERSION < '5.4.1') && die('The object is not available. Please check the version of PHP you are using.');
function NetEaseMusicAES($text,$key){
$iv = '0102030405060708';
$text = trim($text);
$pad = 16-strlen($text)%16;
$chr = chr($pad);
$text = $text.str_repeat($chr,$pad);
$enStr = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$text,MCRYPT_MODE_CBC,$iv);
$enStr = base64_encode($enStr);
return $enStr;
}
$key = '0CoJUm6Qyw8W8jud';
$text = '{"ids":"[5280317]","br":128000,"csrf_token":""}';//ids的值为网易云音乐中音乐的id 其他不变
$module = 'dcf734dbca8108164eb3b237f79b1945fbd63232c3d6b84aeef5c15ab5dad28fbc30bb3aa1ef9484b7a0ec69dcc85d4c77bda1f9d788713d730f6cee31b9d8a8302791b95822a60d51681cd9fd74043aa0d50a57707190db6ff59658034066286754a1bb0c2a3253c3fcf2dab7b4be9d33f62507c1ad3dd78561c75a69b5191f';
$enStr = NetEaseMusicAES($text,$key);
$key2 = 'wbPl0UucSzEeGlKO';
$params = NetEaseMusicAES($enStr,$key2);
$url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token=';
$data['params'] = $params;
$data['encSecKey'] = $module;
$data = http_build_query($data);
function _Curl($url,$post_data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
var_dump(_Curl($url,$data));