回顾和概览

在 爬取网易云音乐个人动态中的视频(Ⅰ) 中简单的分析了一下需要做什么, 现在要做的就是获取网易云的api, 很遗憾, 网易云并没有开放api出来, 但是我们可以对网页进行调试, 尝试从中获得我们需要的信息.

参考

  1. 网易云音乐JS下的AES加密参数-分析
  2. 网易云音乐新登录API分析

为什么已有两篇分析我还要自己再写一篇呢?

原因有二:

  1. 两篇分析对我来说还不足够详细
  2. 看完两篇分析之后, 是我第一次使用断点调试js, 所以想详细记录下来, 当作笔记

开始

从 爬取网易云音乐个人动态中的视频(Ⅰ) 中, 我们发现api(http://music.163.com/weapi/cloudvideo/playurl)中参数有两个 params 和 encSecKey, 加密肯定是通过js驱动的, 所以, 在网易云网页的js上搜索可能会有所发现.

还是在 爬取网易云音乐个人动态中的视频(Ⅰ) 中提到的 视频网页 上进行分析, 可能第一次打开这个网页会出现如下图的情况

刷新一遍, 就有我们需要的core.js文件了:

分析core.js

点击打开这个core.js, 你会发现js代码都没有缩进, 很难看, 点击一下页面的"{}", Chrome浏览器会对其进行格式化并在新窗口打开这个格式化后的core.js, 如下图

    

搜索字符串"encSecKey", 可以看到有3个匹配, 逐一查看, 在第二个查找结果中发现这和 爬取网易云音乐个人动态中的视频(Ⅰ) 中提到的参数很像

仔细看看encSecKey所在的这个function

(function() {var c7f = NEJ.P, eq9h = c7f("nej.g"), v7o = c7f("nej.j"), k7d = c7f("nej.u"), Ua2x = c7f("nm.x.ek"), l7e = c7f("nm.x");if (v7o.bk8c.redefine)return;window.GEnc = true;var brX9O = function(crL1x) {var m7f = [];k7d.bd7W(crL1x, function(crK1x) {m7f.push(Ua2x.emj[crK1x])});return m7f.join("")};var crH1x = v7o.bk8c;v7o.bk8c = function(Y7R, e7d) {var i7b = {}, e7d = NEJ.X({}, e7d), lL1x = Y7R.indexOf("?");if (window.GEnc && /(^|\.com)\/api/.test(Y7R) && !(e7d.headers && e7d.headers[eq9h.yH5M] == eq9h.Ht7m) && !e7d.noEnc) {if (lL1x != -1) {i7b = k7d.hf0x(Y7R.substring(lL1x + 1));Y7R = Y7R.substring(0, lL1x)}if (e7d.query) {i7b = NEJ.X(i7b, k7d.fJ9A(e7d.query) ? k7d.hf0x(e7d.query) : e7d.query)}if (e7d.data) {i7b = NEJ.X(i7b, k7d.fJ9A(e7d.data) ? k7d.hf0x(e7d.data) : e7d.data)}i7b["csrf_token"] = v7o.gI0x("__csrf");Y7R = Y7R.replace("api", "weapi");e7d.method = "post";delete e7d.query;var bRB5G = window.asrsea(JSON.stringify(i7b), brX9O(["流泪", "强"]), brX9O(Ua2x.md), brX9O(["爱心", "女孩", "惊恐", "大笑"]));e7d.data = k7d.cz8r({params: bRB5G.encText,encSecKey: bRB5G.encSecKey})}crH1x(Y7R, e7d)};v7o.bk8c.redefine = true
}
)();

一个关键的语句是

window.asrsea(JSON.stringify(i7b), brX9O(["流泪", "强"]), brX9O(Ua2x.md), brX9O(["爱心", "女孩", "惊恐", "大笑"]));

这个brX90在这可能是一个拼接字符串的作用, 因为这个函数里面有push和join这两个关键字

window.asrsea的定义不在这里面, 搜索"window.asrsea", 如下图

到现在我们可以确定, window.asrsea就是我们需要的东西, 是大boss!

仔细看看window.asrsea所在的函数

!function() {function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}function b(a, b) {var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, {iv: d,mode: CryptoJS.mode.CBC});return f.toString()}function c(a, b, c) {var d, e;return setMaxDigits(131),d = new RSAKeyPair(b,"",c),e = encryptedString(d, a)}function d(d, e, f, g) {var h = {}, i = a(16);return h.encText = b(d, g),h.encText = b(h.encText, i),h.encSecKey = c(i, e, f),h}function e(a, b, d, e) {var f = {};return f.encText = c(a + e, b, d),f}window.asrsea = d,window.ecnonasr = e
}();

函数d实际是去调用两个加密函数(AES加密函数b和RSA加密函数c)对传入的参数进行加密, 进行分析, 大致逻辑如下:

  1. 调用函数a生成一个16位随机数i;
  2. 调用函数b, 加密d(后文可知这是四个参数值唯一可变的), 得到encText
  3. 调用函数b, 加密步骤2得到的encText, 得到新的encText
  4. 调用函数c, 得到encSecKey

这样就得到api(http://music.163.com/weapi/cloudvideo/playurl)中所需要的params(encText)和encSecKey(encSecKey)了

断点分析

在上图中的红框处的 var h = {} 也即12828行, 点击行号设置一个断点, 在右侧的Watch窗口新建一个观察, 填入"window.asrsea", 如下图

然后, 刷新页面, 如下图, 我们就获得了window.asrsea中所需的3个固定参数(图中的参数1, 2, 3), 但是图中参数0到底怎样的还需要商榷

看回Network, 如下图, 点击XHR进行一下过滤, 没发现我们需要的东西

现在我们继续执行调试, 可以按F8, 也可以点击下图红框处

看回Source和Network

   

虽然Source中的Watch没怎么变, 但是在这里我们可以确定图中的参数1, 2, 3都是定值. 从Network可以看出第一次的window.asrsea值是给 http://music.163.com/weapi/cdns 所用的.

重复上述过程, 每次都要去Network看看网络请求, 不要点击太快, 不然又要重来一次调试, 可以把每次Source都截图下来, 方便再次查看.

下图是最后一次调试的Network, 到这就要小心了, 不要继续调试了

下图是Source界面, 把鼠标放在图中参数0的位置, 以防看漏了参数

继续调试, 页面正常运行, 看回Network, 如下图

据此, 可以肯定api(http://music.163.com/weapi/cloudvideo/playurl)需要4个参数, 其中后三个参数是定值, 第一个参数由ids, resolution, csrf_token组成

0: {"ids":"[\"5B0AF067CBB42F7789F7B97E13827565\"]","resolution":"720","csrf_token":""}
1: 010001
2: 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
3: 0CoJUm6Qyw8W8jud

实现加密

在 网易云音乐新登录API分析 一文中, 作者对加密进行了实现, 作者的最新代码在 encrypt.py 中可查看

爬取网易云音乐个人动态中的视频(Ⅱ): 分析并获取api相关推荐

  1. 爬取网易云音乐个人动态中的视频(Ⅰ): 分析

    前言 在某天下午, 我愉快的刷着云村哈哈, 很欢乐, 无意看到我所关注的一位 音乐人 说要下架他(她)所创作的所有电台, 我想着会不会以后动态里的视频也要删除呢? 刚好很久没有写过爬虫的代码了, 于是 ...

  2. 爬取网易云音乐个人动态中的视频(Ⅲ): 实现爬取过程

    回顾 有了 爬取网易云音乐个人动态中的视频(Ⅰ) 和 爬取网易云音乐个人动态中的视频(Ⅱ) 的铺垫, 编写爬虫的代码便显得没那么突出了. 实现 直接show代码! 给出加密的代码 encrypt_ap ...

  3. Selenium解决动态渲染页面----爬取网易云音乐全部评论

    爬取网易云音乐全部评论,我们先随便找一首歌,这里以毛不易的水乡为例.毛不易–水乡 一.常规方法 1. 尝试直接爬取 先直接用歌曲链接直接爬取 import requests#URL url = 'ht ...

  4. python爬虫爬取网易云音乐歌曲_Python网易云音乐爬虫进阶篇

    image.png 年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了- 思 ...

  5. [爬虫]Python爬取网易云音乐搜索并下载歌曲!

    Python爬取网易云音乐搜索并下载歌曲! 文章目录 Python爬取网易云音乐搜索并下载歌曲! 1.准备工作 2."实地"观察 3.开始码代码! 4.搜索并下载 结束语 1.准备 ...

  6. Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 作者:阿里波特 来源:CSDN Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 h ...

  7. python爬音乐评论生成词云图_python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  8. python网易云_用python爬虫爬取网易云音乐

    标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去.按键盘F12打开网页调试工具,点击Ne ...

  9. python爬虫之爬取网易云音乐的歌曲图片和歌词

    0.目录 1.分析页面 2.获取歌曲的id 3.获取歌曲信息 4.获取歌曲图片url 5.获取歌词 6.总结 7.完整代码 1.分析页面 这一次我们来爬取网易云音乐,爬取歌单内的所有歌曲的图片和歌词, ...

最新文章

  1. 如何最大限度提高.NET的性能
  2. Scala 语言之模式匹配(6)
  3. [渝粤教育] 盐城师范学院 光学 参考 资料
  4. 女人的安全感到底是什么?
  5. 算法四:回溯和分支界定
  6. 蒜头君的生日(日期格式)
  7. 云服务器发送开锁信息给单车,云服务器发送开锁信息给单车
  8. Clip_by_norm 函数理解
  9. 10款最佳SQL Server服务器监控工具
  10. 使用MACD指标在上证指数000001.SH上开发单边多头策略
  11. 大数据 - MapReduce编程案例 -BH3
  12. 【黄啊码】解决微信小程序showToast不显示
  13. 兼职程序员可以从什么平台接私活?
  14. 2.8.5Django --3 WEB框架
  15. Sun Jan 05 2020 00:00:00 GMT 0800 (中国标准时间) 时间转换为 2020-01-05 08:00:00
  16. 微信小程序——微信小程序分包
  17. amd兼容AM3服务器cpu型号,兼容性超强的AM2/AM2+/AM3接口_主板新闻-中关村在线
  18. 推荐一部不错的电影 《当幸福来敲门》
  19. 重学 Java 设计模式:实战桥接模式「多支付渠道(微信、支付宝)与多支付模式(刷脸、指纹)场景」
  20. k8s 1.23 使用 helm3部署traefik2

热门文章

  1. 第22章 迈向Spring MVC的旅程
  2. 仿写爱奇艺网页的问题和解决方法
  3. 一、入门Python第一课
  4. C++实现拼音字符串切分的函数
  5. 哈罗单车确认完成新一轮几十亿融资 春华资本与蚂蚁金服领投
  6. 杀不死的人狼——我读《人月神话》(三)
  7. 推荐2个适合程序员使用的显示器
  8. 解决微博SDK接入全平台支持
  9. 发现一个免费虚拟主机和云服务器的网站
  10. CDN工作过程及工作原理