Python脚本代码
import re, requests, time, subprocess, json, base64 from hashlib import md5 class YouKu: def __init__(self, cookie): self.cookie = cookie def youku_sign(self, t, data, token): appKey = '24679788' # 固定值 '''token值在cookie中''' sign = token + '&' + t + '&' + appKey + '&' + data md = md5() md.update(sign.encode('UTF-8')) sign = md.hexdigest() return sign def utid(self): cna = re.compile("cna=(.*?);") _m_h5_tk = re.compile("_m_h5_tk=(.*?)_.*?;") token = _m_h5_tk.findall(self.cookie+";") utid_ = cna.findall(self.cookie+";") return {"utid": utid_[0], "token": token[0]} # 若直接在首页小窗口上复制的视频网址,是重定向的网址。 def redirect(self, url): headers = { "referer": "https://www.youku.com/", "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36", } resp = requests.get(url=url, headers=headers) return resp.url def page_parser(self, url): headers = { "authority": "v.youku.com", "method": "GET", "path": url.replace("https://v.youku.com/",""), "scheme": "https", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "accept-encoding": "gzip, deflate, br", "accept-language": "zh-CN,zh;q=0.9", "cache-control": "max-age=0", "cookie": self.cookie, "referer": "https://www.youku.com/", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "none", "sec-fetch-user": "?1", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36", } resp = requests.get(url=url, headers=headers) html = resp.content.decode("utf-8") # print(html) videoId = re.compile("videoId: '(.*?)'") showid = re.compile("showid: '(.*?)'") currentEncodeVid = re.compile("currentEncodeVid: '(.*?)'") videoId = videoId.findall(html, re.S | re.M | re.I) current_showid = showid.findall(html, re.S | re.M | re.I) vid = currentEncodeVid.findall(html, re.S | re.M | re.I) return {"current_showid": current_showid[0], "videoId": videoId[0], "vid": vid[0]} def get_emb(self, videoId): emb = base64.b64encode(("%swww.youku.com/" % videoId).encode('utf-8')).decode('utf-8') return emb # 这个函数用来获取元素的第一个值 def takeOne(self, elem): return float(elem[0]) def m3u8_url(self, t, params_data, sign): url = "https://acs.youku.com/h5/mtop.youku.play.ups.appinfo.get/1.1/" params = { "jsv": "2.5.8", "appKey": "24679788", "t": t, "sign": sign, "api": "mtop.youku.play.ups.appinfo.get", "v": "1.1", "timeout": "20000", "YKPid": "20160317PLF000211", "YKLoginRequest": "true", "AntiFlood": "true", "AntiCreep": "true", "type": "jsonp", "dataType": "jsonp", "callback": "mtopjsonp1", "data": params_data, } headers = { "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive", "Cookie": self.cookie, "Host": "acs.youku.com", "Referer": "https://v.youku.com/v_show/id_XNTA1MTYwMzU0OA==.html?spm=a2h0c.8166622.PhoneSokuUgc_3.dscreenshot", "Sec-Fetch-Dest": "script", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-site", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36", } resp = requests.get(url=url, params=params, headers=headers) result =resp.text # print(result) data = json.loads(result[12:-1]) # print(data) ret = data["ret"] video_lists = [] if ret == ["SUCCESS::调用成功"]: stream = data["data"]["data"]["stream"] title = data["data"]["data"]["video"]["title"] print("解析成功:") for video in stream: m3u8_url = video["m3u8_url"] width = video["width"] height = video["height"] size = video["size"] size = '{:.1f}'.format(float(size) / 1048576) video_lists.append([size, width, height, title, m3u8_url]) # print(f">>> {title} 分辨率:{width}x{height} 视频大小:{size}M tm3u8播放地址:{m3u8_url}") video_lists.sort(key=self.takeOne) for video_list in video_lists: print(f">>> {title} 分辨率:{video_list[1]}x{video_list[2]} 视频大小:{video_list[0]}M tm3u8播放地址:{video_list[4]}") self.play(video_lists[-1][4]) # 选择播放列表最后一个视频(经过sort排序后,最后一个即为清晰度最高的一个) elif ret == ["FAIL_SYS_ILLEGAL_ACCESS::非法请求"]: print("请求参数错误") elif ret == ["FAIL_SYS_TOKEN_EXOIRED::令牌过期"]: print("Cookie过期") else: print(ret[0]) def play(self, x): text = 'ffplay -protocol_whitelist "file,http,https,rtp,udp,tcp,tls" -loglevel quiet -i "%s"' % x subprocess.call(text, shell=True) def start(self): t = str(int(time.time() * 1000)) user_info = self.utid() userid = user_info["utid"] url = input("请将优酷视频播放链接粘贴到这:n") url = self.redirect(url) page_info = self.page_parser(url) emb = self.get_emb(page_info["videoId"]) params_data = r'''{"steal_params":"{"ccode":"0502","client_ip":"192.168.1.1","utid":"%s","client_ts":%s,"version":"2.1.69","ckey":"DIl58SLFxFNndSV1GFNnMQVYkx1PP5tKe1siZu/86PR1u/Wh1Ptd+WOZsHHWxysSfAOhNJpdVWsdVJNsfJ8Sxd8WKVvNfAS8aS8fAOzYARzPyPc3JvtnPHjTdKfESTdnuTW6ZPvk2pNDh4uFzotgdMEFkzQ5wZVXl2Pf1/Y6hLK0OnCNxBj3+nb0v72gZ6b0td+WOZsHHWxysSo/0y9D2K42SaB8Y/+aD2K42SaB8Y/+ahU+WOZsHcrxysooUeND"}","biz_params":"{"vid":"%s","play_ability":16782592,"current_showid":"%s","preferClarity":99,"extag":"EXT-X-PRIVINF","master_m3u8":1,"media_type":"standard,subtitle","app_ver":"2.1.69","h265":1}","ad_params":"{"vs":"1.0","pver":"2.1.69","sver":"2.0","site":1,"aw":"w","fu":0,"d":"0","bt":"pc","os":"win","osv":"10","dq":"auto","atm":"","partnerid":"null","wintype":"interior","isvert":0,"vip":1,"emb":"%s","p":1,"rst":"mp4","needbf":2,"avs":"1.0"}"}'''% (userid, t[:10], page_info["vid"], page_info["current_showid"], emb) sign = self.youku_sign(t, params_data, user_info["token"]) self.m3u8_url(t, params_data, sign) if __name__ == '__main__': # 首先在这里设置自己的cookie 非vip只能解析到免费视频。 cookie = '__ysuid=21059a310000087e5fcbb3ee0000a58b; __yscnt=1; P_gck=NA%7CMvLpuothPGV815HV%2B4HBtQ%3D%3D%7CNA%7C1622106293483; disrd=26765; UM_distinctid=179ebdf5fdf38-053a25f2c96ee7-3e604809-1fa400-179ebdf5fe0376; cna=rQ1fGTsJrDcCAXO/hcGilGH2; __aysid=1625988129582bId; youku_history_word=%5B%22mv%22%2C%22%25E6%25A2%25A6%25E5%25B9%25BB%25E8%2583%258C%25E6%2599%25AF%25E7%25B4%25A0%25E6%259D%2590%22%2C%22%25E5%2585%2589%25E6%2599%2595%25E6%2595%2588%25E6%259E%259C%22%2C%22%25E5%2587%25AD%25E6%259C%25AC%25E4%25BA%258B%22%5D; P_pck_rm=fCj4xhhC086e9d5dafc44cZBc5UiiyUyR3DRaThifoJ0gOGm8ZOO%2BUMCE0pqY%2BjUMdFwZCWJGNZyfpRDiuFsjU05f1Wxunk5LO6fCSR%2BRxZx6X3lqIEceioFT64UeSgWuwpeRZYq5Xx4ZQBJDZbY1rIy57hFGCr0v0asOU0A3ItzovUbUqLMrwhu8mg%3D_V2; ysestep=1; yseidcount=1; ystep=1; juid=01faf0ro0ll51; xlly_s=1; ctoken=TwV5wIfcJQnCpzKOqQz8ISZd; _m_h5_tk=925b5e7437862a512deb2fedd0f5a385_1626890538888; _m_h5_tk_enc=5b83dbbea7e7b91e3ad88244c709814c; __ayft=1626885496557; __ayscnt=1; P_ck_ctl=707B8AC23F1FDFD594965F78DE614599; isg=BFdXdtc1-1a4AkDpLbeWc0ME5suhnCv-yBmpK6mE4yax2HUasW_8TA6wPnhGMAN2; l=eBOegfIlOee8pmAsBO5aFurza77OmIRbzsPzaNbMiInca6wlGUErbNCBWaiHPdtjgtfj4etPkdi_7d39Sya_WjDDBeYCyHEOAxv9-; tfstk=c1k1BOTkJNb_l2RVQctFgX01VQwdaqS7cCaifb21raThuImaJs4VUzaG4jbv3zEC.; __arpvid=1626885539497WCtEjY-1626885539597; __arycid=dv-3-00; __arcms=dv-3-00; __aypstp=2; __ayspstp=91; modalFrequency={"UUID":"2"}; __ayvstp=1; __aysvstp=4' youku = YouKu(cookie) youku.start()
使用须知
设置了解析完成后,立即播放。利用的是 ffmpeg . 自行百度安装一下。 不装应该也可以用,只是播放报错而已!!!
m3u8
2023-11-16 40m3u8是一种常见的视频文件格式,它主要用于流媒体播放.使用m3u8文件需要专业的播放器,我的站长站为大家整理了许多支持m3u8格式的播放器.同时我们也整理了许多m3u8...
- m3u8下载工具,支持在线播放m3u8 [2023-11-16]
- m3u8视频在线提取+合并下载+格式转换网页源码 [2023-10-10]
- 在线m3u8播放器PHP源码V3款 [2023-09-10]
- M3U8视频下载器3.13.3,多线程/断点续传/自动合并转码 [2023-08-08]
- M3U8流媒体视频下载器V1.0.0.0.7 [2023-06-08]