閒話不表,去除騰訊視頻廣告步驟: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