鱼C论坛

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

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

[复制链接]
发表于 2017-7-5 12:00:53 | 显示全部楼层
厉害啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  我这里看错了。 后面群里说的BUG也是这个。  我想给大家找个js的demo的。 弄巧成拙了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

看了半天,我以为你是要教我们怎么获取正确的token,看到后面“不用管token也能爬”我就
想知道小甲鱼最近在做啥?请访问 -> 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"});并没有把网址内容爬下来呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

解析到webpackJason这个函数后,往下找不到对应的函数了。之后就没思路了。不过真需要token时可以直接上selenium,他这个地址直接用js生成了,就在网页里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个你自己多试试吧,headers写全,cookies也写上吧。
想知道小甲鱼最近在做啥?请访问 -> 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 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-7 11:23:58 | 显示全部楼层
好厉害,先Mark一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你那里看出来的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

版主@wei_Y已经将js分析出来了(感谢,大赞~)
token在如下找到
var e = this.props.aid,
                        t = this.setPurlToken(),
                        n = "//api.bilibili.com/playurl?callback=callbackfunction&aid=" + e + "&page=" + this._page + "&platform=html5&quality=1&vtype=mp4&type=jsonp&token=" + t,
由setPurlToken()函数求得,而这个函数如下:
{ key: "setPurlToken", 
                  value: function() {
                    var e = Cookies.get("purl_token") 
                            ? Cookies.get("purl_token") 
                            : "";

                    return e || 
                            (e = "bilibili_" + Date.parse(new Date) / 1e3
                                    , Cookies.set("purl_token", e, { domain: ".bilibili.com", path: "/", expires: new Date(Date.now() + 72e5), secure: !1 })
                            )
                            , u(e) } 
                  },
由此可知
purl_token = e = "bilibili_" + Date.parse(new Date) / 1e3
而token = setPurlToken() = u(e), 这里的u在js上面有给出
 s = n(25),
        c = n(312),
        l = (n(154), n(153)),
        u = n(315),
        p = n(148),
        d = n(134).rem2px,
其实就是n(315), n(315)返回一个函数,返回什么函数,下个断点调试一下(第315个函数要数死人的,断点下了,然后搜索一下函数内容),发现n(315) 返回函数
        e.exports = function(e, n) {
          if (void 0 === e || null === e) throw new Error("Illegal argument " + e);
          var o = t.wordsToBytes(a(e, n));
          return n && n.asBytes ? o : n && n.asString ? i.bytesToString(o) : t.bytesToHex(o) 
        }
这里重要的是a(e,n) 这个函数,在该段js上面给出
function() {
        var t = n(316),
            o = n(317).utf8,
            r = n(318),
            i = n(317).bin,
            a = function s(e, n) { 
                    e.constructor == String 
                            ? e = n && "binary" === n.encoding 
                                    ? i.stringToBytes(e) 
                                    : o.stringToBytes(e) 
                            : r(e) 
                                            ? e = Array.prototype.slice.call(e, 0) 
                                            : Array.isArray(e) || (e = e.toString());

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

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

              for (var h = s._ff, m = s._gg, v = s._hh, y = s._ii, f = 0; f < a.length; f += 16) {
                var g = l,
                    _ = u,
                    b = p,
                    w = d;
                l = h(l, u, p, d, a[f + 0], 7, -680876936)
                , d = h(d, l, u, p, a[f + 1], 12, -389564586)
                , p = h(p, d, l, u, a[f + 2], 17, 606105819)
                , u = h(u, p, d, l, a[f + 3], 22, -1044525330)
                , l = h(l, u, p, d, a[f + 4], 7, -176418897)
                , d = h(d, l, u, p, a[f + 5], 12, 1200080426)
                , p = h(p, d, l, u, a[f + 6], 17, -1473231341)
                , u = h(u, p, d, l, a[f + 7], 22, -45705983)
                , l = h(l, u, p, d, a[f + 8], 7, 1770035416)
                , d = h(d, l, u, p, a[f + 9], 12, -1958414417)
                , p = h(p, d, l, u, a[f + 10], 17, -42063)
                , u = h(u, p, d, l, a[f + 11], 22, -1990404162)
                , l = h(l, u, p, d, a[f + 12], 7, 1804603682)
                , d = h(d, l, u, p, a[f + 13], 12, -40341101)
                , p = h(p, d, l, u, a[f + 14], 17, -1502002290)
                , u = h(u, p, d, l, a[f + 15], 22, 1236535329)
                , l = m(l, u, p, d, a[f + 1], 5, -165796510)
                , d = m(d, l, u, p, a[f + 6], 9, -1069501632)
                , p = m(p, d, l, u, a[f + 11], 14, 643717713)
                , u = m(u, p, d, l, a[f + 0], 20, -373897302)
                , l = m(l, u, p, d, a[f + 5], 5, -701558691)
                , d = m(d, l, u, p, a[f + 10], 9, 38016083)
                , p = m(p, d, l, u, a[f + 15], 14, -660478335)
                , u = m(u, p, d, l, a[f + 4], 20, -405537848)
                , l = m(l, u, p, d, a[f + 9], 5, 568446438)
                , d = m(d, l, u, p, a[f + 14], 9, -1019803690)
                , p = m(p, d, l, u, a[f + 3], 14, -187363961)
                , u = m(u, p, d, l, a[f + 8], 20, 1163531501)
                , l = m(l, u, p, d, a[f + 13], 5, -1444681467)
                , d = m(d, l, u, p, a[f + 2], 9, -51403784)
                , p = m(p, d, l, u, a[f + 7], 14, 1735328473)
                , u = m(u, p, d, l, a[f + 12], 20, -1926607734)
                , l = v(l, u, p, d, a[f + 5], 4, -378558)
                , d = v(d, l, u, p, a[f + 8], 11, -2022574463)
                , p = v(p, d, l, u, a[f + 11], 16, 1839030562)
                , u = v(u, p, d, l, a[f + 14], 23, -35309556)
                , l = v(l, u, p, d, a[f + 1], 4, -1530992060)
                , d = v(d, l, u, p, a[f + 4], 11, 1272893353)
                , p = v(p, d, l, u, a[f + 7], 16, -155497632)
                , u = v(u, p, d, l, a[f + 10], 23, -1094730640)
                , l = v(l, u, p, d, a[f + 13], 4, 681279174)
                , d = v(d, l, u, p, a[f + 0], 11, -358537222)
                , p = v(p, d, l, u, a[f + 3], 16, -722521979)
                , u = v(u, p, d, l, a[f + 6], 23, 76029189)
                , l = v(l, u, p, d, a[f + 9], 4, -640364487)
                , d = v(d, l, u, p, a[f + 12], 11, -421815835)
                , p = v(p, d, l, u, a[f + 15], 16, 530742520)
                , u = v(u, p, d, l, a[f + 2], 23, -995338651)
                , l = y(l, u, p, d, a[f + 0], 6, -198630844)
                , d = y(d, l, u, p, a[f + 7], 10, 1126891415)
                , p = y(p, d, l, u, a[f + 14], 15, -1416354905)
                , u = y(u, p, d, l, a[f + 5], 21, -57434055)
                , l = y(l, u, p, d, a[f + 12], 6, 1700485571)
                , d = y(d, l, u, p, a[f + 3], 10, -1894986606)
                , p = y(p, d, l, u, a[f + 10], 15, -1051523)
                , u = y(u, p, d, l, a[f + 1], 21, -2054922799)
                , l = y(l, u, p, d, a[f + 8], 6, 1873313359)
                , d = y(d, l, u, p, a[f + 15], 10, -30611744)
                , p = y(p, d, l, u, a[f + 6], 15, -1560198380)
                , u = y(u, p, d, l, a[f + 13], 21, 1309151649)
                , l = y(l, u, p, d, a[f + 4], 6, -145523070)
                , d = y(d, l, u, p, a[f + 11], 10, -1120210379)
                , p = y(p, d, l, u, a[f + 2], 15, 718787259)
                , u = y(u, p, d, l, a[f + 9], 21, -343485551)
                , l = l + g >>> 0
                , u = u + _ >>> 0
                , p = p + b >>> 0
                , d = d + w >>> 0 
              }
              return t.endian([l, u, p, d]) 
            };
        a._ff = function(e, t, n, o, r, i, a) {
          var s = e + (t & n | ~t & o) + (r >>> 0) + a;
          return (s << i | s >>> 32 - i) + t 
        }, 
        a._gg = function(e, t, n, o, r, i, a) {
          var s = e + (t & o | n & ~o) + (r >>> 0) + a;
          return (s << i | s >>> 32 - i) + t 
        }, 
        a._hh = function(e, t, n, o, r, i, a) {
          var s = e + (t ^ n ^ o) + (r >>> 0) + a;
          return (s << i | s >>> 32 - i) + t 
        }, 
        a._ii = function(e, t, n, o, r, i, a) {
          var s = e + (n ^ (t | ~o)) + (r >>> 0) + a;
          return (s << i | s >>> 32 - i) + t 
        },
        a._blocksize = 16, 
        a._digestsize = 16, 

        e.exports = function(e, n) {
          if (void 0 === e || null === e) throw new Error("Illegal argument " + e);
          var o = t.wordsToBytes(a(e, n));
          return n && n.asBytes ? o : n && n.asString ? i.bytesToString(o) : t.bytesToHex(o) 
        } 
      }()
看到a函数是不是很熟悉了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

     厉害。第315 个函数怎么找到的额。
想知道小甲鱼最近在做啥?请访问 -> 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 哥们,给力。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

你断点打得是什么?  图中的第一个function 怎么找到的。请教一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 11:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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