闲话不表,去除腾讯视频广告步骤:

  1. 通过请求某个视频在浏览器中的地址,分析页面返回,获取视频的vid
  2. 拼接接口地址,请求tx的某接口,获取视频的真实地址
  3. 通过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 页面的这一行:
<link rel="canonical" href="https://v.qq.com/x/cover/mzc00200v8raugd/u00339s31q1.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 复制到此编辑器时,总是会增加 如还有多余的 请自行清除

参考:https://mp.weixin.qq.com/s/ea...


neveryield
49 声望4 粉丝

资深互联网 noiser