# -*- 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
抓取加密ts视频,并合并转成MP4
最新推荐文章于 2024-08-04 17:39:59 发布