抓取加密ts视频,并合并转成MP4


# -*- coding:utf-8 -*-
import os
import random
import sys
from imp import reload

import requests
import datetime
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

# reload(sys)
# sys.setdefaultencoding('utf-8')


def download(url):
    download_path = os.getcwd() + "\download"
    if not os.path.exists(download_path):
        os.mkdir(download_path)

    # 新建日期文件夹
    download_path = os.path.join(download_path, datetime.datetime.now().strftime('%Y%m%d_%H%M%S'))
    # print download_path
    os.mkdir(download_path)

    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}

    all_content = requests.get(url,headers=headers).text  # 获取第一层M3U8文件内容
    if "#EXTM3U" not in all_content:
        raise BaseException("非M3U8的链接")

    if "EXT-X-STREAM-INF" in all_content:  # 第一层
        file_line = all_content.split("\n")
        for line in file_line:
            if '.m3u8' in line:
                url = url.rsplit("/", 1)[0] + "/" + line  # 拼出第二层m3u8的URL
                all_content = requests.get(url).text

    file_line = all_content.split("\n")

    unknow = True
    key = ""
    for index, line in enumerate(file_line):  # 第二层
        if "#EXT-X-KEY" in line:  # 找解密Key
            method_pos = line.find("METHOD")
            comma_pos = line.find(",")
            method = line[method_pos:comma_pos].split('=')[1]
            print ("Decode Method:", method)

            uri_pos = line.find("URI")
            quotation_mark_pos = line.rfind('"')
            key_path = line[uri_pos:quotation_mark_pos].split('"')[1]
            key_url = 'https://yunke.zto.com' + key_path
            # key_url = url.rsplit("/", 1)[0] + "/" + key_path  # 拼出key解密密钥URL
            res = requests.get(key_url,headers=headers)
            key = res.content
            print ("key:", key)

        if "EXTINF" in line:  # 找ts地址并下载
            unknow = False
            # pd_url = url.rsplit("/", 1)[0] + "/" + file_line[index + 1]  # 拼出ts片段的URL
            pd_url = file_line[index + 1]
            print (pd_url)

            res = requests.get(pd_url,headers=headers)
            import time
            time.sleep(random.uniform(0,1))
            c_fule_name = file_line[index + 1].rsplit("/", 1)[-1]

            if len(key):  # AES 解密
                cryptor = AES.new(key, AES.MODE_CBC, key)
                with open(os.path.join(download_path, c_fule_name + ".mp4"), 'ab') as f:
                    f.write(cryptor.decrypt(res.content))
            else:
                with open(os.path.join(download_path, c_fule_name), 'ab') as f:
                    f.write(res.content)
                    f.flush()
    if unknow:
        raise BaseException("faile 未找到对应的下载链接")
    else:
        print ("下载完成over")
    merge_file(download_path)


def merge_file(path):
    os.chdir(path)
    cmd = "copy /b * new.tmp"
    os.system(cmd)
    os.system('del /Q *.ts')
    os.system('del /Q *.mp4')
    os.rename("new.tmp", "new.mp4")


if __name__ == '__main__':
    # url = "http://cdn.can.cibntv.net/12/201702161000/rexuechangan01/rexuechangan01.m3u8"
    # 01一对一培训与演练
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6420830&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCai%2BJjv06U%2FAL5P4RaavxHNtkYrIHBdXgbqVxvhSkNA5vXZmx1ezAGljpFLyyNfEk%2FGtY5bzq4CpwtXcWhVAcsp5mYWu2WKPGjXG%2BbRVSQvGyHD55yqgBRic9V29Yyww3z6vkITmtaAyk6KH%2Bw4T1BCWFDUUUAtMhl0GtuXdmMVCfiMA8l9cQC6g%2BQmDC9obGeepAjQT%2FbtqPySfr%2FbCXiHmOv5edS0keojwjI5IsP24hv6w73wl%2BIT5lnh2ikZU%2B8*******'
    ## 02现代管理基础理论上
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6420831&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCajgG%2BmMm4ptZzluNkugrNgViK3VMHJS3Ks0zJ7a38val7vB2h%2BTPcgOJIxFzXD7jLocxIXyuQChuBXdU5%2BkBer5Ahk53HJm8j4pQSPrT4JpayMZmIVZ7GjVQ%2BMfNy91OuMwau%2Br1taPDKtHIrbUtTFXjrUnbmmN59UO%2Fdn64nD9XoMRDYeoPj5wafY2%2Fw1%2FPbeQJrpJI9KjIvO4QyEaszbL5l3PNXAxyxppVUmwnz6Z5b3Vo2TXhUOogNPC4uWdIw******'
    # 03现代管理基础理论上下
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6451299&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCa0RmUwLRYR5etKx9%2FL%2FZVvih1qsPGTPWcNZKQ%2Bu%2B3uLhpK%2FJdwoM6WMb2WKPl0rSVJq%2BetRhDgQ9SMhiOdnyK0a5LXLZuMxLHAmQGTTzWF0ako8OgA9wMQnruGJvVLzG8Tkzva%2FYW%2By9yb0So9Nc26Kxu1oWGUDuAjwIKnjjz40eZcrnsJewNB%2BKsYbJQv%2FAXy7TeQtntbV6Bv5EGphY7zYFFqumvLnkYv65L1GbHr1UFLBSamZ5EFVFWPM6dq6ug******'
    # 04职业生涯规划上
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6420832&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCZruN2FztypfZifUy3UKHCrbUSMDQRBhFeLjIOcFUjQGFMrzXDd1I8QiVI9TR0MpZIF%2B8IbaUsBvK7F4oQeICbfXe2%2Fvmy9W2f%2BLE7ch%2B0JjazjyGDb8goeuXjDwkz7yAY126d%2BQ%2BBy5azxQYlO9V90xaGLlv9mEKGzW%2FijWKKFJ8LsxM%2FFQQ5Wc1Z23Z%2Fynn%2FWmAjdZFMhidtAdKu6Kb%2F61eqZs%2BZYqCyRRTsZwXu6d%2B0wyckpuu6VX6J4eWFXwJ******'
    # 05职业生涯规划中
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6420833&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCapgn8eYo91snLM9duCziFWIYGoBOYXSsx6lLosd6u9ZHb8piPsI9UMn6ar02z2mxSXP9QtnVROmOKiO6wOt5mRB%2FWECwKgObIPJJraAYpFeN4yee%2B4zkn5A3dZW1C3aU1xQc8QTZI0Td95wd4Pu0SQi1SyJRq8XU8fnaBxdBXsa2Hca9uI96HYsKCToyF0ckW0%2FEhq5fjaK1cj2ALjoR7vv%2Fwn%2B5K44HLbqMJ8xUUTobnSXcG5CcwrVC9AIXMzTrQ******'
    # 06职业生涯规划下
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6451300&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCasx1yxlM1lrk2KruIAN2D6q9cwJL6ENcfD2yOCTB6VFWmrU333wMXbvPbRs6aKLKau%2BJsVsPFEWWatNgkF5PjzskpkLANx7CxnuUPZfC7jW2OgML6RbFOWsY%2BkQ9MbpZkTkzva%2FYW%2By9yb0So9Nc269jl%2FTiLoHjzRq7s3QBR0eSWIWWqMlN4Jt1rkbgf1Tk9Ac7c0wz%2BwCquWvXDLM2oJnJWadt2ScKrCOkT%2FNj10BsWzJr6Jj2AJYtM5uL%2Bhqd*******'
    # 07swot上
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6420834&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCYFl1%2Fd0WkVLjbtnZRFCUjiB8NsQow3o2Xh7hXcbGlnhkfbAXGrlc%2Bzc2%2BR5WqWoVx0NWJguo8dVMAEa6K2doh5GWWOLzeBUdmVOsLVJSsPRmxZkJjCguUfYezITBmVq56XjiFcLebTm4OZI83N0MI%2BYPRNADNXUyPuML3H9EfTupUPpBBSQsuvhQqWsbW4Zn7Ukhb0FN6d%2F8rvNd%2FjTQW3z7BAPKuPjF2E7h7YBLGkE%2FGdZyd8jQ5Zlb429tfM0w******'
    # 08swot下
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6451301&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCZZzRButRI%2Bchq0VUzNlxA5s4cOxh5qGT7TEOF7peypGTr5xhdjl2FjWPD1GYaQ0mkKL%2FZ3Ehx5ZufMqIo9UF1bkalDI6J0UU%2BWZzICJRVY1sp9xBd%2B%2B29t%2BMJ15JV1psl%2BFyX%2FSXdy7cJcnPCnkKFWWPaLAnF6tidEJz1WdOxGQeRVkLApCLQS5WAZ7eKNuMvj4DyjOzjYtE6%2B0AAu2l2%2F%2F1Ss1cp5%2F5cX45RiJecWoxeHw0kSgDA6NrX3UgxbmL******'
    # 09公文写作上
    # url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6420845&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCbNx5z73T9jqg9KLxt5lqhx8VV43hreAHHh8cI72haV3f0J9vssqtp9fS284UOKfJYkf4NulVTlsd25BpNAz2BZ2B6h2rNZBur%2BYb%2BoqS1sVckXys9XvbolagjnjGilnf5xQc8QTZI0Td95wd4Pu0SQzvqG5C6m2eZSY6Jxj5iq3USRHGZM4LuxT7gWsmUPKPkEQhvCn3TrmFBoBpmGn74zMTstpkFfIdL4Zi3vmEIpbn7JG1lIF5gyKSvQYp0XAg******'
    # 10公文写作下
    url = 'https://yunke.zto.com/api/common/mu/getMyM3u8.m3u8?courseWareId=6451302&key=s5VcBNQ3pEMOkP1EteNxWH5W83B9fsEhY5PmvciNYK5mBsxiw1c0c4eLR7c2QVQ%2Bu4%2BcbY%2FXsbMMW%2BU75LbUhHqXGvSW%2BZZNAQSfaqcybCYB5fgwjtR9zSWorcs%2BCeK6Qwq666x1nnfiPahQm%2FPquT4ofMMv0zCma5sMGq7fAVRNPH456iG9k7OCQgtyxsuKg%2BAq3JEQzHwLFDFWJthu7VjtItqXT65qBwAQ5wZ4kmkTkzva%2FYW%2By9yb0So9Nc26o%2Btm7Wpv5Ne2TcppW4kXr6exFrw9nq3oTQ4YGOMtnjonFW1zq2bWhEYUMNL44hQiRVdTnjnLmSQjdH0uN9KRXGjEiHlVhMKzEmsFgMGMA*******'
    download(url)

# from multiprocessing import Pool
    # 创建进程池,执行10个任务
    # pool = Pool(10)
    # for i in range(7):
    #     pool.apply_async(run, (i+1,)) #执行任务
    # pool.close()
    # pool.join()
    #调用合并
    # merge(5,"copy /b mp4\\*.ts mp4\\new.mp4")
    # print('ok!处理完成')
    
https://blog.csdn.net/a33445621/article/details/80377424?utm_source=distribute.pc_relevant.none-task
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值