爬虫和网易云音乐API的一次尝试
最近有空,在好友的呼唤下,帮助他做一个爬取网易云音乐排行榜信息的小程序,收获颇多.
进入网易云官网.F12
打开后发现网易云的API,参数被加密:
对前端不太熟,也无从下手,只知道这个信息很重要,多亏了 百度一下 ,找到了很多陈旧的博客,有了些许蛛丝马迹.
多数用python去写,经过一些尝试,确定了不少可用的api接口,但是数据大多数不是不完整就是不正确,特别是音乐的下载链接,
那就一个网络上都是复制一个人的东西.
后来我看见一种全新的尝试方式,通过拦截前端调用的JS,本地调试.(我不会前端,对于我来说还是挺新奇的.)
大概方式如下:
1. 下载 Fiddler.exe ( http代理)
2. 进入网易云音乐官网 F12 - network - js ,找到core.js ,下载到本地.
3.fidedle - AutoResponder - Add rule
以上三步, 即可完成使用本地JS文件.
可是,这个文件是进过混淆的,你让我格式化排版 一行行看我也是可能.更何况JS不熟.
我就百度呗. 终于找到一点眉目. 一个关键词- windos.asrsea
这个普遍出现在别人的论坛博客中.我就试着搜~
结果 还真有, 然后我看了看这个d函数,哎嘿,我看不懂 什么七七八八的东西,很绕~
继续百度 ,知道了一些有趣的事情:
很多人分析这个函数是用来加密参数的,甚至分析出这个函数的各种语言版本.
我尝试了下 java的 和c# 的代码加密参数.~发现出来之后的格式样子还是有差别的.
所以,我想 为什么我要自己改写,为什么我不能直接调用? -‘js脚本 python调用’
我猜想并寻找, 真的可以 ,顺便写了几个例子玩儿,大概会用了.
Python - execjs
用它就行.
加密是完成了. 但是 加密什么东西呢?
我们有它的JS文件,我试着打印LOG . 我能想到很多地方,我时不想看代码的,人很笨也比较懒惰.
在 windos.asrsea 被调用的哪一部分, 会传入 一段 URL的后缀 以及http请求的param.
最后,
params = encText
encSecKey = encSecKey .
http请求头 必须带上两个信息:
Host:
music.163.com
Referer:
http://music.163.com/
还有一些其他有趣的东西,比如 广告植入 支付加密等 ,比较绕 不是太清楚,而且 大概上午 和 下午的JS混淆的不同,但是总的来说就2-3个core.JS文件
只是 混淆的单词不同,内容逻辑是一样的. 为什么上午的JS 到了下午不能用,我猜测 和 另外一个ga.js push.js 有关.不过无关紧要.
下面是 我找到的一些接口和参数打印的日志:
获取歌曲信息
{csrf_token: "fd1acbd02cc87df18472e5ecf775d12b"}
http://music.163.com/api/v3/song/detail?id=418603077&c=[{"id":"418603077"}]
Post请求
特别说明下:
Csrf_token 这个值,似乎是从 js框架NEJ ,读取的一个固定值,但是有时候 同一台机器的这串值不同. 我在试验中发现,这个竟然可以为空.
用户登陆:
http://music.163.com/weapi/login
{username:"[email protected]",password:"85ba959c3bd635ee3e36eb627396a901",rememberLogin:"true",clientToken:"1_p6TngU67yeLbMmO6twZD0LG15hjOyDWo_iRZrSsAyAHKR+yLFk+BCgIXY3mEjgrYw",csrf_token:"9b213a0d047c0bf18b3e345fd8ce42cb"}
密码是 被MD5加密了.
获取评论
http://music.163.com/weapi/v1/resource/comments/R_AL_3_18903
{rid: "R_AL_3_18903", offset: "0", total: "true", limit: "20", csrf_token: "fd1acbd02cc87df18472e5ecf775d12b"}
模糊查询
http://music.163.com/weapi/search/suggest/multimatch
{s: "短发", csrf_token: "932a0858c7ea7678bbccb97b0d75f4fe"
...
还有更多 我不想一一成列了,我写了两个demo ,可直接运行,
1 直接抓取排行榜 热门歌曲的信息并下载歌曲 歌词等.
GITHUB : https://github.com/15608447849/music_pick
2 可查询下载歌曲, MV 无损音乐.
GITHUB:https://github.com/15608447849/music_download
百度云盘: https://pan.baidu.com/s/1o8KawuI
这次尝试,对于’爬虫’这个词有了新的认识,也发现的前端JS的不安全性.
对于python ,越来越觉得 方便简单快捷.
其实 很多时间,都是在尝试打印JS中的对象和数据.
最开始我只是想通过分析 HTML节点拿到数据,之前做过 数据爬虫 抓取
银行数据, 获取是 银行开发不能联网,并且很多不能用开源框架,很多做法都是比较简单,页面数据静态化,没有ajax等.及时有,也能分析出接口 ,拿出数据(不包括重要的信息,多数没有加密).
这次尝试中, 我也一度想研究下AES什么的加密,但是还是没这个时间.
记录下点点滴滴,记录下一些回忆.毕竟,编程= 不进则退.
做一个有梦想的年轻人.