当前位置: 首页 > Web前端 > HTML5

腾讯视频广告实践

时间:2023-04-05 21:31:50 HTML5

闲话少说,去除腾讯视频广告步骤:通过在浏览器中请求一个视频的地址,分析返回的页面,获取视频的vid拼接接口地址,请求tx的某个接口,并获取视频通过selinum的webdriver将真实的视频地址传给chrome。首先定义一个qq视频处理对象,并将文件命名为txvideo.py,导入相关包importtimeimportreimportjsonfromurllibimportrequestfromseleniumimportwebdriverclassTxVideo:def__init__(self,burl):self.qqurl=burl#保存可能的异常信息self.error=[]step1:获取视频的vid,就是通过正则化找到一个href链接,得到链接末尾的一个值,即vid,其实就是获取html页面的行:vidsthroughurllib可以避免用前面的方法打开页面或播放广告'''headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36'}req=request.Request(self.qqurl,headers\=headers)html=request.urlopen(req).read().decode('utf-8')#withopen("video.html",'w',encoding='utf-8')作为f:#f.write(html)match=re.search(r'canonical.\*?(\w+)\.html',html)returnmatch.group(1)注意http头的user-agent需要设置,可以换成自己浏览器的headerstep2def_get_keys(self,vid):jurl='http://vv.video.qq.com/getinfo?vids={0}&platform=101001&charge=0&otype=json'.format(vid)#返回的内容不是json,butQZOutputJson={xxx}#去掉头部和尾部的xx=;jdata=json.loads(content[13:len(content)-1])#这个json层次很深,直接用正则匹配p=jdata['vl']['vi'][0]urls=p['ul']['ui']#查找链接为vlive.qqvideoqqvideo=Noneforiteminurls:ifitem["url"].find('vlive.qqvideo')>0或者item["url"].find('video.dispatch')>0:qqvideo=item["url"]breakifqqvideoisNone:self.error.append('没有找到qqvideo相关链接,可以试试其他链接')returnNonereturnqqvideo,p["fn"],p["fvkey"]step3视频类的主入口,如果bopen传入的参数为True打开chrome直接播放defgetTrueMedia(self,bopen):vid=self._get_vid2()print("vid:",vid)ifvid为None:returnkeys=self._get_keys(vid)#print("keys:",keys)iflen(keys)!=3:self.error.append('分析JSONdatafailure')returnturl='{0}{1}?vkey={2}'.format(keys[0],keys[1],keys[2])ifbopen:self.driver=webdriver.Chrome('./lib/chromedriver.exe')self.driver.get(turl)returnturl使用方法:在控制台传入视频地址,如下图:pythonview.pyhttps://v.qq。com/x/cover/mzc0...view.py入口文件,接受控制台参数,简单如下importsysfromtxvideoimportTxVideodefmain():iflen(sys.argv)==1:print("PleaseinputtxVideowebaddress")returntxv=TxVideo(sys.argv[1])#解析真实url,打开页面播放txv.getTrueMedia(True)errors=txv.geterror()iferrorsisnotNone:print(errors)if__name__=='__main__':main()后记:上面代码的逻辑比较简单。核心在于解析真实地址的过程,比较费力。这里参考网上的分析结果。如果tx的开发者稍微改动一下,上面的代码就会失效。从2020.1.4开始,也可以在从pycharm复制代码到这个编辑器时添加。如有多余请自行清除。参考:https://mp.weixin.qq.com/s/ea...