切换风格

默认晚霞 雪山 粉色心情 伦敦 花卉 绿野仙踪 加州 白云 星空 薰衣草 城市 简约黑色 简约米色 龙珠
回复 0

3837

主题

3838

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
12790
网易云音乐热评api[复制链接]
发表于 2022-5-24 20:14:05 | 显示全部楼层 |阅读模式

网上大部分是python版本的今天鼓捣啦个php的
网易云音乐的爬虫主要难点是params,encSecKey这两个参数算法
参考项目:https://github.com/ljhe/GetWangYiYunComments
如果帮助到你就评论下吧!
可以的话支持一些回复啥的
<?php

/*

* Title:网易云热评

* auth:尹深

* QQ:1247333542

*/

class Hot_review

{


      public function Get_comments($songid)

      {

              // 设置请求头

              $headers = array(

                    'Accept:*/*',

                    'Accept-Language:zh-CN,zh;q=0.9',

                    'Connection:keep-alive',

                    'Content-Type:application/x-www-form-urlencoded',

                    'Host:music.163.com',

                    'Origin:https://music.163.com',

                    // 模拟浏览器设置 User-Agent ,否则取到的数据不完整

                    'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'

              );

              // 拼接歌曲的url

              $url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_' . $songid . '?csrf_token=';

              // 拼接加密 params 用到的第一个参数

              $first_param = '{"rid":"R_SO_4_' . $songid . '","offset":"0","total":"true","limit":"20","csrf_token":""}';

              $data = array('params' => $this->aesGetParams($first_param), 'encSecKey' => $this->getEncSecKey());

              $htmlInfo = $this->httpPost($url, $headers, http_build_query($data));



              $htmlInfo= $this->str_change($htmlInfo);

              $arr = ["comments" => $htmlInfo["comments"], "hotComments" => $htmlInfo["hotComments"]];

              echo json_encode($arr, 448);

      }

      /**

         * 将字符串转换为对象再转换为数组(升级版,通用)

         *

         * @param      string      $data      字符串

         * @Return      array      返回数组格式,如果,data为空,则返回空数组

         */

      private function str_change($data) {

              //去除一个字符串两端空格,

              $data=trim($data);

              //解码

              $data=json_decode($data,true);

              return $data;

      }





      /**

         *    加密获取params

         * @param $param // 待加密的明文信息数据

         * @param string $method // 加密算法

         * @param string $key // key

         * @param string $options // options 是以下标记的按位或: OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING

         * @param string $iv // 非 NULL 的初始化向量

         * @return string

         *

         * $key 在加密 params 中第一次用的是固定的第四个参数 0CoJUm6Qyw8W8jud,在第二次加密中用的是 js 中随机生成的16位字符串

         */

      private function aesGetParams($param, $method = 'AES-128-CBC', $key = 'JK1M5sQAEcAZ46af', $options = '0', $iv = '0102030405060708')

      {

              $firstEncrypt = openssl_encrypt($param, $method, '0CoJUm6Qyw8W8jud', $options, $iv);

              $secondEncrypt = openssl_encrypt($firstEncrypt, $method, $key, $options, $iv);

              return $secondEncrypt;

      }



      /**

         *    encSecKey 在 js 中有 res 方法加密。

         *    其中三个参数分别为上面随机生成的16为字符串,第二个参数 $second_param,第三个参数 $third_param 都是固定写死的,这边使用抄下来的一个固定 encSecKey

         * @return bool

         */

      private function getEncSecKey()

      {

              $getEncSecKey = '2a98b8ea60e8e0dd0369632b14574cf8d4b7a606349669b2609509978e1b5f96ed8fbe53a90c0bb74497cd2eb965508bff5bfa065394a52ea362539444f18f423f46aded5ed9a1788d110875fb976386aa4f5d784321433549434bccea5f08d1888995bdd2eb015b2236f5af15099e3afbb05aa817c92bfe3214671e818ea16b';



              return $getEncSecKey;

      }



      /**

         * curl 发送 post 请求

         * @param $url

         * @param $header

         * @param $data

         * @return mixed

         */

      private function httpPost($url, $header, $data)

      {

              $ch = curl_init();

              curl_setopt($ch, CURLOPT_URL, $url);

              curl_setopt($ch, CURLOPT_POST, true);

              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

              curl_setopt($ch, CURLOPT_HEADER, 0);                          // 0不带头文件,1带头文件(返回值中带有头文件)

              curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

              curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);              // 对认证证书来源的检查

              curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);              // 使用自动跳转

              curl_setopt($ch, CURLOPT_AUTOREFERER, 1);                   // 自动设置Referer

              curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);              //设置等待时间

              curl_setopt($ch, CURLOPT_TIMEOUT, 30);                        //设置cURL允许执行的最长秒数

              $content = curl_exec($ch);

              curl_close($ch);

              return $content;

      }

}

$_GET["songid"]="1450163801";

if ($_GET["songid"]==null){

      echo "音乐id不可为空";

}else{

      $a=new Hot_review();

      $a->Get_comments($_GET["songid"]);

}




复制代码

代码附下:
201404w8vq8vvpisiuzh4v.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|不懂 ( 粤ICP备14042591号-1 )|网站地图

GMT+8, 2024-11-22 19:33 , Processed in 0.084187 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部