目錄
一 破解優酷VIP視頻

import requests import re import json HEADERS = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36' } ''' 破解優酷VIP視頻 ''' class web(): def __init__(self): self.api = "http://y.mt2t.com/lines?url=" # 在線解析視頻平台 self.url = "https://v.youku.com/v_show/id_XNDEwNTMzMzM2OA==.html" # 需要解析的VIP視頻網站 self.name = None self.post_url1 = "http://y.mt2t.com/lines/getdata" # 解析平台上獲取的1號端口,用於收集video的地址 self.post_url2 = 'http://y2.mt2t.com:91/ifr/api' # 解析平台上獲取的m3u8視頻段提供端口 # 發送解析請求通過re正則獲取key的值 def find_key(self): # 通過訪問解析平台api與需要解析的VIP視頻網站 res = requests.get(self.api + self.url) # 獲取文本 html = res.text key = re.search(r'key:"(.*?)"', html).group(1) # 通過解析平台找到ajax請求中的data中的key # print(key) return key # 對原來的url進行修改,得出完整的url def url_spilt(self, url): # 將拿到的viedo視頻段進行轉碼,再做切分獲得類型和所需的data體中的視頻地址 ''' <script type="text/javascript"> var url="usZehnz38ibymr+ghLS1yGrU7tBqDcTQETbMfdhmceJxo2Y1QIbrmjQElPgxaXjmVIzB0qqL9GoUYCXdSd8GYA=="; var type="m3u8"; var api="/ifr/api"; var device=""; player(api,url,type,device,0); </script> # 訪問這個鏈接,內部會有上述ajax請求獲取視頻 usZehnz38ibymr+ghLS1yGrU7tBqDcTQETbMfdhmceJxo2Y1QIbrmjQElPgxaXjmVIzB0qqL9GoUYCXdSd8GYA== http://y2.mt2t.com:91/ifr?url=usZehnz38ibymr%2bghLS1yGrU7tBqDcTQETbMfdhmceJxo2Y1QIbrmjQElPgxaXjmVIzB0qqL9GoUYCXdSd8GYA%3d%3d&type=m3u8' ''' # 對列表中的第一個url里面的字符進行特換 # 有些視頻的鏈接是有 %2f 需要替換成 / url_param = url.split("?url=")[1].split("&")[0].replace("%2b", "+").replace("%3d", "=").replace("%2f", "/") # 獲取 m3u8 movie_type = url.split("type=")[1] return url_param, movie_type # 采集視頻 def get_playlist(self): '''# 飛馳人生: <script type="text/javascript"> $(document).ready( function () { $.ajax({ type: "post", dataType: "json", url: "/lines/getdata", # 1.需要獲取的url http://y.mt2t.com/lines/getdata # 2.獲取key值 data:{url:"http://v.youku.com/v_show/id_XNDEwNTMzMzM2OA==.html",type:"",key:"a0b923820dcc509a"}, success:ShowMenu });} ); </script> ''' # 調用find_key方法獲取vip視頻中data的key key = self.find_key() data = { "url": self.url, "key": key, } # 獲取VIP所需的KEY之后向1號端口發送data包來獲取所需的viedo視頻段 html = requests.post(self.post_url1, data=data).text dic = json.loads(html) print(dic) ''' # 往解析平台發送post請求獲取的是一個json數據,里面有整部電影分切成的幾個視頻鏈接 # 第一個鏈接就是全部的視頻了!!! 凡是m3u8后綴的鏈接都隱藏着視頻 [{'Url': 'http://y2.mt2t.com:91/ifr?url=usZehnz38ibymr%2bghLS1yGrU7tBqDcTQETbMfdhmceJxo2Y1QIbrmjQElPgxaXjmVIzB0qqL9GoUYCXdSd8GYA%3d%3d&type=m3u8', 'Video_type': '1', 'Vid': None, 'Scheme': 'auto'}, {'Url': 'http://y2.mt2t.com:91/ifr?url=usZehnz38ibymr%2bghLS1yBx%2fLeW6zBPvlnirzwVAPb22uUqY7Lurs2njqvy41H%2fP56dP%2bJxZNyUrXMTBI9wDCg%3d%3d', 'Video_type': '1', 'Vid': None, 'Scheme': 'auto'}, {'Url': 'http://y2.mt2t.com:91/ifr?url=a6tgiq6l1aQQZzObpXfOZ8U46WROtjYnUG5ZzktCdBFLPGVOTRFWXddcBGY61OgLBMh9uvHbmq7StHt5J1YqsQ%3d%3d', 'Video_type': '1', 'Vid': None, 'Scheme': 'auto'}, {'Url': 'http://y2.mt2t.com:91/ifr?url=KuT7Bg63M9X8euMJDPneBFvHMMyUaXi9G3Pu5CiJRWLODtsR9maZGFrrtetCrKTE', 'Video_type': '1', 'Vid': None, 'Scheme': 'auto'}, {'Url': 'http://y2.mt2t.com:91/ifr?url=HAoUzVAntrQdCkvIryzh%2bCLfbHCa6F1N%2fdmTpLCjBpzarEGkP6zvW36iGCLJ1Qt9', 'Video_type': '1', 'Vid': None, 'Scheme': 'auto'}, {'Url': 'http://y2.mt2t.com:91/ifr?url=4v6ceQdhfTwrhJ5xfngkjQST%2fCa1dsHxOZXRmFQSiLRQIv6FZ58v%2fW1%2b53Zkfz0uy30gLudsy1Cd9GAYjVudWp5x4z8EBN7C1NDeLNGpUmE%3d', 'Video_type': '1', 'Vid': None, 'Scheme': 'auto'}, {'Url': 'http://y2.mt2t.com:91/ifr?url=4v6ceQdhfTwrhJ5xfngkjQST%2fCa1dsHxOZXRmFQSiLRQIv6FZ58v%2fW1%2b53Zkfz0utK4DajZZFp2swCbcqN1J3w%3d%3d', 'Video_type': '1', 'Vid': None, 'Scheme': 'auto'}] ''' # 把列表中的第一個視頻鏈接去做處理,獲取完整的url url_param, type = self.url_spilt(dic[0]["Url"]) ''' <script type="text/javascript"> var url="usZehnz38ibymr+ghLS1yGrU7tBqDcTQETbMfdhmceJxo2Y1QIbrmjQElPgxaXjmVIzB0qqL9GoUYCXdSd8GYA=="; var type="m3u8"; var api="/ifr/api"; var device=""; player(api,url,type,device,0); </script> ''' # 往此地址發送ajax請求獲取視頻數據 res = requests.post(self.post_url2, data={ "url": url_param, "type": '', "from": "mt2t.com", "device": "", "up": 0 }) # 返回json視頻數據 play = json.loads(res.text) self.save_movie(play) def save_movie(self, play): with open('%s.mp4' % self.name, 'wb') as f: f.write(play) # if __name__ == '__main__': # vip = web() # vip.get_playlist() ''' 批量獲取電影所有的名稱與鏈接. 電影詳情接口: https://list.youku.com/category/page?c=96&pt=2&type=show&p=1 https://list.youku.com/category/page?c=96&pt=2&type=show&p=2 https://list.youku.com/category/page?c=96&pt=2&type=show&p=3 https://list.youku.com/category/page?c=96&pt=2&type=show&p=4 https://list.youku.com/category/page?c=96&pt=2&type=show&p=5 每個接口的所有詳情信息: {'success': True, 'message': '', 'data': # 數據 [{'summaryType': 'UPDATE_STATUS', 'access': 'allow', 'type': 'vertical', 'img': '//r1.ykimg.com/051640005C8B7F56859B5D5D300E06C1', 'summary': '正片', 'title': '籃球冠軍', # 電影名稱 'subTitle': '傲慢教練與怪異球隊', 'videoId': 'XNDE4MzY4NjUzNg==', 'videoLink': '//v.youku.com/v_show/id_XNDE4MzY4NjUzNg==.html'} # 電影詳情鏈接 ... ] vip電影鏈接div: <div id="dramaFixedWrap" class="drama-fixed-wrap"> <div class="item item-cover item-cover-fixed active" item-id="item_XNDE4MzY4NjUzNg==" title="籃球冠軍"> <a href="//v.youku.com/v_show/id_XNDE4MzY4NjUzNg==.html?&s=eccc9254a71842e09356"> # 需要解析的鏈接 <a href="(.*?)"> <div class="cover"><img src="https://vthumb.ykimg.com/054102015CDD1E950000017A690856DF"></div> <div class="title">籃球冠軍</div> </a> </div> <i class="scroll-fixed"></i> </div> ''' import requests # 獲取全部電影主頁的json數據 def parse_index(url): res = requests.get(url) data = res.json() return data.get('data') # 保留 電影名稱 與 電影鏈接 放進生成器內 def get_vip_movie(datas): # print(data) for data in datas: # print(data) # 電影名稱 title = data.get('title') # 拼接完整的電影鏈接 video_link = 'https:' + data.get('videoLink') yield title, video_link # url = 'https://list.youku.com/category/show/c_96_pt_2.html?spm=a2ha1.12701310.app.5~5!2~5~5~5~DL!6~DD~A!3' if __name__ == '__main__': base_url = 'https://list.youku.com/category/page?c=96&pt=2&type=show&p={}' vip = web() for line in range(1, 11): url = base_url.format(line) # 解析電影的每一個接口,獲取所有電影接口的json數據 data = parse_index(url) # 接收到N個電影名字與電影鏈接的生成器 vip_movies = get_vip_movie(data) # print(vip_movies) for movies in vip_movies: # 電影名稱與電影url name, link = movies vip.name = name vip.url = link vip.get_playlist() print(name, link) # parse_link(name, link)

import requests import re import json def parse_url(list1): for line in list1: line = line + '.ts' res = requests.get(line) print(res.text) yield line api = "http://y.mt2t.com/lines?url=" # 在線解析視頻平台 # # 正義聯盟 url = "https://v.youku.com/v_show/id_XNDA0MjYzNzgyMA==.html?spm=a2h03.12024492.drawer7.dzj1_4&scm=20140719.rcmd.1698.show_cc129064962411de83b1" # 需要解析的VIP視頻網站 # 比悲傷更悲傷的故事 # url = "https://v.youku.com/v_show/id_XNDE3NjQ2MTQ0OA==.html?spm=a2h0j.11185381.listitem_page1.5~A&&s=0bfa8c056436451c9d47" # 需要解析的VIP視頻網站 api_url_2 = 'http://y2.mt2t.com:91/ifr/api' # 解析平台上獲取的m3u8視頻段提供端口 api_url = api + url api_res = requests.get(api_url) # 往解析平台發送請求獲取的響應文本中我們發現里面包含了一個ajax請求 # print(api_res.text) ''' <script type="text/javascript"> $(document).ready( function () { $.ajax({ type: "post", dataType: "json", url: "/lines/getdata", data:{url:"http://v.youku.com/v_show/id_XNDA0MjYzNzgyMA==.html",type:"",key:"a0b923820dcc509a"}, success:ShowMenu });} ); </script> 接下來我們獲取這地址的相關數據,然后模擬這個ajax請求 ''' # 通過解析平台找到ajax請求中POST請求url、data中的url、data中的key post_url, movie_url, key = re.findall(r'url: "(.*?)".*?data:{url:"(.*?)".*?key:"(.*?)"', api_res.text, re.S)[0] # 拼接解析平台上獲取的1號端口,用於收集video的地址 post_url = "http://y.mt2t.com" + post_url # print(post_url) # print(post_url, movie_url, key) data = { 'url': movie_url, 'key': key } # 發送post請求返回的是一個響應文本 response = requests.post(post_url, data=data) # print(response.text) # 需要對文本進行一個反序列化成json格式的數據 json_data = json.loads(response.text) # 發現發送完ajax請求以后還得發送第二次 ''' 請求url: http://y2.mt2t.com:91/ifr/api 請求方式: POST 請求體: 需要對請求參數進行格式化 h9MjvCpkvRUdjqRNwPyEzm6lVb74WEQWtduwJ3qhTv9moH9hcwtf61EG67N17Wyjh85y8GwYRlvozCiftcdTQg%3d%3d&type=m3u8 url: h9MjvCpkvRUdjqRNwPyEzm6lVb74WEQWtduwJ3qhTv9moH9hcwtf61EG67N17Wyjh85y8GwYRlvozCiftcdTQg== type: m3u8 from: mt2t.com device: up: 0 ''' for line in json_data: # print(line['Url']) url = line['Url'] # 需要對請求參數進行格式化 url_param = url.split("?url=")[1].split("&")[0].replace("%2b", "+").replace("%3d", "=").replace("%2f", "/") print(url_param) data = { 'url': url_param, 'type': '', 'from': 'mt2t.com', 'device': '', 'up': 0 } res = requests.post(api_url_2, data=data) # print(res.text) # json_data2 = json.loads(res.text) json_data2 = res.json() print(json_data2) if json_data2: if json_data2['url'].endswith('.mp4'): movie_url = json_data2['url'] print(movie_url)