抓腾讯视频真实地址总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抓腾讯视频真实地址总结相关的知识,希望对你有一定的参考价值。

抓腾讯视频裸源总结
腾讯视频必然是国内最全面,最复杂的视频网站之一了,因此研究他的网页结构很有代表性.

首先,腾讯理所当然不会把视频资源暴露在网页源代码里,所以F12查看他的元素以获得重要信息你会无功而返.
所以,凄凉地研究一段时间后断然放弃...

有一个流传已久的经验, 大概是: 攻克一个网页,最好从移动端入手,至于为什么,
大概因为移动端源代码要稍简单一点, 或者说一些加密算法还不成熟.
所以,get一个小技能, 以为只有我知道, 搜寻了半天居然发现是多数浏览器都支持了n久的...
只是以前是设置参数,现在的浏览器都很智能,一键就可以模拟手机,并且可以选型号

进入正文:
模拟手机浏览器进入视频首页, 任意选择一个视频进入, F12后重新刷新一遍
腾讯不出意料地采取异步加载技术,所以,等n多让人大开眼界的广告加载完毕后,你会看到正片袭来
为了防止不断地动态加载造成打扰,可以等正片加载完毕后停止抓包录制
安心的分析每条代码吧, 有的是图片,有的是css, 特别要留意的是js

要相信在众多的元素里面, 终究可以找到视频播放地址
http://124.14.20.19/vlive.qqvideo.tc.qq.com/z0024zqdzu1.p212.1.mp4?sdtfrom=v1010&
guid=21b1d1487c0e3886a2958dc5f2503b9a&vkey=9644BCB6D0138F9831260BE00AA16EE17DEAAA416155124AA999873279C305
574FB8F0311CA565E95D5CB127925E29683E8813DB6373B64D37F5EBD59EF971B6F32CBE001F0B39B585827D9AC07484FDFD3B1255A95A
550DB69002BF46B20594E6BF36DC67A4F3302ADABA6120CD137D3DA2A049DFD5DDC8&platform=2

有一些参数是不必要的,可以考虑去掉,这里采用尝试的方法,因为的确不懂这些简称什么意思,阅读起来太残忍了
简化后视频地址
http://124.14.20.19/vlive.qqvideo.tc.qq.com/z0024zqdzu1.p212.1.mp4?
vkey=9644BCB6D0138F9831260BE00AA16EE17DEAAA416155124AA999873279C305574FB8F0311CA565E95D5CB127925E29683E8813D
B6373B64D37F5EBD59EF971B6F32CBE001F0B39B585827D9AC07484FDFD3B1255A95A550DB69002BF46B20594E6BF3
6DC67A4F3302ADABA6120CD137D3DA2A049DFD5DDC8

以上可以看到,视频主要参数由 协议http:// + 类似ip + host + vid一样的东西(z0024zqdzu1) + 长串的vkey 组成
需要费心的是vid 和vkey , 主要是vkey,因为其他都能从源代码轻松找到或者拼接

所以找vkey是重点, 不用说,vkey肯定是播放视频的某个关键"钥匙"

需要的vkey在哪里?怎样构造这个奇怪的url?

经过总结发现,构造目标地址方法有三种,
1: 根据规律构造.如页数,每页的个数,其实数
2: 来自某一个文件的一个组成元素, 在第一个文件里找到第二个文件需要的元素,常见于id,cid,vid 等
3: 手动生成, 常见的有时间戳:time.time()
在这个案例中, 方法二比较靠谱.所以,这个vkey就在其他文件中寻寻觅觅吧!

终于,在一个叫getinfo里面发现了可疑文件,他的返回是一长串貌似我们认识的东西

getinfo的完整请求地址
https://vv.video.qq.com/getinfo?callback=txplayerJsonpCallBack_getinfo_552345&&charge=0&vid=z0024zqdzu1&defaultfmt=auto
&otype=json&guid=21b1d1487c0e3886a2958dc5f2503b9a&platform=10201&defnpayver=0&appVer=3.2.26&sdtfrom=v1010&host=v.qq.com
&ehost=https%3A%2F%2Fv.qq.com%2F&sphttps=1&_rnd=1499231532&spwm=2&defn=&fhdswitch=0&show1080p=0&isHLS=0
&newplatform=10201&defsrc=1&_qv_rmt=jBZ5pIl8A19213wFt%3D&_qv_rmt2=o6Qa4YDm149352oVg%3D&_1499231532114=

返回的是一个类json文件,去掉头就是完全的json, 用json解析工具得到如下:
{
    "dltype": 1,
    "exem": 0,
    "fl": {
        "cnt": 3,
        "fi": [
            {
                "id": 10203,
                "name": "sd",
                "lmt": 0,
                "sb": 1,
                "cname": "标清;(270P)",
                "br": 64,
                "drm": 0,
                "video": 1,
                "fs": 4972275,
                "sl": 0
            },
            {
                "id": 10212,
                "name": "hd",
                "lmt": 0,
                "sb": 1,
                "cname": "高清;(480P)",
                "br": 235,
                "drm": 0,
                "video": 1,
                "fs": 16526691,
                "sl": 1
            },
            {
                "id": 10201,
                "name": "shd",
                "lmt": 0,
                "sb": 1,
                "cname": "超清;(720P)",
                "br": 650,
                "drm": 0,
                "video": 1,
                "fs": 31367763,
                "sl": 0
            }
        ]
    },
    "fp2p": 0,
    "hs": 0,
    "ip": "211.161.248.25",
    "ls": 0,
    "preview": 139,
    "s": "o",
    "sfl": {
        "cnt": 0
    },
    "tm": 1499248445,
    "vl": {
        "cnt": 1,
        "vi": [
            {
                "br": 115,
                "ch": 0,
                "cl": {
                    "fc": 1,
                    "ci": [
                        {
                            "idx": 1,
                            "cs": 16526691,
                            "cd": "139.690",
                            "cmd5": "2fa46e4979bef73aeee198b119bcddb5",
                            "keyid": "z0024zqdzu1.10212.1"
                        }
                    ]
                },
                "ct": 21600,
                "drm": 0,
                "dsb": 0,
                "fclip": 1,
                "fmd5": "2fa46e4979bef73aeee198b119bcddb5",
                "fn": "z0024zqdzu1.p212.mp4",
                "fs": 16526691,
                "fst": 5,
                "fvkey": "771B9BCC38551D087A458F669156E0C8C3E83BE0A8EB9A62C9065A87D1C0A913F43A40BA502ED5BD575A6F66FE66A93E07E2BEAAA48D6997EB610B96AD2436F4AA64134E59CDB1205BF931F801785AA288EFE31242619D391F3F169950BAF5AA0901DA9E8E3B7D81A811FD5348EE8A3FE6046D8C8BE5400A",
                "head": 0,
                "hevc": 0,
                "iflag": 0,
                "level": 0,
                "lnk": "z0024zqdzu1",
                "logo": 1,
                "mst": 8,
                "pl": [
                    {
                        "cnt": 3,
                        "pd": [
                            {
                                "cd": 2,
                                "h": 45,
                                "w": 80,
                                "r": 10,
                                "c": 10,
                                "fmt": 40001,
                                "fn": "q1",
                                "url": "https://puui.qpic.cn/video_caps/0/"
                            },
                            {
                                "cd": 2,
                                "h": 90,
                                "w": 160,
                                "r": 5,
                                "c": 5,
                                "fmt": 40002,
                                "fn": "q2",
                                "url": "https://puui.qpic.cn/video_caps/0/"
                            },
                            {
                                "cd": 2,
                                "h": 135,
                                "w": 240,
                                "r": 5,
                                "c": 5,
                                "fmt": 40003,
                                "fn": "q3",
                                "url": "https://puui.qpic.cn/video_caps/0/"
                            }
                        ]
                    }
                ],
                "share": 1,
                "sp": 0,
                "st": 2,
                "tail": 0,
                "td": "139.69",
                "ti": "《双世宠妃》邢昭林梁洁组坦诚夫妇上演独宠蜜爱",
                "type": 1036,
                "ul": {
                    "ui": [
                        {
                            "url": "http://124.14.20.19/vlive.qqvideo.tc.qq.com/",
                            "vt": 203,
                            "dtc": 0,
                            "dt": 2
                        },
                        {
                            "url": "http://124.14.20.21/vlive.qqvideo.tc.qq.com/",
                            "vt": 203,
                            "dtc": 0,
                            "dt": 2
                        },
                        {
                            "url": "http://124.14.20.20/vlive.qqvideo.tc.qq.com/",
                            "vt": 203,
                            "dtc": 0,
                            "dt": 2
                        },
                        {
                            "url": "http://video.dispatch.tc.qq.com/35137871/",
                            "vt": 0,
                            "dtc": 0,
                            "dt": 2
                        }
                    ]
                },
                "vh": 480,
                "vid": "z0024zqdzu1",
                "videotype": 2,
                "vr": 0,
                "vst": 2,
                "vw": 848,
                "wh": 1.7666667,
                "wl": {
                    "wi": [

                    ]
                }
            }
        ]
    }
# }
什么标清,高清之类,所幸可以看懂一些了.
而,我们还看到了fvkey, fvkey和vkey一定有着某些不可告人的关系!
并且, 在vl的vi里面的ul里的ui里面有url地址,这url有类ip的东西,所以因电脑而异,需要取出来作为播放页的base_url
所以,getinfo要坚决构造出来,并且得到fvkey, url, 不罢休
那么问题来了,getinfo的url实在超级长,大概有三十多个参数,哪些是需要的呢?

经过苦逼地百次尝试,得出以下结论:

&_1499231532114= 时间戳, 可以去掉,不影响
&_qv_rmt2=o6Qa4YDm149352oVg%3D 比较重点,这是腾讯最近的新技术,对网络起疯狂限速作用,去掉后视频延迟3-5秒出画面,虽加载成功,但是出现明显卡顿
&_qv_rmt=jBZ5pIl8A19213wFt%3D 同上
&defsrc=1 可以去掉,不影响
&newplatform=10201 可以去掉,不影响
&isHLS=0 可以去掉
&show1080p=0 1080p按钮,可以去掉
&fhdswitch=0 全高清切换按钮,可以去掉
&defn= 有人说是清晰度,defn是definition的简写;sd、hd、shd、fhd分别是standard definition、high definition、super high definition、full high difinition的简写。然而,可以去掉
&spwm=2 可以去掉
&_rnd=1499231532 可以去掉
&sphttps=1可以去掉
&ehost=https%3A%2F%2Fv.qq.com%2F 可以去掉
&host=v.qq.com 可以去掉
&sdtfrom=v1010 不能去掉, 延迟加载,播放失败
&appVer=3.2.26 app版本信息,作为后缀便于发送统计的,可以去掉
&defnpayver=0 可以去掉
&platform=10201 平台信息,不能去掉,会导致404
&guid=21b1d1487c0e3886a2958dc5f2503b9a 全球唯一标识符,不建议去掉,画面20s左右开始卡顿
&otype=json 脚本类型,建议保留,便于作json解析,去掉后会展示成xml类型数据
&defaultfmt=auto 像是某个默认按钮,默认为自动,去掉后没有影响, 可以去掉
&vid=z0024zqdzu1 视频唯一标识,显然不能去
&charge=0 应该是付费相关,可以去掉
callback=txplayerJsonpCallBack_getinfo_552345 有待观察,暂时去掉没影响
剩余的base_url: https://vv.video.qq.com/getinfo?

以上是经过了反复对比尝试,挨个增删验证的, 其实有多次爬取经验就会得知一些为0的参数或者默认的参数是可以主动删掉的
本次逐一进行了增删尝试,主要是担心某些参数尽管去掉后不影响最终加载出来,但是可能会导致延迟或者卡顿,这非常影响用户体验

经过梳理,最终获得流畅视频的fvkey和url需要: base_url + vid + otype + guid + platform + sdtfrom + _qv_rmt

重新组装一遍精简的url:
https://vv.video.qq.com/getinfo?vid=z0024zqdzu1&otype=json&guid=21b1d1487c0e3886a2958dc5f2503b9a&platform=10201&sdtfrom=v1010&_qv_rmt=jBZ5pIl8A19213wFt%3D&_qv_rmt2=o6Qa4YDm149352oVg%3D

那么,这些参数从哪里来?解析一下:

https://vv.video.qq.com/getinfo?可以作为默认base_url
vid可以从视频页面或者源代码中提取
otype为固定的json格式
guid 暂时发现一台机子是固定的,也是限速,可能未必,是微软在作怪
platform固定的
sdtfrom固定的
_qv_rmt 限速技术,难搞, 到处找不到,每次都不一样,先用固定一个试试, 这是该爬虫成败的关键,因为我们认为,抓到一个虽然可以播放但是有瑕疵的视频,即是失败

最后组成了一个可以获取fvkey并且能够比较轻松组装的url, {}便于代码用format方法
https://vv.video.qq.com/getinfo?vid={vid}&otype={otype}&guid={guid}&platform={platform}&sdtfrom={sdtfrom}&_qv_rmt=jBZ5pIl8A19213wFt%3D&_qv_rmt2=o6Qa4YDm149352oVg%3D

所以,小黑板画重点了:
首先从播放页得到视频vid,代码省去这一环节,因为vid很好找
组成getinfo页面,得到fvkey
组成视频真实地址

好吧,实际上也不是什么重点, 因为每个抓取视频网站的爬虫都会经历这些阶段,那么不同在哪里呢?
1:观看了不少爬视频的帖子发现人们常说的getkey(即获取fveky的脚本)在现在的腾讯视频版本没有了,再次证明反爬技术日新月异,爬虫不进步很难生存了
2:腾讯视频极有可能在今年上线了新的限制技术, 即前面所说的_qv_rmt, 这个参数由特殊算法生成,每次请求都不一样,每台机子也不一样
猜测可能用了guid和时间戳等数据用一种算法合成,而且成对出现,去掉它的结果就是导致视频加载速度瞬间变成20k左右每秒,几乎一秒一卡,无法观看
如果不去掉它,如何生成呢?
不幸找遍了所有文件,没有找到答案, 所以暂时一成不变了,但是这肯定不是最终解决方案.
所以,有了勉强的源码示例, 但是用一成不变的_qv_rmt值一定时间内没有出问题, 这是一个谜

# 勉强源码示例
import requests
import re
import json
# vid就直接查找得到,正则影响效率太多
vid = input(请输入视频vid:)
# vid = ‘n1656e0z8xj‘

# 默认的参数
json_type=json
platform = 11001
guid=21b1d1487c0e3886a2958dc5f2503b9a
sdtfrom = v1010
# getinfo的base_url
base_info_url = https://vv.video.qq.com/getinfo?vid={vid}&otype={otype}&guid={guid}&platform={platform}&sdtfrom={sdtfrom}&_qv_rmt=jBZ5pIl8A19213wFt%3D&_qv_rmt2=o6Qa4YDm149352oVg%3D
# 真实地址的base_url
base_real_url = {self_host}/{vid}.mp4?vkey={fvkey}
# format方法生成getinfo
info_url = base_info_url.format(vid=vid, otype=json_type, guid=guid, platform=platform, sdtfrom=sdtfrom)

response = requests.get(info_url)
html = response.text
# 正则表达式提取json数据并序列化为json格式
data = re.search(=(.*);,html).group(1)
data = json.loads(data)
for each in data.get(vl).get(vi):
    fvkey = each.get(fvkey)
    self_host = each.get(ul).get(ui)[0].get(url)


# 组装视频真实地址
real_url = base_real_url.format(self_host=self_host, vid=vid, fvkey=fvkey)
print(视频真实地址为:,real_url)

最后,所有的爬虫技术都是针对当前页面的结构进行的,对于一些变化速率很高的网站,比如腾讯视频,抓到的地址很容易失效
这是因为生成key的算法十分复杂, 猜想有guid,时间戳,_qv_rmt等每时每刻都在变化的数据参与计算,目标只有一个:一般人休想永久的搞到地址
这是许多工程师昼夜在研究算法和加密技术的原因.
同时,针对页面的分析,还仅局限于所见即所得的状态,爬虫不会无中生有,虽然抓到的地址是裸源无广告,但是很依赖网页的动态加载技术和登陆限制,
也就是说,vip的视频比如只试看5分钟,在不登录前提下,源码中只放出了5分钟,剩余的部分无从找到,
所以对于另一种黑科技的研究--破解vip,仅从爬虫技术来看,还来日方长.

 

以上是关于抓腾讯视频真实地址总结的主要内容,如果未能解决你的问题,请参考以下文章

解析腾讯视频真实地址

解析腾讯视频真实地址

腾讯视频的地址解析下载

爬虫之Fiddler抓包腾讯视频

java视频教程百度网盘,成功入职腾讯

httpanalyzer怎么抓包