前言
- 由于需要在小程序插入腾讯视频,于是在网上找了诸多方法,但基本都只能抓到低清版本的;偶然发现大神能抓到超清版(720p)的,但由于自己的视频并不都含有超清的版本,因而只能退而求其次使用480p的;这对于移动端(包括全屏)的清晰度已经足够了。毕竟也不是专门做视频的小程序。
- 环境:linux
- 语言:python
- 本文原创地址:https://blog.csdn.net/Szu_IT_Man/article/details/80449751
步骤
主要api
腾讯视频的vids
- 当你打开一个腾讯视频的时候,比如https://v.qq.com/x/page/x0164ytbgov.html,vids=x0164ytbgov。
这个将作为参数让我们去访问api.
访问getinfo
当我们得到vids后,我们就可以访问api:
http://vv.video.qq.com/getinfo?vids=x0164ytbgov&platform=101001&charge=0&otype=json&defn=shd
(如果需要xml格式,就让参数中otype=xml)获取到 json1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69QZOutputJson=
{
"dltype":1,
"exem":0,
"fl":{
"cnt":2,
"fi":[
{"id":100701,"name":"msd","lmt":0,"sb":1,"cname":"标清;(270P)","br":28,"profile":2,"drm":0,"video":1,"audio":1,"fs":16546732,"sl":1},
{"id":2,"name":"mp4","lmt":0,"sb":1,"cname":"高清;(480P)","br":33,"profile":1,"drm":0,"video":1,"audio":1,"fs":34433483,"sl":0}
]
},
"hs":0,"ip":"120.36.254.197","ls":0,"preview":555,"s":"o","sfl":{"cnt":0},"tm":1527217153,
"vl":{
"cnt":1,
"vi":[
{
"br":28,
"ch":0,
"cl":{"fc":0,"keyid":"x0164ytbgov.100701"},
"ct":21600,
"drm":0,
"dsb":0,
"fmd5":"99fb72a48f2a392ec88b5c17bac4ff81",
"fn":"x0164ytbgov.m701.mp4",
"fs":16546732,
"fst":5,
"fvkey":"1E327E4FE26E8B8222C226B0873DBF94C094934198E382AE2910361C29E5396237CCF814A49976A5A485F2E806CBC4C21602406034413F9896BF0972F7678D8263845FD123BA9B3604419489CD2BF4254EFD5F87D62A6F88FFF2A4E38F57C9898DD1F7C38C1F548C",
"head":0,
"hevc":0,
"iflag":0,
"level":0,
"lnk":"x0164ytbgov",
"logo":1,
"mst":8,
"pl":null,
"share":1,
"sp":0,
"st":2,
"tail":0,
"td":"555.00",
"ti":"World Builder (high quality)",
"tie":0,
"type":3,
"ul":{
"ui":[
{
"url":"http://ugcws.video.gtimg.com/",
"vt":106,
"dtc":0,
"dt":2
},
{"url":"http://122.228.238.157/vhot2.qqvideo.tc.qq.com/AcSbzObMTmKX0kJqo8qTGhY0OAwzkw14O81CvShBXrlI/","vt":200,"dtc":0,"dt":2},
{"url":"http://ugcdl.video.gtimg.com/","vt":116,"dtc":0,"dt":2},
{"url":"http://video.dispatch.tc.qq.com/","vt":0,"dtc":0,"dt":2}
]
},
"vh":256,
"vid":"x0164ytbgov",
"videotype":0,
"vr":0,
"vst":2,
"vw":480,
"wh":1.875,
"wl":{"wi":[]}
}
]
}
};
拼接低清版本的视频地址
- 到这一步,我们就可以获取低清版本的视频源地址了。
我们把获取到字符串去掉QZOutputJson=和最后的分号,变成正式的json
1
2
3
4realVideoURLRequestPath="http://vv.video.qq.com/getinfo?vids=x0164ytbgov&platform=101001&charge=0&otype=json&defn=shd"
videoInfo = requests.get(realVideoURLRequestPath)
videoInfo_json = videoInfo.text[len('QZOutputJson='):-1]
tempStr = json.loads(videoInfo_json)这样我们就可以获取到
1
2
3
4tempStr['vl']['vi'][0]['ul']['ui'][0]['url']
+tempStr['vl']['vi'][0]['fn']
+"?vkey="
+tempStr['vl']['vi'][0]['fvkey']即:
1
http://ugcws.video.gtimg.com/x0164ytbgov.m701.mp4?vkey=1E327E4FE26E8B8222C226B0873DBF94C094934198E382AE2910361C29E5396237CCF814A49976A5A485F2E806CBC4C21602406034413F9896BF0972F7678D8263845FD123BA9B3604419489CD2BF4254EFD5F87D62A6F88FFF2A4E38F57C9898DD1F7C38C1F548C
拼接高清视频地址
因为我们这个视最清晰只有高清,所以json中的fi字段
1
2
3
4"fi":[
{"id":100701,"name":"msd","lmt":0,"sb":1,"cname":"标清;(270P)","br":28,"profile":2,"drm":0,"video":1,"audio":1,"fs":16546732,"sl":1},
{"id":2,"name":"mp4","lmt":0,"sb":1,"cname":"高清;(480P)","br":33,"profile":1,"drm":0,"video":1,"audio":1,"fs":34433483,"sl":0}
]如果有超清清的话,一般会多一个id为10701的数组元素,如:
1
2
3
4
5
6
7
8
9
10
11
12
13"id":10701,
"name":"shd",
"lmt":0,
"sb":1,
"cname":"超清;(720P)",
"br":39,
"profile":1,
"drm":0,
"video":1,
"audio":1,
"fs":41560039,
"sl":0
}这时,我们就需要用到 http://vv.video.qq.com/getkey api
- 首先我们先构造filename=[vids]+.mp4 即 filename=x0164ytbgov.mp4
- 然后访问:
1
2http://vv.video.qq.com/getkey?format=2
&otype=json&vt=150&vid=x0164ytbgov&ran=0\%2E9477521511726081\\&charge=0&filename=x0164ytbgov.mp4&platform=11
返回json2
1
2
3
4
5
6
7
8
9
10
11
12
13
14QZOutputJson=
{
"br":62042.312,
"ct":21600,
"filename":"x0164ytbgov.mp4",
"ip":"120.36.254.197",
"key":"A76112B8282FBD47AE5408A46CBE73D6C3B087688864DAE1C5076726E901E76673A9884A141F398F08A0EB6E9A2C684DA23F92D9A6D0B2787CB108EF75FCD8D7A631A2D40AF2C020392BEE038A662EF1434BF157CAC87218E87A26B65375D06C",
"keyid":"x0164ytbgov.2",
"level":0,
"levelvalid":1,
"s":"o",
"sp":0,
"sr":0
};根据这两个json,我们就构造新的连接:
tempStr[‘vl’][‘vi’][0][‘ul’][‘ui’][0][‘url’]+filename+?vkey=key (key为json2的key),即:1
http://ugcws.video.gtimg.com/x0164ytbgov.mp4?vkey=A76112B8282FBD47AE5408A46CBE73D6C3B087688864DAE1C5076726E901E76673A9884A141F398F08A0EB6E9A2C684DA23F92D9A6D0B2787CB108EF75FCD8D7A631A2D40AF2C020392BEE038A662EF1434BF157CAC87218E87A26B65375D06C
- 这样,我们就获得了高清的视频地址了
拼接超清视频地址
前面说过了额,如果有超清清的话,一般会多一个id为10701的数组元素,如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14{
"id":10701,
"name":"shd",
"lmt":0,
"sb":1,
"cname":"超清;(720P)",
"br":39,
"profile":1,
"drm":0,
"video":1,
"audio":1,
"fs":41560039,
"sl":0
}这时我们构造的filename=x0164ytbgov.p701.1.mp4
- 此时访问getkey的api就要改为:
1
2http://vv.video.qq.com/getkey?format=10701
&otype=json&vt=150&vid=x0164ytbgov&ran=0\%2E9477521511726081\\&charge=0&filename=x0164ytbgov.p701.1.mp4&platform=11
<http://vv.video.qq.com/getkey?format=10701 &otype=json&vt=150&vid=x0164ytbgov&ran=0\%2E9477521511726081\\&charge=0&filename=x0164ytbgov.p701.1.mp4&platform=11>
- 聪明的你可能发现了:format={id}
- 到最后构成真实视频的url:
tempStr[‘vl’][‘vi’][0][‘ul’][‘ui’][0][‘url’]+filename+?vkey=key (key为json2的key,filename=x0164ytbgov.p701.1.mp4) - 由于测试用的视频地址无超清源,所以超清这块的测试需要使用的超清视频做测试。提示已测试可行。
参考文献
答疑
- 问题:怎么知道defn为清晰度标识并且知道可选值有sd(标清)、hd(高清)、shd(超清)、fhd(1080P)?
回答:getinfo接口的返回结果中有这个对应关系。此外,也可以推测出来,
defn是definition的简写;
sd、hd、shd、fhd分别是standard definition、high definition、super high definition、full high difinition的简写。