[PHP]网易云音乐params计算及直链提取

      发布在:未分类      评论:0 条评论

在这种之前 写过一个音乐助手 集齐了主流音乐网站的web解析接口 但是这些接口提供的音乐的质量都不高 只有个别网站能够提供较高音质的音乐。在开发过程中想到了 网易云音乐 但是通过实际抓包操作发现网易云音乐对参数实行了AES和RSA加密 从而无法得到真实的数据。后来通过参考网上的文档以及各路大神的分析 大多都提供的python的实例PHP的却很少。


通过参考 知乎用户 @平胸小仙女【如何爬网易云音乐的评论数?】的回答得到了一些重要信息。

通过上面的大神的完整分析 知道了其参数paramsencSecKey是存在必要联系 一个是使用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 唯一丶 <public@wonlycms.com>
 * @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));

Responses