以腾讯视频播放页地址http://v.qq.com/x/cover/rz4mhb6494f12co.html为例,说说如何解析得到视频的真实地址。
提取视频ID
在播放页源码中,可以找到如下视频信息:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18var VIDEO_INFO = {
title: "咱们相爱吧 第1集",
duration: "2746",
vid: "y00221a60w7",
piantou:"0",
pianwei:"0",
showMark:"1",
showBullet:true,
showImageBullet:false,
openBulletDefault:true,
isNeedPay: false,
isTrailer: 0,
singlePrice: "undefined",
vipPrice: "undefined",
tryTime: "1306029",
isTrailer : 0,
type: "2"
};
其中,vid的值y00221a60w7即为视频ID.
请求getinfo接口
使用Chrome浏览器的开发者工具监控网络请求,发现getinfo接口的请求地址如下:1
http://h5vv.video.qq.com/getinfo?callback=txplayerJsonpCallBack_getinfo_591513&isHLS=false&charge=0&vid=y00221a60w7&defn=hd&defnpayver=1&otype=json&guid=29a06bf3852fbe2ea6eb53829c3878fa&platform=10901&sdtfrom=v1010&host=v.qq.com&_rnd=1479010822&fhdswitch=0&show1080p=1&_qv_rmt=sNk0sWZTA17002uQa%3D&_qv_rmt2=0Qs65I9%2B149182HOQ%3D&_=1479010820769
http://h5vv.video.qq.com/getinfo?callback=txplayerJsonpCallBack_getinfo_591513&isHLS=false&charge=0&vid=y00221a60w7&defn=hd&defnpayver=1&otype=json&guid=29a06bf3852fbe2ea6eb53829c3878fa&platform=10901&sdtfrom=v1010&host=v.qq.com&_rnd=1479010822&fhdswitch=0&show1080p=1&_qv_rmt=sNk0sWZTA17002uQa%3D&_qv_rmt2=0Qs65I9%2B149182HOQ%3D&_=1479010820769
我们尝试构造各个请求参数,然后看看请求结果是什么样子的。1
2
3
4
5
6
7
8
9
10
11
12
13params = {
'isHLS': False,
'charge': 0,
'vid': 'y00221a60w7',
'defn': 'shd',
'defnpayver': 1,
'otype': 'json',
'platform': 10901,
'sdtfrom': 'v1010',
'host': 'v.qq.com',
'fhdswitch': 0,
'show1080p': 1,
}
参数中的defn为清晰度标识,可选值有sd(标清)、hd(高清)、shd(超清)、fhd(1080P)。请求结果如下: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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214{
"dltype": 1,
"exem": 0,
"fl": {
"cnt": 4,
"fi": [
{
"br": 20000,
"cname": "高清;(480P)",
"fs": 239935872,
"id": 10412,
"lmt": 0,
"name": "hd",
"sb": 1,
"sl": 0
},
{
"br": 500000,
"cname": "蓝光;(1080P)",
"fs": 1064110139,
"id": 10409,
"lmt": 1,
"name": "fhd",
"sb": 1,
"sl": 0
},
{
"br": 64,
"cname": "标清;(270P)",
"fs": 114567499,
"id": 10403,
"lmt": 0,
"name": "sd",
"sb": 1,
"sl": 0
},
{
"br": 500000,
"cname": "超清;(720P)",
"fs": 468471925,
"id": 10401,
"lmt": 0,
"name": "shd",
"sb": 1,
"sl": 1
}
]
},
"hs": 0,
"ls": 0,
"preview": 2746,
"s": "o",
"sfl": {
"cnt": 0
},
"tm": 1479014650,
"vl": {
"cnt": 1,
"vi": [
{
"br": 166,
"ch": 0,
"cl": {
"ci": [
{
"cd": "300.032",
"cmd5": "285464ac33c56b14caa63c466d4b4ed3",
"cs": 56516869,
"idx": 1,
"keyid": "y00221a60w7.10401.1"
},
{
"cd": "299.988",
"cmd5": "6a9b0dedeb2ed7c73e5ad31418a9a6bc",
"cs": 56364414,
"idx": 2,
"keyid": "y00221a60w7.10401.2"
},
{
"cd": "299.988",
"cmd5": "2181237427075dc219de8bdaa37ae64d",
"cs": 50213590,
"idx": 3,
"keyid": "y00221a60w7.10401.3"
},
{
"cd": "299.988",
"cmd5": "ac17519a98640a1926f54bc48f5637fb",
"cs": 37593039,
"idx": 4,
"keyid": "y00221a60w7.10401.4"
},
{
"cd": "300.032",
"cmd5": "546963ed0dcb3544373e8642eb2bb166",
"cs": 54082931,
"idx": 5,
"keyid": "y00221a60w7.10401.5"
},
{
"cd": "299.988",
"cmd5": "f33ed88e9b94d4cb1c9c0fb5d3730f76",
"cs": 43686678,
"idx": 6,
"keyid": "y00221a60w7.10401.6"
},
{
"cd": "299.988",
"cmd5": "a6a298f6122de6c09080ae78639c139c",
"cs": 40800986,
"idx": 7,
"keyid": "y00221a60w7.10401.7"
},
{
"cd": "299.988",
"cmd5": "9454b637e3c913ebd1c880ac5e6cf973",
"cs": 62436368,
"idx": 8,
"keyid": "y00221a60w7.10401.8"
},
{
"cd": "346.837",
"cmd5": "0fe50a2165b1ef7860627dbaf672d493",
"cs": 68478324,
"idx": 9,
"keyid": "y00221a60w7.10401.9"
}
],
"fc": 9
},
"ct": 21600,
"drm": 0,
"dsb": 0,
"fclip": 1,
"fmd5": "18f937a9790f22a843e618fb5fd02583",
"fn": "y00221a60w7.p401.mp4",
"fs": 468471925,
"fst": 5,
"fvkey": "88980E6001844B3B7D98195D7077A1EA62310E41BD70C43F57AC6E80AFEB8E9EFD71201CBBB054F2CBFEC5EA8269BB141DB6933322FAA43AD3BB6AA62AD9FE2C2B2A321A639497AA6DF23492CF3B622E41A1C5C75F2DDEC7",
"hevc": 0,
"iflag": 0,
"level": 0,
"lnk": "y00221a60w7",
"logo": 1,
"pl": [
{
"cnt": 2,
"pd": [
{
"c": 10,
"cd": 10,
"fmt": 40001,
"fn": "q1",
"h": 45,
"r": 10,
"url": "http://video.qpic.cn/video_caps/0/",
"w": 80
},
{
"c": 5,
"cd": 10,
"fmt": 40002,
"fn": "q2",
"h": 90,
"r": 5,
"url": "http://video.qpic.cn/video_caps/0/",
"w": 160
}
]
}
],
"share": 1,
"sp": 0,
"st": 2,
"td": "2746.84",
"ti": "咱们相爱吧_01",
"type": 1136,
"ul": {
"ui": [
{
"dt": 2,
"dtc": 10,
"url": "http://124.193.165.208/vlive.qqvideo.tc.qq.com/",
"vt": 203
},
{
"dt": 2,
"dtc": 10,
"url": "http://124.193.165.209/vlive.qqvideo.tc.qq.com/",
"vt": 203
},
{
"dt": 2,
"dtc": 10,
"url": "http://124.193.165.210/vlive.qqvideo.tc.qq.com/",
"vt": 203
},
{
"dt": 2,
"dtc": 10,
"url": "http://video.dispatch.tc.qq.com/27099043/",
"vt": 0
}
]
},
"vh": 720,
"vid": "y00221a60w7",
"videotype": 2,
"vst": 2,
"vw": 1280
}
]
}
}
我们感兴趣的有三个列表:fi列表、ci列表、ui列表。
- ui列表中的url是视频真实地址的前缀,选择ui列表第一个元素中的url即可。
- fi列表列出了各个视频码流,每一项中的id是码流的编号,这个参数在后面会用到。
- ci列表列出了各个分段的相关信息,各个分段信息中的keyid在后面会用到。
请求getkey接口
同样,在网络请求监测中发现getkey接口的请求是这样的:1
http://h5vv.video.qq.com/getkey?callback=txplayerJsonpCallBack_getkey_931033&&otype=json&vid=y00221a60w7&format=10401&filename=y00221a60w7.p401.4.mp4&platform=10901&vt=203&charge=0&_rnd=1479015483148&_=1479015476641
构造参数如下:1
2
3
4
5
6
7
8
9params = {
'otype': 'json',
'vid': 'y00221a60w7',
'format': 10401,
'filename': 'y00221a60w7.p401.4.mp4',
'platform': 10901,
'vt': 217,
'charge': 0,
}
参数中的vid为视频ID,format为码流的编号,filename根据分段信息中的keyid得来。以第四个分段为例,说说如何构造filename参数。第四个分段信息中的keyid为y00221a60w7.10401.4,我们将keyid中间的.10替换为.p,然后在末尾加上.mp4即可。
getkey接口的请求结果示例如下:1
2
3
4
5
6
7
8
9
10
11
12{
"br": 125315.14,
"ct": 21600,
"filename": "y00221a60w7.p401.mp4",
"key": "AE6DC4B022C2A29C59D1A8E942787A2A54F64A5ABFCA7C99B51BD6539703D4F745DD2D77C3433ACAF1961BBFB6D84C1C717D23BEDCAF4DABC0D8BA2229F6C3464F59F0A10C5ED4CC25E355D9171DC65D411D6834BCA2DECD",
"keyid": "y00221a60w7.10401.4",
"level": 0,
"levelvalid": 1,
"s": "o",
"sp": 0,
"sr": 0
}
看!key粗来了。
构造视频真实地址
通过网络监测发现视频真实地址是像这样的:1
http://60.206.195.15/vlive.qqvideo.tc.qq.com/y00221a60w7.p401.4.mp4?sdtfrom=v1010&guid=29a06bf3852fbe2ea6eb53829c3878fa&vkey=6C5D63159598E6D217BA73F6F3335C0B80CECE2A4E889AFCDD8A391DB9C648059731AE9AD47BDA03B016F76E8B59D9DF0C2373CA32A4ADB935AEE0FE73ECE1C460DC01F6B733A5F38035AC289C44721F606C1ADF5AED4267
http://60.206.195.15/vlive.qqvideo.tc.qq.com/y00221a60w7.p401.4.mp4?sdtfrom=v1010&guid=29a06bf3852fbe2ea6eb53829c3878fa&vkey=6C5D63159598E6D217BA73F6F3335C0B80CECE2A4E889AFCDD8A391DB9C648059731AE9AD47BDA03B016F76E8B59D9DF0C2373CA32A4ADB935AEE0FE73ECE1C460DC01F6B733A5F38035AC289C44721F606C1ADF5AED4267
分析该地址的构造,不难发现,地址前缀在前面的ui列表中已经得到了,filename也计算出来了,vkey参数就是上面得到的key.
Python代码示例
1 | import requests |