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)