一、前言
今日头条有毒,这句话不是虚的,现在资讯类app中也就大黄易和今日头条可以博取用户一点喜好了,我所说的喜好不是指内容精彩,而是评论,玩过这两个app的人都知道,看的不是新闻本生内容,而是他逗逼的评论,也不得不服中国网友很有才。在今日头条和黄易中我学到了很多段子,成功的成为一个逗逼。
二、手动下载视频
喜欢今日头条的同学都知道今日头条的视频时有毒的,原因是没广告,而且内容是你想要的,网友都这么说:我在今日头条中看完了火影,不仅如此,现在加入了更多的自媒体,才华一个比一个牛逼,那短视频看的你乐乎的不要不要的,有时候想把一些精彩的视频分享到朋友圈或者微信好友,但是如果单纯的分享链接,感觉有点low逼了,所以本文就来介绍如何把今日头条的原生视频同步到微信中。
下面不多说了,直奔主题,我们随便打开一个今日头条的视频网页,发现并没有下载的按钮:
其实这时候我们可以人工的操作的,直接在这个页面按下F12键,查看这个页面的元素信息:
看到用的是video标签播放视频的,直接拿到他的src属性值就是视频的链接了,在用一个新窗口打开即可:
然后右击可以看到有一个菜单保存视频,将视频保存到本地即可。然后如果想把这个视频弄到微信中,那就更方便了,登录PC端微信,有一个文件传输助手,拖进去即可,手机端微信就可以保存这个视频分享给好友就可以了,不过这个视频大小是有限制的。然后如果想把视频分享到朋友圈:关于iOS中微信已经有可以分享本地视频的功能了,而Android这边没有这个功能可能需要借助插件,这个插件功能我在之前的文章说过了,不了解的同学可以点击这里进行查看:Android中如何实现分享本地视频到朋友圈中。
三、分析视频链接构造过程
好了到这里我们发现这么几步就可以把视频弄到微信中了,但是这么看来是不是有点费劲,而且还需要手动,完全不符合一个程序猿的做事风格,所以咋们得写程序实现自动化。我们为了方便现在PC端上写脚本实现自动化下载这个视频,原理也很简单,用Python脚本进行网页爬虫,得到视频原链接即可,关于爬虫知识点不多介绍了,网上多的很,而用Python来爬非常方便的,不到100行代码即可。爬虫原理很简单:使用api获取整个页面内容,然后用正则表达式得到你想要的标签内容或者纯文本内容即可。下面就来看一下Python脚本中获取页面内容的代码:
看到了,这个是不是很简单,三行代码即可得到页面内容。我们把这个内容先保存到本地,然后进行分析:
执行完这个脚本之后,查看video.html内容,直接查找player那个div标签内容:
可惜的是,并没有发现player标签下面有video标签内容,所以这里就猜想这段html内容使用js动态生成的,所以我们继续查看这个页面请求的js文件内容,直接通过浏览器中F12键弄出来的元素页面查看这个页面的所有:
这里有好几个js,通过分析发现是这个tt-video.js最可疑,我们把他的内容拷贝到WebStorm中,然后Ctrl+Alt+L格式化操作一下,这个WebStorm是前端开发的软件,可以自行装一个即可:
看到这段代码,应该就是造就那个video标签内容的地方了,主要看getVideos部分,这里可能需要一些js基础了,不了解的也没关系,这个语法不难,我们看到有一个核心的地方就是那个crc32函数:
这块的代码大致的意思是:有一个remoteURL+视频id字符串,然后用crc32函数处理,得到一个链接,然后用jsonp访问这个链接得到一个json数据,然后解析这个json数据,data节点中的video_list节点中的main_url这个key值,在用base64进行解码得到视频的原始链接。那么这里的remoteURL上面已经有了:
下面可以进入crc32函数看看:
这里代码格式化不是很标准,但是如果有js基础,还是可以大致看懂的,逻辑大致如下:通过外部传入的字符串内容(remoteURL+视频id),然后获取这个url的path字符串内容在凭借一个字段r,这个字段值是个随机数值,然后在用crc32算法计算(看到那个n(o)这个函数调用得到的是i值,而且还需要做移位操作的),然后在将这个i值也就是crc32校验值用s字段值拼接即是最后的链接,这里为了更好的验证,我们先用charles来进行抓包看看这个结果:
看到请求的链接了,携带的r和s参数值,这里抓包主要看:http://i.snssdk.com/video/urls/v/1/toutiao/mp4/,这个就是上面的remoteURL值,在js中可以查到的。然后在查看返回值:
果然是个json数据,和我们分析的差不多,这里为了验证正确性,我们可以用main_url值,在线base64解码:
果然没错了,解码之后就是原始视频链接了。
四、总结视频链接获取流程
到这里我们就分析完了今日头条的视频链接构造逻辑,下面来总结一下:
1、将/video/urls/v/1/toutiao/mp4/{videoid}?r={Math.random()},进行crc32加密。
2、将上面得到的加密值拼接到上面的链接中即可,最终的链接形式是:
http://i.snssdk.com/video/urls/v/1/toutiao/mp4/{videoid}?r={Math.random()}&s={crc32值}
3、访问这个链接得到一个json数据,需要解析video_list数组中的main_url值,然后用base64解码得到最终的原始视频链接。
看到上面的步骤并不复杂,但是在操作过程中还是有些地方需要注意的,主要是上面的那个随机数和crc32加密逻辑,为了掩饰简单,这里依然选择python脚本进行实践,其实用哪种语言没有任何关系的,原理都是一样的。从上面的步骤分析结果可以知道,如果我们想要得到最终的视频url,有一个信息必须得到就是视频的id值,这个我们需要回头看开始得到的那个页面内容,在那里应该会有这个视频id值:
查看文件之后发现的确有这个值,所以我们需要用正则表达式把他弄出来即可。
五、python脚本操作实践
下面咋们就来开始用python进行操作吧:
第一步:获取整个页面的内容
直接使用urllib.urlopen方法即可。
第二步:获取视频id
在第一步的基础上解析页面内容,用正则表达式获取视频id值:
第三步:拼接url计算crc32值
这里注意获取随机值是用的random.random()方法,这个获取到的是0-1之间的小数,所以需要转化成字符串,然后去除小数点,也就是从字符串的下标2开始截取内容。这个需要看之前分析js中的那个随机数获取逻辑:
这个就是js代码实现的随机逻辑。Math.random()是获取0-1之间的小数,然后转化成10进制的字符串内容,在进行截取内容即可。得到随机数之后开始拼接,同时拼接videoid值。然后在计算crc32值,这里需要注意的是,用python自带的binascii.crc32算法之后还得移位,这个也是分析js代码得到的结果:
这个就是js代码进行移位的逻辑。这里python脚本保持一致即可。
第四步:解析json获取视频url
这里主要是简单的解析json数据即可:
第五步:解码视频url
直接使用base64进行解码即可
第六步:下载视频
下载文件就比较简单了:
保存到本地mp4文件,文件名是个随机数值。这里没有详细处理了,应该解析上面那个json数据得到视频的详细信息,比如类型,然后在这里在规定保存文件的类型。
下面不多解释了,直接跑python脚本看看效果:
看到打印的值了,视频url获取成功了,看看本地保存的视频文件:
这样就成功了,不多解释了。程序猿干事就是这么任性,不做重复工作,以后有了这个脚本工具再也不用那么费劲了。而且后续感兴趣的同学可以改造一下这个脚本,实现爬取今日头条整个视频tab页面的所有视频。这里不再折腾了,主要还是人家那个重要的视频url值获取过程。其他没难度哈!
注意:在操作的过程中可能会遇到这样的错误:
这个是没有找到对应的videoid视频id值,这时候可以选择再次运行脚本,或者把需要爬取数据的链接放到浏览器中进行浏览查看数据是否正确。
六、移动端下载器
前面介绍了如何使用python脚本爬取视频,但是我们现在大部分都是用移动端的app看今日头条视频,如果这时候要是有一个辅助工具那就最好了,所以我就弄了一个Android版本的辅助下载工具,用法非常简单,安装小工具之后,打开今日头条视频页面,点击分享,选择转发链接,选择[今日头条下载器]即可:
看到了,这样就非常轻松的将今日头条视频保存到本地了。
小工具下载地址1:http://www.wjdiankong.cn/toutiaovideo.apk(最新版本,可能不稳定)
小工具下载地址2:https://pan.baidu.com/s/1eR56t94
如果在使用过程中遇到任何问题,请加微信或者微信公众号留言咨询,我会及时解决!如果觉得工具好用请多多支持,非常感谢!
Python脚本下载地址:https://github.com/fourbrother/python_toutiaovideo
七、总结
本文就简单的分析了今日头条视频链接的构造过程,主要知识点也是这个,然后借助python脚本简单的实现了这个逻辑,将页面中的视频下载到本地了,不用之前那么手动的进行操作了。加上有了Android版本的辅助小工具,可以在手机端想怎么保存就怎么保存!如果觉得文章不错,就记得多多扩散分享,如果有打赏那就更好了!
关注微信公众号,最新技术文章干货实时推送