Tenken blog

获取腾讯视频源地址

前几天开发微信小程序的时候需要用到腾讯视频的内容,但是小程序的video标签只支持视频源地址,我们在腾讯视频网站上找到的分享链接并不是视频的源地址,例如:

1
<iframe frameborder="0" width="640" height="498" src="https://v.qq.com/iframe/player.html?vid=r0519gvbvsj&tiny=0&auto=0" allowfullscreen></iframe>

这样的分享地址只是一个iframe框架链接,小程序video标签是无法识别的,那么问题来了,怎么样获取腾讯的视频的源地址呢?经过chrome浏览器的调试测试和postman工具的模拟测试,找出了腾讯视频源地址的解码原理。

腾讯视频获取源地址步骤

1、用vid参数通过https://h5vv.video.qq.com/getinfo接口获取vkey参数和fn参数
2、然后用vkey参数组合成源地址
http://ugcws.video.gtimg.com/fn&vkey&br=56&platform=2&fmt=auto&level=0&sdtfrom=v5010&guid=a3527bbc8888951591bc3a67c2bc9c50

php解码程序

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
<?php
class getRealVideo{

function http_get($url) {
$oCurl = curl_init ();
if (stripos ( $url, "https://" ) !== FALSE) {
curl_setopt ( $oCurl, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $oCurl, CURLOPT_SSL_VERIFYHOST, FALSE );
}
curl_setopt ( $oCurl, CURLOPT_URL, $url );
curl_setopt ( $oCurl, CURLOPT_RETURNTRANSFER, 1 );
$sContent = curl_exec ( $oCurl );
$aStatus = curl_getinfo ( $oCurl );
curl_close ( $oCurl );
if (intval ( $aStatus ["http_code"] ) == 200) {
return $sContent;
} else {
return false;
}
}

//通过vid参数换取源地址
function realVideo(array $vids){
if(empty($vids) || !is_array($vids)){
return;
}
$getUrl = 'https://h5vv.video.qq.com/getinfo?';
$realUrl = 'http://ugcws.video.gtimg.com/%s?vkey=%s&br=56&platform=2&fmt=auto&level=0&sdtfrom=v5010&guid=a3527bbc8888951591bc3a67c2bc9c50';
$newVideo = [];
foreach($vids as $value){
if(!empty($value)){
$vid = $value;
//获取真正的视频源地址
$data = [
'platform' => 11001,
'charge' => 0,
'otype' => 'json',
'ehost' => 'https://v.qq.com',
'sphls' => 1,
'sb' => 1,
'nocache' => 0,
'_rnd' => time(),
'guid' => 'a3527bbc8888951591bc3a67c2bc9c50',
'appVer' => 'V2.0Build9496',
'vids' => $vid,
'defaultfmt' => 'auto',
'_qv_rmt' => 'jJPtBTyoA12993HPU=',
'_qv_rmt2' => 'pS3QdOqZ150285Jdg=',
'sdtfrom' => 'v5010'
];
$result = $this->http_get($getUrl.http_build_query($data));
if(!empty($result)){
$result = explode('=', $result);
if(!empty($result) && !empty($result[1])){
$json = substr($result[1], 0, strlen($result[1])-1);
$json = json_decode($json, true);
if(json_last_error() == 'JSON_ERROR_NONE'){
if(!empty($json['vl']['vi'][0]['fn']) && !empty($json['vl']['vi'][0]['fvkey'])){
$fn = $json['vl']['vi'][0]['fn'];
$fvkey = $json['vl']['vi'][0]['fvkey'];
$returnUrl = sprintf($realUrl, $fn, $fvkey);
$newVideo[$value] = $returnUrl;
}
}
}
}
}
}
return $newVideo;
}

}

## 使用方法
$RealVideo = new getRealVideo();
$realvideo = $RealVideo->realVideo(['r0519gvbvsj']);
var_dump($realvideo);
?>

###结果如下
array(1) {
["r0519gvbvsj"]=>
string(376) "http://ugcws.video.gtimg.com/r0519gvbvsj.mp4?vkey=2C231D07B09D86572B36E66F3B45A96CF7E390079C0AE61002D65336AB7406B033851BF3F24C6372392D1720FF0B4D29D905C481335FF15409EE7427FF2517E804BFCFBD95FFAED757A4464F09B1DDCD1B38F23E16E714598699DDA2D1728C1C525B360EFF67C067053A8C83AC6826EA6F127F274D771AE7&br=56&platform=2&fmt=auto&level=0&sdtfrom=v5010&guid=a3527bbc8888951591bc3a67c2bc9c50"
}

注意事项

这个解出来的视频源地址是有时间限制的,大概是4到5小时的有效时间,过了这一段时间后就会失效,需要重新获取一次,所以这个解出来的源地址不适合直接入库,适合当做缓存,例如写入redis,然后每隔4小时重新获取一次。

请我吃辣条吧~~