鱼C论坛

 找回密码
 立即注册
查看: 11071|回复: 32

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

[复制链接]
发表于 2017-7-3 14:09:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鬼人 于 2017-7-3 16:17 编辑

我希望我的题目以后能被大家写在爬虫的简历上。
觉得鱼C题目太容易的,爬虫技术感觉没练手的。 来玩玩呗。
题目:打开B站 任意一个视频链接,然后找到图中这个链接的地址。 在js中找到token的生成方式,可写出代码也可说出解析步骤。
主要js代码 请截图发帖子下面
做完这个解析,你可以开始写哔哩哔哩的整站视频爬虫了。
如果基础不好的,请看下这个帖子。 有道翻译的详细解析过程。
http://www.jianshu.com/p/e45511bcd001   

找到图中的token生成方式就行了

找到图中的token生成方式就行了

本帖被以下淘专辑推荐:

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

使用道具 举报

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

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

360截图20170705113219974.jpg

随便点进一个,然后审查元素。先搜一下token

360截图20170705113348847.jpg

是一个js的标签。然后将抓包工具设置为js也会被抓取,
刷新这个页面

360截图20170705113521064.jpg
然后发现并不是一开始就有的,那肯定是在某个js中。
逐一测试发现存在于
http://s1.hdslb.com/bfs/static/mult/videoPage-1407103689.js
360截图20170705113650678.jpg
这个js中。
token的生成方式是
setPurlToken()
顺着找过去
  1.                     key: 'setPurlToken',
  2.                     value: function() {
  3.                         var e = Cookies.get('purl_token') ? Cookies.get('purl_token') : '';
  4.                         return e || (e = 'bilibili_' + Date.parse(new Date) / 1000, Cookies.set('purl_token', e, {
  5.                             domain: '.bilibili.com',
  6.                             path: '/',
  7.                             expires: new Date(Date.now() + 7200000),
  8.                             secure: !1
  9.                         })),
  10.                         u(e)
  11.                     }
复制代码


由于不太会js,在控制台试了一下,return 1 || 2, 3时返回值是3.
所以token是经过 u函数计算过的。u在上面发现是一个n(315);生成的,而n是一个参数。
继续找webpackJason函数,是在http://s1.hdslb.com/bfs/static/mult/vendor-1407103689.js这个js中。
截取一段在控制台跑跑看返回t(e)..这基本断掉了。

返回看上面的生成方式,是先获取cookies中的purl_token,如果没有就根据当前时间设置一个。在一开始的测试中,主站是没有返回这个purl_token的,然后删除cookies中的purl_token后,刷新后又自动创建了一个,这时同一个token发生了变化,what?那显然token不是这个视频的唯一索引值。

token什么用也不知道,但不是索引值后那就好办些了。

删除token试一下,
幸运的直接返回了正确的地址。
  1. http://api.bilibili.com/playurl?callback=callbackfunction&aid=8118298&page=1&platform=html5&quality=1&vtype=mp4&type=jsonp
复制代码

360截图20170705114447398.jpg

也就是说只更换aid,也是av号后一样可以返回该av号正确的视频地址。拖进迅雷可以直接下载。
也就是说,不用管它的token。。

爬虫思路:
0. 获取av号, 使用requests。
1. 更换该地址的av号。
  1. [code]http://api.bilibili.com/playurl?callback=callbackfunction&aid=8118298&page=1&platform=html5&quality=1&vtype=mp4&type=jsonp
复制代码
[/code]
2. 提取出里面的url。使用requests请求后用正则提取。或者其他简便方法。
3. 保存后待下载。

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

使用道具 举报

发表于 2017-7-3 14:32:55 | 显示全部楼层
厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-3 14:48:41 | 显示全部楼层

客官来玩玩呗。    对的给最佳。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-3 14:54:20 | 显示全部楼层
宛如我头像
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-3 15:02:45 | 显示全部楼层
找到生成方式是什么鬼?找到生产方式的机制有什么作用么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-3 15:02:45 | 显示全部楼层

开始没描述清楚,不好意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-3 15:06:10 | 显示全部楼层
~风介~ 发表于 2017-7-3 15:02
找到生成方式是什么鬼?找到生产方式的机制有什么作用么?

这个用来生成 哔哩哔哩播放器链接的地址关键参数cid 得到cid之后可以构造播放器的地址,等于可以存这个链接来访问这个视频…… 而且不会失效
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-3 15:10:33 | 显示全部楼层
鬼人 发表于 2017-7-3 15:06
这个用来生成 哔哩哔哩播放器链接的地址关键参数cid 得到cid之后可以构造播放器的地址,等于可以存这个链 ...

有意思,俺看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-3 22:54:55 | 显示全部楼层
楼主,其实我一直有个问题,就是有道词典的SIGN值的JS文件,你们到底怎么分析出来的?
是一定要懂JS代码才能分析是吗?
反正我看到那一行代码真的是看不出来什么东西,只是知道跟几个值有关
还有,我用谷歌浏览器F12看到的哪个关于sign值的JS代码是很长很长一行的,这是网站故意把代码都写在一行来增加解析难度是吗?
我看了你的简书的教程,但是你把这个分析sign的JS代码的过程省略了,我觉的这个地方才是最关键的点。
有空的话,可以来个图文并茂的讲解么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-3 22:57:12 | 显示全部楼层
另外,我爬QQ空间和微博的时候其实也都是遇到了相同的问题,都是有一个关键的参数需要去JS代码种找解析的方法,虽然网上也有教程,但是大多数都是把结果直接拿来用,并没有一步一步去解析JS代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-3 23:14:28 | 显示全部楼层
gopythoner 发表于 2017-7-3 22:54
楼主,其实我一直有个问题,就是有道词典的SIGN值的JS文件,你们到底怎么分析出来的?
是一定要懂JS代码才 ...

问题问到点了。  第一步开头的分析没有写怎么开始解析这个加密字段。 因为这差不多就是熟能生巧的一种手段罢了。我也实在不好怎么解释怎么开头找那个。 如果你找到那个有解密这个字段的js之后的内容我都跟你说了。
这种手段多自己去尝试一下。网上并不会有这种教程的,只会有答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-4 09:36:56 | 显示全部楼层
32269100 发表于 2017-7-4 09:27
目前从两个js文件里面找到两个潜在的线索:
1:

不错。 值得鼓励找到入口了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-4 11:38:51 | 显示全部楼层

是哒,目前没错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-4 14:11:43 | 显示全部楼层
如何让他判断成html5平台?

一直被判断成pc平台给出的地址是:
由:
  1. https://interface.bilibili.com/playurl?cid=18913328&appkey=84956560bc028eb7&otype=json&type=&quality=80&qn=80&sign=412a7ac052f645d90c90dc088dc0f42c
复制代码

这个地址的返回值有视频地址的链接:
  1. {"from":"local","result":"suee","format":"flv","timelength":98034,"accept_format":"flv,hdmp4,mp4","accept_quality"
  2. :[80,48,16],"seek_param":"start","seek_type":"offset","durl":[{"order":1,"length":98034,"size":23534027
  3. ,"url":"http://tx.acgvideo.com/d/8b/18913328-1.flv?txTime=1499157014&platform=pc&txSecret=ddf6b9f0548f8c63b965ca1d6921635d
  4. &oi=3056288324&rate=1280000","backup_url":["http://tx.acgvideo.com/d/8b/18913328-1-hd.mp4?txTime=1499157014
  5. &platform=pc&txSecret=2f0b5604df9b3ba80fa3bba61e584313&oi=3056288324&rate=1280000","http://tx.acgvideo
  6. .com/d/8b/18913328-1.mp4?txTime=1499157014&platform=pc&txSecret=dbddc01364c962b3db8ec870d74c1ec0&oi=3056288324
  7. &rate=1280000"]}]}
复制代码

用迅雷可以直接下载。

而给这两个地址下了个断点后查到是由
  1. http://static.hdslb.com/player/js/bilibiliPlayer.min.js?v=ffaf33a4
复制代码
这个js发送,但是。。
美化js代码后断点指向了
360截图20170704141311785.jpg
1680行,没给美化firebug不支持这种美化,然后就没有然后了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-4 18:24:52 | 显示全部楼层
wei_Y 发表于 2017-7-4 14:11
如何让他判断成html5平台?

一直被判断成pc平台给出的地址是:

切换成手机页面。。。。
这个值B站好像可以绕过这个东西。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 09:14:41 | 显示全部楼层
~风介~ 发表于 2017-7-3 15:02
找到生成方式是什么鬼?找到生产方式的机制有什么作用么?

找到了就可以开始爬虫了,token相当于密匙,网站一般有防爬虫的,或者简单来说,有这个token就可以这B站到处游走,没猜错的话相当于登录了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 09:15:10 | 显示全部楼层
厉害了,我的楼主。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 09:15:53 | 显示全部楼层
鬼人 发表于 2017-7-3 15:06
这个用来生成 哔哩哔哩播放器链接的地址关键参数cid 得到cid之后可以构造播放器的地址,等于可以存这个链 ...

往下翻原来这个token的作用是这样~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 09:30:35 | 显示全部楼层
这个值得研究研究,但我不太会python哎~目前只会java和js,有空试试同样的方法在java中实现一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 19:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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