闲话不表,去除腾讯视频广告步骤:
- 通过请求某个视频在浏览器中的地址,分析页面返回,获取视频的vid
- 拼接接口地址,请求tx的某接口,获取视频的真实地址
- 通过selinum的webdriver,向chrome 传入真实的视频地址
下面分别通过python实现这三个步骤的
首先,定义一个qq视频处理对象,此文件命名为 txvideo.py,导入相关包
import time
import re
import json
from urllib import request
from selenium import webdriver
class TxVideo:
def __init__(self, burl):
self.qqurl = burl
#保存可能的异常信息
self.error = []
step1:
获取视频的vid,就是通过正则找到一个href 链接,得到链接尾部的一个值,即 vid, 实际上就是获取html 页面的这一行:
中的 u00339s31q1
def _get_vid2(self):
'''通过urllib分析vids,可免于上一方法中打开页面还是播放广告'''
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
req = request.Request(self.qqurl, headers\=headers)
html = request.urlopen(req).read().decode('utf-8')
#with open("video.html", 'w', encoding='utf-8') as f:
# f.write(html) match = re.search(r'canonical.\*?(\w+)\.html', html)
return match.group(1)
注意需要设置 http header 的user-agent, 可以替换为你自身浏览器的头。
step2
def _get_keys(self, vid):
jurl = 'http://vv.video.qq.com/getinfo?vids={0}&platform=101001&charge=0&otype=json'.format(vid)
# 返回的内容并不是json,而是 QZOutputJson={xxx} # 去掉头部的xx= 和尾巴上的 ;
jdata = json.loads(content[13:len(content)-1])
#这个json的层次很深,还不如直接用正则匹配
p = jdata['vl']['vi'][0]
urls = p['ul']['ui']
#找到其中链接为 vlive.qqvideo qqvideo = None
for item in urls:
if item["url"].find('vlive.qqvideo')>0 or item["url"].find('video.dispatch')>0:
qqvideo = item["url"]
break
if qqvideo is None:
self.error.append('未找到qqvideo相关链接,可尝试其它链接')
return None
return qqvideo, p["fn"], p["fvkey"]
step3
视频类的主入口,如果传入了的bopen 参数为 True 则打开chrome,直接播放
def getTrueMedia(self, bopen):
vid = self._get_vid2()
print("vid:", vid)
if vid is None:
return
keys = self._get_keys(vid)
#print("keys:", keys)
if len(keys) != 3:
self.error.append('分析JSON数据失败')
return
turl = '{0}{1}?vkey={2}'.format(keys[0], keys[1], keys[2])
if bopen:
self.driver = webdriver.Chrome('./lib/chromedriver.exe')
self.driver.get(turl)
return turl
使用方法:
通过在控制台传入视频地址,如下所示:
python view.py https://v.qq.com/x/cover/mzc0...
view.py 入口文件,接受控制台参数,简单如下
import sys
from txvideo import TxVideo
def main():
if len(sys.argv) == 1:
print("请输入tx视频网页地址")
return
txv = TxVideo(sys.argv[1])
#分析真实的url,并打开页面播放
txv.getTrueMedia(True)
errors = txv.geterror()
if errors is not None:
print(errors)
if __name__ == '__main__':
main()
后记:
以上代码逻辑比较简单的,核心在于分析真实地址的流程,比较费劲,这里参考的是网上分析结果,如果tx的开发人员稍作改动,以上代码就会失效,截至到 2020.1.4 还可以。
另外在将代码从 pycharm 复制到此编辑器时,总是会增加 如还有多余的 请自行清除