拿到两个趣头条视频的分享链接如下
[精选] 同样是单身狗,第三个才是实至名归。查看http://new.3qtt.cn/1hKLnp
[热门]太原出土了一口黄金棺材,为何专家却不敢打开,里面有...。查看http://new.3qtt.cn/1hKLox
1.无水印视频源
很幸运了,网页端直接给出了无水印视频。那就直接在网页端找解析途径旧OK了。
2.解析途径
首先查看网页源码:
像上面这样子的,没有办法,接下来看网络请求
成功找到一个很敏感的jsonp请求
3.接口分析
该接口如下:
curl 'http://html2.qktoutiao.com/detail/jsonp/1461642/14616415/146164143/1461641430.js?_=1575335580658&callback=Zepto1575335580609'
-H 'Referer: http://art.lywka.cn/share/detail/video_out.html?content_id=1461641430&key=1ca4BBgiVUXnZSyXFdilmUT3lVqh_EoXtp9cdZut1eAbZRXnzz22Bu3K_eTMSeFaJWZDz7xU40JWNBXKBri_2OOQa9nEjb6_lP2aeQG4ucVWeTPPZvsSn31t4EONOkLGbsPV2tAMCnEcxaZBrVp2nh6YBkkH8ZYxJWlq&pv_id=&cid=2&jsonp=%2F%2Fhtml2.qktoutiao.com%2Fdetail%2Fjsonp%2F1461642%2F14616415%2F146164143%2F1461641430.js&fr=2&i=2886747874&shareContentType=2'
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
--compressed
经过验证,请求头及请求参数均可省去,如下请求即可正常请求
http://html2.qktoutiao.com/detail/jsonp/1461642/14616415/146164143/1461641430.js
请求返回如下
cb({"title": "同样是单身狗,第三个才是实至名归","source": "","createTime": "2019-11-28 17:56:54","detail": "{\\\"type\\\":\\\"qtg\\\",\\\"value\\\":\\\"web_3864d97e2ea7362bfeb8ebc31bfe8a8a\\\",\\\"address\\\":[{\\\"file_id\\\":\\\"web_3864d97e2ea7362bfeb8ebc31bfe8a8a\\\",\\\"url\\\":\\\"toutiao_video_zdgq_online_self\\\\\/6fcd4db33f8a5ab29a13747b15c8ff76\\\\\/hld.mp4\\\",\\\"size\\\":\\\"510994\\\",\\\"duration\\\":\\\"37\\\",\\\"format\\\":\\\"mp4\\\",\\\"bitrate\\\":\\\"112\\\",\\\"definition\\\":\\\"hld\\\"},{\\\"file_id\\\":\\\"web_3864d97e2ea7362bfeb8ebc31bfe8a8a\\\",\\\"url\\\":\\\"toutiao_video_zdgq_online_self\\\\\/6fcd4db33f8a5ab29a13747b15c8ff76\\\\\/hd.mp4\\\",\\\"size\\\":\\\"2208282\\\",\\\"duration\\\":\\\"37\\\",\\\"format\\\":\\\"mp4\\\",\\\"bitrate\\\":\\\"486\\\",\\\"definition\\\":\\\"hd\\\"},{\\\"file_id\\\":\\\"web_3864d97e2ea7362bfeb8ebc31bfe8a8a\\\",\\\"url\\\":\\\"toutiao_video_zdgq_online_self\\\\\/6fcd4db33f8a5ab29a13747b15c8ff76\\\\\/hhd.mp4\\\",\\\"size\\\":\\\"741034\\\",\\\"duration\\\":\\\"37\\\",\\\"format\\\":\\\"mp4\\\",\\\"bitrate\\\":\\\"163\\\",\\\"definition\\\":\\\"hhd\\\"},{\\\"file_id\\\":\\\"web_3864d97e2ea7362bfeb8ebc31bfe8a8a\\\",\\\"url\\\":\\\"toutiao_video_zdgq_online_self\\\\\/6fcd4db33f8a5ab29a13747b15c8ff76\\\\\/ld.mp4\\\",\\\"size\\\":\\\"996722\\\",\\\"duration\\\":\\\"37\\\",\\\"format\\\":\\\"mp4\\\",\\\"bitrate\\\":\\\"219\\\",\\\"definition\\\":\\\"ld\\\"}]}","keywords": "娱乐,社会,搞笑,生活,小姐姐","description": "","nickname": "农村帅小伙","avatar": "http:\/\/static.1sapp.com\/qupost\/avatar\/2019\/08\/04\/1564922926378541353.jpg?imageView2\/1\/h\/120\/w\/120\/q\/90","authorid": "1979410"
})
很明显的一个jsonp请求,和视频相关的最关键的数据就是 detail字段 了,一起来看看detail字段的详情
{"type": "qtg","value": "web_3864d97e2ea7362bfeb8ebc31bfe8a8a","address": [{"file_id": "web_3864d97e2ea7362bfeb8ebc31bfe8a8a","url": "toutiao_video_zdgq_online_self\\/6fcd4db33f8a5ab29a13747b15c8ff76\\/hld.mp4","size": "510994","duration": "37","format": "mp4","bitrate": "112","definition": "hld"}, {"file_id": "web_3864d97e2ea7362bfeb8ebc31bfe8a8a","url": "toutiao_video_zdgq_online_self\\/6fcd4db33f8a5ab29a13747b15c8ff76\\/hd.mp4","size": "2208282","duration": "37","format": "mp4","bitrate": "486","definition": "hd"}, {"file_id": "web_3864d97e2ea7362bfeb8ebc31bfe8a8a","url": "toutiao_video_zdgq_online_self\\/6fcd4db33f8a5ab29a13747b15c8ff76\\/hhd.mp4","size": "741034","duration": "37","format": "mp4","bitrate": "163","definition": "hhd"}, {"file_id": "web_3864d97e2ea7362bfeb8ebc31bfe8a8a","url": "toutiao_video_zdgq_online_self\\/6fcd4db33f8a5ab29a13747b15c8ff76\\/ld.mp4","size": "996722","duration": "37","format": "mp4","bitrate": "219","definition": "ld"}]
}
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
file_id | string | 顾名思义 | |
url | string | 视频链接 | 不完整 |
size | int | 视频大小 | |
duration | int | 视频时长 | |
format | string | 视频封装格式 | |
bitrate | int | 比特率 | |
definition | string | 视频清晰度 |
首先,同一个视频 不同清晰度 的 file_id 是 相同 的
其次,根据视频的 size 和 bitrate,可以确定不同清晰度的视频质量有如下关系
hd > ld > hhd > hld
hd 级别的清晰度是质量最高的视频源
4.hd视频源
先看看我们正常播放用到的视频链接
我去,不会吧,竟然是ld的,要下载这个视频也没什么卵用,那就直接拿hd的玩玩吧
http://v4.qutoutiao.net/toutiao_video_zdgq_online_self/6fcd4db33f8a5ab29a13747b15c8ff76/ld.mp4
上面是ld级别的完整视频链接。那hd级别的就是下面了
http://v4.qutoutiao.net/toutiao_video_zdgq_online_self/6fcd4db33f8a5ab29a13747b15c8ff76/hd.mp4
成功了。
5.完工了?
看到这里,很开心,完工了,拿到无水印视频了~~~
真的吗?那下面这个接口从哪里来的呢?
http://html2.qktoutiao.com/detail/jsonp/1461642/14616415/146164143/1461641430.js
趣头条解析原理的有趣也正在这里,目前呢,有两种方式获取上面这个接口的地址
http://art.lywka.cn/share/detail/video_out.html?content_id=1461641430&key=1ca4BBgiVUXnZSyXFdilmUT3lVqh_EoXtp9cdZut1eAbZRXnzz22Bu3K_eTMSeFaJWZDz7xU40JWNBXKBri_2OOQa9nEjb6_lP2aeQG4ucVWeTPPZvsSn31t4EONOkLGbsPV2tAMCnEcxaZBrVp2nh6YBkkH8ZYxJWlq&pv_id=&cid=2&jsonp=%2F%2Fhtml2.qktoutiao.com%2Fdetail%2Fjsonp%2F1461642%2F14616415%2F146164143%2F1461641430.js&fr=2&i=2886747874&shareContentType=2
上面是短链重定向的地址了,眼尖的朋友一定发现了
content_id=1461641430
眼更尖,尖到变态的朋友也一定发现了
jsonp=%2F%2Fhtml2.qktoutiao.com%2Fdetail%2Fjsonp%2F1461642%2F14616415%2F146164143%2F1461641430.js
也正是上面的两种发现,会有两种不同的获取接口地址方式。
5.1 短链重定向获取
首先是发现jsonp的朋友,他会这样去分析了
jsonp=%2F%2Fhtml2.qktoutiao.com%2Fdetail%2Fjsonp%2F1461642%2F14616415%2F146164143%2F1461641430.js
首先urldecode,得到
jsonp=//html2.qktoutiao.com/detail/jsonp/1461642/14616415/146164143/1461641430.js
一步到位,直接到达了高潮
5.2 自行计算
那发现content_id的朋友就会更有趣味性了
content_id=1461641430
真实的url地址如下
html2.qktoutiao.com/detail/jsonp/1461642/14616415/146164143/1461641430.js
出现的数字从后向前排列一下,来寻找规律
数字 | 序号 |
---|---|
1461641430 | 1 |
146164143 | 2 |
14616415 | 3 |
1461642 | 4 |
已经看出了点什么了吧!当然,一个并不能说明什么,那就多来几个!最后你会发现下面的规律。
1.存在一个函数 qtt_fun ,伪代码如下
def qtt_fun(num):return num%10 == 0? num/10 : num/10 +1
如果模10有余,就在除以10后的结果上加一,否则不加一
2.存在下列计算,伪代码
path0 = 1461641430
path1 = qtt_fun(path0)
path2 = qtt_fun(path1)
path3 = qtt_fun(path2)
url = "html2.qktoutiao.com/detail/jsonp/" + path3 + "/" + path2 + "/" + path1 + "/" + path0 + ".js"
好了,到现在才算是真的完工了。