鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 鬼人

[技术交流] 爬虫【很久一题】B站视频token解析

[复制链接]
发表于 2017-7-5 12:00:53 | 显示全部楼层
厉害啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-5 16:05:24 | 显示全部楼层
wei_Y 发表于 2017-7-5 11:31
继续移动端分析:

首先呢将域名改为 m.bilibili.com 请求时抓下包,随便放个移动端的UA就可以啦。

  我这里看错了。 后面群里说的BUG也是这个。  我想给大家找个js的demo的。 弄巧成拙了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 14:35:57 | 显示全部楼层
wei_Y 发表于 2017-7-5 11:31
继续移动端分析:

首先呢将域名改为 m.bilibili.com 请求时抓下包,随便放个移动端的UA就可以啦。

看了半天,我以为你是要教我们怎么获取正确的token,看到后面“不用管token也能爬”我就
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 16:04:56 | 显示全部楼层
wei_Y 发表于 2017-7-5 11:31
继续移动端分析:

首先呢将域名改为 m.bilibili.com 请求时抓下包,随便放个移动端的UA就可以啦。

有个疑问,用requests请求,不能得到网页的内容呀,用requests.get(url,headers=headers).text,打印出来就是callbackfunction({"code":40000,"message":"bad request"});并没有把网址内容爬下来呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 18:23:38 | 显示全部楼层
jerryxjr1220 发表于 2017-7-6 14:35
看了半天,我以为你是要教我们怎么获取正确的token,看到后面“不用管token也能爬”我就

解析到webpackJason这个函数后,往下找不到对应的函数了。之后就没思路了。不过真需要token时可以直接上selenium,他这个地址直接用js生成了,就在网页里。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 18:24:01 | 显示全部楼层
旋转风 发表于 2017-7-6 16:04
有个疑问,用requests请求,不能得到网页的内容呀,用requests.get(url,headers=headers).text,打印出来 ...

这个你自己多试试吧,headers写全,cookies也写上吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 18:50:50 | 显示全部楼层
wei_Y 发表于 2017-7-5 11:31
继续移动端分析:

首先呢将域名改为 m.bilibili.com 请求时抓下包,随便放个移动端的UA就可以啦。

嗯嗯,赞~~~
再补充一下,其实token就是purl_token的md5值。 u函数就是一个md5计算函数。

评分

参与人数 1荣誉 +6 鱼币 +6 贡献 +2 收起 理由
wei_Y + 6 + 6 + 2 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-7 11:23:58 | 显示全部楼层
好厉害,先Mark一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-9 17:27:21 | 显示全部楼层
json 发表于 2017-7-6 18:50
嗯嗯,赞~~~
再补充一下,其实token就是purl_token的md5值。 u函数就是一个md5计算函数。

你那里看出来的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 09:25:40 | 显示全部楼层
鬼人 发表于 2017-7-9 17:27
你那里看出来的。

版主@wei_Y已经将js分析出来了(感谢,大赞~)
token在如下找到
  1. var e = this.props.aid,
  2.                         t = this.setPurlToken(),
  3.                         n = "//api.bilibili.com/playurl?callback=callbackfunction&aid=" + e + "&page=" + this._page + "&platform=html5&quality=1&vtype=mp4&type=jsonp&token=" + t,
复制代码

由setPurlToken()函数求得,而这个函数如下:
  1. { key: "setPurlToken",
  2.                   value: function() {
  3.                     var e = Cookies.get("purl_token")
  4.                             ? Cookies.get("purl_token")
  5.                             : "";

  6.                     return e ||
  7.                             (e = "bilibili_" + Date.parse(new Date) / 1e3
  8.                                     , Cookies.set("purl_token", e, { domain: ".bilibili.com", path: "/", expires: new Date(Date.now() + 72e5), secure: !1 })
  9.                             )
  10.                             , u(e) }
  11.                   },
复制代码

由此可知
  1. purl_token = e = "bilibili_" + Date.parse(new Date) / 1e3
复制代码

而token = setPurlToken() = u(e), 这里的u在js上面有给出
  1. s = n(25),
  2.         c = n(312),
  3.         l = (n(154), n(153)),
  4.         u = n(315),
  5.         p = n(148),
  6.         d = n(134).rem2px,
复制代码

其实就是n(315), n(315)返回一个函数,返回什么函数,下个断点调试一下(第315个函数要数死人的,断点下了,然后搜索一下函数内容),发现n(315) 返回函数
  1.         e.exports = function(e, n) {
  2.           if (void 0 === e || null === e) throw new Error("Illegal argument " + e);
  3.           var o = t.wordsToBytes(a(e, n));
  4.           return n && n.asBytes ? o : n && n.asString ? i.bytesToString(o) : t.bytesToHex(o)
  5.         }
复制代码

这里重要的是a(e,n) 这个函数,在该段js上面给出
  1. function() {
  2.         var t = n(316),
  3.             o = n(317).utf8,
  4.             r = n(318),
  5.             i = n(317).bin,
  6.             a = function s(e, n) {
  7.                     e.constructor == String
  8.                             ? e = n && "binary" === n.encoding
  9.                                     ? i.stringToBytes(e)
  10.                                     : o.stringToBytes(e)
  11.                             : r(e)
  12.                                             ? e = Array.prototype.slice.call(e, 0)
  13.                                             : Array.isArray(e) || (e = e.toString());

  14.             for (
  15.                     var a = t.bytesToWords(e)
  16.                     ,c = 8 * e.length
  17.                     , l = 1732584193
  18.                     , u = -271733879
  19.                     , p = -1732584194
  20.                     , d = 271733878
  21.                     , f = 0; f < a.length; f++)
  22.                             a[f] = 16711935 & (a[f] << 8 | a[f] >>> 24) | 4278255360 & (a[f] << 24 | a[f] >>> 8);

  23.               a[c >>> 5] |= 128 << c % 32, a[(c + 64 >>> 9 << 4) + 14] = c;

  24.               for (var h = s._ff, m = s._gg, v = s._hh, y = s._ii, f = 0; f < a.length; f += 16) {
  25.                 var g = l,
  26.                     _ = u,
  27.                     b = p,
  28.                     w = d;
  29.                 l = h(l, u, p, d, a[f + 0], 7, -680876936)
  30.                 , d = h(d, l, u, p, a[f + 1], 12, -389564586)
  31.                 , p = h(p, d, l, u, a[f + 2], 17, 606105819)
  32.                 , u = h(u, p, d, l, a[f + 3], 22, -1044525330)
  33.                 , l = h(l, u, p, d, a[f + 4], 7, -176418897)
  34.                 , d = h(d, l, u, p, a[f + 5], 12, 1200080426)
  35.                 , p = h(p, d, l, u, a[f + 6], 17, -1473231341)
  36.                 , u = h(u, p, d, l, a[f + 7], 22, -45705983)
  37.                 , l = h(l, u, p, d, a[f + 8], 7, 1770035416)
  38.                 , d = h(d, l, u, p, a[f + 9], 12, -1958414417)
  39.                 , p = h(p, d, l, u, a[f + 10], 17, -42063)
  40.                 , u = h(u, p, d, l, a[f + 11], 22, -1990404162)
  41.                 , l = h(l, u, p, d, a[f + 12], 7, 1804603682)
  42.                 , d = h(d, l, u, p, a[f + 13], 12, -40341101)
  43.                 , p = h(p, d, l, u, a[f + 14], 17, -1502002290)
  44.                 , u = h(u, p, d, l, a[f + 15], 22, 1236535329)
  45.                 , l = m(l, u, p, d, a[f + 1], 5, -165796510)
  46.                 , d = m(d, l, u, p, a[f + 6], 9, -1069501632)
  47.                 , p = m(p, d, l, u, a[f + 11], 14, 643717713)
  48.                 , u = m(u, p, d, l, a[f + 0], 20, -373897302)
  49.                 , l = m(l, u, p, d, a[f + 5], 5, -701558691)
  50.                 , d = m(d, l, u, p, a[f + 10], 9, 38016083)
  51.                 , p = m(p, d, l, u, a[f + 15], 14, -660478335)
  52.                 , u = m(u, p, d, l, a[f + 4], 20, -405537848)
  53.                 , l = m(l, u, p, d, a[f + 9], 5, 568446438)
  54.                 , d = m(d, l, u, p, a[f + 14], 9, -1019803690)
  55.                 , p = m(p, d, l, u, a[f + 3], 14, -187363961)
  56.                 , u = m(u, p, d, l, a[f + 8], 20, 1163531501)
  57.                 , l = m(l, u, p, d, a[f + 13], 5, -1444681467)
  58.                 , d = m(d, l, u, p, a[f + 2], 9, -51403784)
  59.                 , p = m(p, d, l, u, a[f + 7], 14, 1735328473)
  60.                 , u = m(u, p, d, l, a[f + 12], 20, -1926607734)
  61.                 , l = v(l, u, p, d, a[f + 5], 4, -378558)
  62.                 , d = v(d, l, u, p, a[f + 8], 11, -2022574463)
  63.                 , p = v(p, d, l, u, a[f + 11], 16, 1839030562)
  64.                 , u = v(u, p, d, l, a[f + 14], 23, -35309556)
  65.                 , l = v(l, u, p, d, a[f + 1], 4, -1530992060)
  66.                 , d = v(d, l, u, p, a[f + 4], 11, 1272893353)
  67.                 , p = v(p, d, l, u, a[f + 7], 16, -155497632)
  68.                 , u = v(u, p, d, l, a[f + 10], 23, -1094730640)
  69.                 , l = v(l, u, p, d, a[f + 13], 4, 681279174)
  70.                 , d = v(d, l, u, p, a[f + 0], 11, -358537222)
  71.                 , p = v(p, d, l, u, a[f + 3], 16, -722521979)
  72.                 , u = v(u, p, d, l, a[f + 6], 23, 76029189)
  73.                 , l = v(l, u, p, d, a[f + 9], 4, -640364487)
  74.                 , d = v(d, l, u, p, a[f + 12], 11, -421815835)
  75.                 , p = v(p, d, l, u, a[f + 15], 16, 530742520)
  76.                 , u = v(u, p, d, l, a[f + 2], 23, -995338651)
  77.                 , l = y(l, u, p, d, a[f + 0], 6, -198630844)
  78.                 , d = y(d, l, u, p, a[f + 7], 10, 1126891415)
  79.                 , p = y(p, d, l, u, a[f + 14], 15, -1416354905)
  80.                 , u = y(u, p, d, l, a[f + 5], 21, -57434055)
  81.                 , l = y(l, u, p, d, a[f + 12], 6, 1700485571)
  82.                 , d = y(d, l, u, p, a[f + 3], 10, -1894986606)
  83.                 , p = y(p, d, l, u, a[f + 10], 15, -1051523)
  84.                 , u = y(u, p, d, l, a[f + 1], 21, -2054922799)
  85.                 , l = y(l, u, p, d, a[f + 8], 6, 1873313359)
  86.                 , d = y(d, l, u, p, a[f + 15], 10, -30611744)
  87.                 , p = y(p, d, l, u, a[f + 6], 15, -1560198380)
  88.                 , u = y(u, p, d, l, a[f + 13], 21, 1309151649)
  89.                 , l = y(l, u, p, d, a[f + 4], 6, -145523070)
  90.                 , d = y(d, l, u, p, a[f + 11], 10, -1120210379)
  91.                 , p = y(p, d, l, u, a[f + 2], 15, 718787259)
  92.                 , u = y(u, p, d, l, a[f + 9], 21, -343485551)
  93.                 , l = l + g >>> 0
  94.                 , u = u + _ >>> 0
  95.                 , p = p + b >>> 0
  96.                 , d = d + w >>> 0
  97.               }
  98.               return t.endian([l, u, p, d])
  99.             };
  100.         a._ff = function(e, t, n, o, r, i, a) {
  101.           var s = e + (t & n | ~t & o) + (r >>> 0) + a;
  102.           return (s << i | s >>> 32 - i) + t
  103.         },
  104.         a._gg = function(e, t, n, o, r, i, a) {
  105.           var s = e + (t & o | n & ~o) + (r >>> 0) + a;
  106.           return (s << i | s >>> 32 - i) + t
  107.         },
  108.         a._hh = function(e, t, n, o, r, i, a) {
  109.           var s = e + (t ^ n ^ o) + (r >>> 0) + a;
  110.           return (s << i | s >>> 32 - i) + t
  111.         },
  112.         a._ii = function(e, t, n, o, r, i, a) {
  113.           var s = e + (n ^ (t | ~o)) + (r >>> 0) + a;
  114.           return (s << i | s >>> 32 - i) + t
  115.         },
  116.         a._blocksize = 16,
  117.         a._digestsize = 16,

  118.         e.exports = function(e, n) {
  119.           if (void 0 === e || null === e) throw new Error("Illegal argument " + e);
  120.           var o = t.wordsToBytes(a(e, n));
  121.           return n && n.asBytes ? o : n && n.asString ? i.bytesToString(o) : t.bytesToHex(o)
  122.         }
  123.       }()
复制代码

看到a函数是不是很熟悉了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-10 10:33:50 | 显示全部楼层
json 发表于 2017-7-10 09:25
版主@wei_Y已经将js分析出来了(感谢,大赞~)
token在如下找到

     厉害。第315 个函数怎么找到的额。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 10:47:43 | 显示全部楼层
鬼人 发表于 2017-7-10 10:33
厉害。第315 个函数怎么找到的额。

当然不可能去数啊,下个断点啊
bilibili.png
然后这里就显示出来啊,js文件里面搜索关键字,找到函数。
(你那边是不是不好下断点? 因为js混淆过,可以使用fiddler神器的。)

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
鬼人 + 5 + 5 + 3 哥们,给力。

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-7-10 12:02:34 | 显示全部楼层
json 发表于 2017-7-10 10:47
当然不可能去数啊,下个断点啊

然后这里就显示出来啊,js文件里面搜索关键字,找到函数。

你断点打得是什么?  图中的第一个function 怎么找到的。请教一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 15:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表