趣头条视频解析去水印原理分析过程,简单又有趣

  • 时间:
  • 来源:互联网
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ucsheep/article/details/103361010

拿到两个趣头条视频的分享链接如下

[精选] 同样是单身狗,第三个才是实至名归。查看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相同
其次,根据视频的 sizebitrate,可以确定不同清晰度的视频质量有如下关系

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

hd视频
成功了。

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"

好了,到现在才算是真的完工了。

本文链接http://element-ui.cn/news/show-517.aspx