123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- import requests
- import ujson
- import time
- import re
- import execjs
- from urllib.parse import quote
- class tencent:
- def __init__(self, url, timeout=None,cookie=''):
- self.url = url
- self.timeout = timeout or 2
- self.headers = {
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36¬",
- "cookie":cookie,
- }
- self.int_time = int(time.time())
- self.cookie = cookie
- self.cookie_dict = {}
- self.parse_cookie()
- def parse_cookie(self):
- if self.cookie:
- for i in self.cookie.rstrip(';').split(";"):
- kv = i.split("=")
- print(kv)
- self.cookie_dict[kv[0].strip()] = kv[1]
- print(self.cookie_dict)
- def get_vid(self):
- vipUrl = self.url
- vid = None
- if vipUrl.find('v.qq.com/x/cover/') > -1:
- _type = vipUrl.split("v.qq.com/x/cover/")[1].split(".html")[0]
- if _type.find('/') > -1:
- vid = _type.split("/")[1]
- else:
- r = requests.get(vipUrl, headers=self.headers)
- html = r.text
- vid = html.split('<link rel="canonical" href="https://v.qq.com/x/cover/')[1].split('/')[1].split('.')[0]
- else:
- if re.search('/page/.*\.html',vipUrl):
- vid = vipUrl.split("/page/")[1].split(".html")[0]
- else:
- if vipUrl.find('&vid=') > -1:
- vid = vipUrl.split("&vid=")[1].split("&")[0]
- print(f'vid:{vid}')
- return vid
- def get_adparams(self):
- pf = "in"
- ad_type = quote("LD|KB|PVL")
- pf_ex = "pc"
- url = quote(self.url)
- refer = quote("https://v.qq.com/")
- ty = "web"
- plugin = "1.0.0"
- v = "3.5.57"
- coverid = re.search("cover/(.*?).html", self.url).group(1)
- coverid = coverid.split('/')[0]
- # print(f'coverid:{coverid}')
- vid = self.get_vid()
- pt = ""
- flowid = "f48222928272c7950a794ffbea32022c_10901"
- vptag = quote("vptag=www_baidu_com|channel")
- pu = "1"
- chid = "0"
- adaptor = "2"
- dtype = "1"
- live = "0"
- resp_type = "json"
- guid = "2634e72faf052aa51f98971b2a68718c"
- req_type = 1
- # from = "0"
- appversion = "1.0.157"
- uid = self.cookie_dict['vqq_vuserid']
- tkn = self.cookie_dict['vqq_vusession']
- lt = "qq"
- platform = "10901"
- opid = self.cookie_dict['vqq_openid']
- atkn = self.cookie_dict['vqq_access_token']
- appid = self.cookie_dict['vqq_appid']
- tpid = "1"
- result = f"pf={pf}&ad_type={ad_type}&pf_ex={pf_ex}&url={url}&refer={refer}&ty={ty}&plugin={plugin}&v={v}&coverid={coverid}&vid={vid}&pt={pt}&flowid={flowid}&vptag={vptag}&pu={pu}&chid={chid}&adaptor={adaptor}&dtype={dtype}&live={live}&resp_type={resp_type}&guid={guid}&req_type={req_type}&from=0&appversion={appversion}&" \
- f"uid={uid}&tkn={tkn}<={lt}&platform={platform}&opid={opid}&atkn={atkn}&appid={appid}&tpid={tpid}"
- return result
- def get_vinfoparams(self):
- spsrt = "1"
- charge = "1"
- defaultfmt = "auto"
- otype = "ojson"
- guid = "2634e72faf052aa51f98971b2a68718c"
- # 随机数 + platform
- flowid = "f48222928272c7950a794ffbea32022c_10901"
- platform = "10901"
- sdtfrom = "v1010"
- defnpayver = "1"
- appVer = "3.5.57"
- host = "v.qq.com"
- ehost = quote(self.url)
- refer = "v.qq.com"
- sphttps = "1"
- tm = self.int_time
- spwm = "4"
- logintoken = quote(str({"main_login": self.cookie_dict['main_login'], "openid": self.cookie_dict['vqq_openid'],
- "appid": self.cookie_dict['vqq_appid'],
- "access_token": self.cookie_dict['vqq_access_token'],
- "vuserid": self.cookie_dict['vqq_vuserid'],
- "vusession": self.cookie_dict['vqq_vusession']}))
- # print(f'logintoken:{logintoken}')
- vid = self.get_vid()
- defn = "fhd"
- fhdswitch = "0"
- show1080p = "1"
- isHLS = "1"
- dtype = "3"
- sphls = "2"
- spgzip = "1"
- dlver = "2"
- drm = "32"
- hdcp = "1"
- spau = "1"
- spaudio = "15"
- defsrc = "1"
- encryptVer = "9.1"
- cKey = self.get_cKey(platform, appVer, vid, guid, tm)
- fp2p = "1"
- spadseg = "3"
- result = f"spsrt={spsrt}&charge={charge}&defaultfmt={defaultfmt}&otype={otype}&guid={guid}&flowid={flowid}&platform={platform}&sdtfrom={sdtfrom}&defnpayver={defnpayver}&appVer={appVer}&host={host}&ehost={ehost}&refer={refer}&sphttps={sphttps}&tm={tm}&spwm={spwm}&logintoken={logintoken}&vid={vid}&defn={defn}&fhdswitch={fhdswitch}&show1080p={show1080p}&isHLS={isHLS}&dtype={dtype}&sphls={sphls}&spgzip={spgzip}&dlver={dlver}&drm={drm}&hdcp={hdcp}&spau={spau}&spaudio={spaudio}&defsrc={defsrc}&encryptVer={encryptVer}&cKey={cKey}&fp2p={fp2p}&spadseg={spadseg}"
- return result
- def get_cKey(self, platform, version, vid, guid, tm):
- file = './js/getck.js'
- ctx = execjs.compile(open(file).read())
- params = ctx.call("getckey", platform, version, vid, '', guid,
- tm)
- return params
- def get_buid(self):
- return "vinfoad"
- def deal_data(self,data):
- # print(data)
- vinfo = ujson.loads(data['vinfo'])
- vl = vinfo['vl']
- urls = vl['vi'][0]['ul']['ui']
- # print(urls)
- try:
- pt = urls[-1]['hls']['pt']
- except:
- pt = ''
- url = urls[-1]['url']
- realUrl = url + pt
- print(realUrl)
- return realUrl
- def start(self):
- ad_params = self.get_adparams()
- vinfoparams = self.get_vinfoparams()
- buid = self.get_buid()
- params = {"buid": buid,
- "adparam": ad_params,
- "vinfoparam": vinfoparams}
- # print(params)
- res = requests.post("https://vd.l.qq.com/proxyhttp", headers=self.headers, json=params)
- data = res.json()
- return self.deal_data(data)
- if __name__ == '__main__':
- # 控制台执行 document.cookie 获取
- cookie = """
- pgv_pvid=5805499462; iip=0; RK=yQaYRyNLbG; ptcz=2a0d041daba2e1e3872184cd999e01bf90678c0e492c5900527c802251d224ad; tvfe_boss_uuid=53b5e88a3ebeba2c; ts_uid=8123938908; tvfe_search_uid=225c6955-d257-4d4a-97d0-cc327ffea211; txv_boss_uuid=95755769-e482-3a22-3e9f-6f8d842da1a7; pgv_pvi=1381712896; logTrackKey=613d40c3fea04aafb45fc9642dd67b99; video_platform=2; main_login=qq; vqq_vuserid=1260982452; vqq_openid=406CA2296D6A3B970597D6CF1605B6B7; vqq_appid=101483052; qq_nick=feng; pgv_info=ssid=s1368217315; pac_uid=1_434857005; vversion_name=8.2.95; video_guid=3419ca23530808d22bb278e881e46647; video_omgid=3419ca23530808d22bb278e881e46647; _qpsvr_localtk=0.710205836458567; compared_guid=bc772040638cf0da; vqq_access_token=88AEE1A8BC32318537BC7D81586E44A4; o_cookie=434857005; qv_als=vzJJwNyUEiCeDF1UA11662524934RoBNzA==; video_bucketid=4; fqm_pvqid=0a2a19f9-b09d-48d2-835a-cee916bdb63f; fqm_sessionid=a2c625f7-98e9-4d69-adb4-ad82846832bc; uin=o0434857005; skey=@rZMv3mYSR; tab_experiment_str=8752038#9047927#8752037#9040406#9099387; bucket_id=9231009; last_refresh_time=1666604352564; last_refresh_vuserid=1260982452; ts_refer=m.v.qq.com/; qq_head=http://thirdqq.qlogo.cn/g?b=sdk&k=llMfAicCbslpBk4funDukzg&s=100&t=318; vqq_vusession=sj85gfjn1ZL5jGI_RW5lLA.N; ptag=m_v_qq_com|channel; tab_experiment_data=exp_id=9099387&status=1; ts_last=v.qq.com/x/cover/m441e3rjq9kwpsc.html
- """.strip()
- login_token = """
- vqq_appid=101483052; vqq_openid=406CA2296D6A3B970597D6CF1605B6B7; vqq_vuserid=1260982452;vqq_vusession=Xd5bba2m9ByWls30Vi2FSQ.N; vqq_refresh_token=2D85975A29FB056EB6F9A338CB8F1EF5;vqq_next_refresh_time=6530;vqq_access_token=88AEE1A8BC32318537BC7D81586E44A4;main_login=qq;
- """.strip()
- auth_token = """
- vqq_appid=101483052; vqq_openid=406CA2296D6A3B970597D6CF1605B6B7; vqq_vuserid=1260982452;vqq_vusession=
- """.strip()
- cookie = login_token
- print(cookie)
- # refresh_url = 'https://access.video.qq.com/user/auth_refresh?vappid=11059694&vsecret=fdf61a6be0aad57132bc5cdf78ac30145b6cd2c1470b0cfe&type=qq&g_tk=1698594290&g_vstk=270754686&g_actk=2412125&callback=jQuery191028559957521840595_1666665357793&_=1666665357794'
- # headers = {
- # "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
- # "Referer":"https://v.qq.com/",
- # # "cookie":cookie,
- # "cookie":auth_token,
- # }
- # r = requests.get(refresh_url,headers=headers)
- # print(r.text)
- # 斗罗大陆
- url = 'https://v.qq.com/x/cover/m441e3rjq9kwpsc/c00442r6ry6.html'
- # 复仇者联盟
- # url = 'https://v.qq.com/x/cover/v2098lbuihuqs11/m00314jtw6k.html'
- vqq = tencent(url=url,cookie=cookie)
- vqq.start()
|