騰訊視頻去廣告實踐

閒話不表,去除騰訊視頻廣告步驟:html

  1. 經過請求某個視頻在瀏覽器中的地址,分析頁面返回,獲取視頻的vid
  2. 拼接接口地址,請求tx的某接口,獲取視頻的真實地址
  3. 經過selinum的webdriver,向chrome 傳入真實的視頻地址

下面分別經過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 = []

step1:

獲取視頻的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

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...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

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

相關文章
相關標籤/搜索