闲话不表,去除腾讯视频广告步骤:html
下面分别经过python实现这三个步骤的python
首先,定义一个qq视频处理对象,此文件命名为 txvideo.py,导入相关包web
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 = []
获取视频的vid,就是经过正则找到一个href 连接,获得连接尾部的一个值,即 vid, 实际上就是获取html 页面的这一行:
<link rel="canonical" href="https://v.qq.com/x/cover/mzc00200v8raugd/u00339s31q1.html" /> 中的 u00339s31q1chrome
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, 能够替换为你自身浏览器的头。json
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"]
视频类的主入口,若是传入了的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...app
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()
后记:ide
以上代码逻辑比较简单的,核心在于分析真实地址的流程,比较费劲,这里参考的是网上分析结果,若是tx的开发人员稍做改动,以上代码就会失效,截至到 2020.1.4 还能够。
另外在将代码从 pycharm 复制到此编辑器时,老是会增长 如还有多余的 请自行清除ui