破解優酷VIP視頻


目錄

 

一 破解優酷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?&amp;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)
OOP
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)
function

 

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM