前言
最近(2021.4.14)下载钉钉群的网课,发现以往使用的m3u8下载方式没法正常下载了,经过观察发现是钉钉对m3u8文件进行了改写,导致正常的下载器直接下载出错。
下载m3u8文件后进行编辑可使其符合下载格式。
需要的软件:Fiddler或Charles等抓包软件、m3u8下载器、支持正则表达式替换的文本编辑器
记录两个变量(用于python)
2021.05.06更新
一、m3u8文件的修改方式
经过查找,阿里文档中有提到如何改写文件,链接如下
M3U8 介绍: 点击打开
二 、 Fiddler 抓包(其他抓包程序大同小异)
首先,打开Fiddler
保持捕获数据 即可,
也可以点击“任意进程”拖动想要抓包的程序上边,仅对此程序抓包
然后进行 Fiddler 过滤钉钉包,输入 .m3u8进行过滤
设置完成后,点击钉钉直播回放列表中的播放,开始播放视频 进行抓包
在Fiddler的窗口中,寻找
主机是*****.**alicdn**.***.com**(不是一个确定的值)、 url为 /live_hp/ 开头、 内容类型为 application/ 开头的数据。右键点击复制其URL(为后续的第一个变量)。
三、下载步骤
1.下载m3u8文件(就是第一个变量的那个url)
用抓包软件找到m3u8文件,双击进入,然后选择raw原始数据,复制其内容粘贴到本地的文档id-keys.txt中。
2.修改数据(大部分python自动修改,懒人代码的第17行需要手动修改,后续提及)
m3u8文件内容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-TARGETDURATION:31
#EXTINF:30.000,
1660f37e-27f9-47c2-b127-8bb1ab9f46d1/1.ts?auth_key=1619264900-0-0-acd81051b446c8f67c4145f63b084236
#EXTINF:30.000,
1660f37e-27f9-47c2-b127-8bb1ab9f46d1/2.ts?auth_key=1619264900-0-0-1f3054c64d055e66d185783186f73e33
#EXTINF:4.100,
1660f37e-27f9-47c2-b127-8bb1ab9f46d1/3.ts?auth_key=1619264900-0-0-f6d748622a6f9b14117a0e04e6125175
#EXT-X-ENDLIST
##后面有多少粘贴多少,不然下载ts碎片不完整!!
而url链接为:
https://dtliving-sh.dingtalk.com/live_hp/1660f37e-27f9-47c2-b127-8bb1ab9f46d1_merge.m3u8?app_type=win&auth_key=1619264900-0-0-efc5f367241f273fa2be15a81f4a1815&cid=e8a46f2e2d280cc1edac93216d07fc80&token=de8b4bacfe754db86bd6560654c78434H4SrDtFFr6YNofy0GFbmrBCY-DVpp_k6UVFai0fFLqzNDxoASGiNgXspWGx4FitBB4I0x1PyKHUKKDeRJqhHSg6ues8RLZdGiDPHzb0I4Ds=&token2=b65e3bff05cc0fe88fe44d2f63b56030A3Bd1XMxB_C9hqAAhc7E3bkdedwT2Ri6U76rRVxnfjiotbRTL91iotoVF9IH-CGQYU7olJnAitKcWnbFDa6Zx9a6hMi9lhbIAjFfk9eUDyA&version=6.0.8-Release.3260387
这里需要修改两个地方,一个是ts文件的相对地址改为绝对地址,一个是去掉?及后面的多余内容。其中ts文件的完整url是:
https://dtliving-sh.dingtalk.com/live_hp/1660f37e-27f9-47c2-b127-8bb1ab9f46d1/1.ts?auth_key=1619264900-0-0-acd81051b446c8f67c4145f63b084236
所以只要使用替换修改(手动修改 懒人代码的第17行 的 1660f37e )(每个人的都不一样)
1660f37e
为
https://dtliving-sh.dingtalk.com/live_hp/1660f37e
其中的开头url来自之前保存的url链接。
再用正则表达式匹配后面的auth_key内容并删除即可。
python自动完成修改的m3u8文件如下:
https://aliliving-pre.alicdn.com/live_hp/1660f37e-27f9-47c2-b127-8bb1ab9f46d1/1.ts?auth_key=1619264900-0-0-acd81051b446c8f67c4145f63b084236
https://aliliving-pre.alicdn.com/live_hp/1660f37e-27f9-47c2-b127-8bb1ab9f46d1/2.ts?auth_key=1619264900-0-0-1f3054c64d055e66d185783186f73e33
https://aliliving-pre.alicdn.com/live_hp/1660f37e-27f9-47c2-b127-8bb1ab9f46d1/3.ts?auth_key=1619264900-0-0-f6d748622a6f9b14117a0e04e6125175
更新python懒人一键代码:
import requests
import os
import re
import time
from natsort import natsorted
#移除SSL认证,但移除认证后控制台总是抛出警告,添加以下代码忽略警告
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings()
id_keys = []
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 dingtalk-win/1.0.0 nw(0.14.7) DingTalk(6.0.12-Release.4140363) Mojo/1.0.0 Native AppType(release) Channel/201200' # 自行添加
}
path = "dingding-movie" # 文件夹名称
os.makedirs(path, exist_ok=True) # 自动创建文件夹
print()
print("请确保" + path + "下为空文件夹,并且尽量为英文目录!!")
print("请确保" + path + "下为空文件夹,并且尽量为英文目录!!")
print("请确保" + path + "下为空文件夹,并且尽量为英文目录!!")
print()
print("格式示例:\n\nm3u8地址为:\nhttps://*******-**.dingtalk.com/live_hp/########-xxxxx-xxxxx-xxxxx-xxxxxxxxxxxxxxxx\n\n")
# print("抓包获取ts的其中一个id: \n1.一般就是上述格式中的######## \n2.或是 ########-xxxx-xxxx-xxxx-xxxxxxxxxxxx/1.ts?auth_key=xxxxxxxxxxxxxxxxxxxxxxxxxxx 中的########\n\n")
url_input = input("m3u8地址为:")#第一个变量
print()
print("命名规范:不能包含 \ / : * ? ”(英文右引号) < > | ")
print()
output_name = input("最后合并文件名为:")
print()
#ts_id = input("抓包获取ts的其中一个id:")
url = 'https://'+url_input.split('/')[2]+'/'+url_input.split('/')[3]+'/'
ts_id = url_input.split('/')[4].strip()[:8]+".*"
print("下载前缀为:" + url)
fileopen = open('id-keys.txt', encoding='utf-8')
all_id_keys = fileopen.readlines()
for all_id_key in all_id_keys:
# print(all_id_key)
all_id_key = re.match(ts_id, all_id_key, re.M | re.I)#1660f37e需要手动根据当前获取的第二变量修改
if all_id_key:
#print(url + all_id_key.group())
id_keys.append(url + all_id_key.group())
for id_key in id_keys:
#print(id_key)
id = id_key.split('/')[-1].strip()[:-57]
print("正在下载:" + id)
res = requests.get(id_key, headers=headers ,verify=False)# verify=False移除SSL认证,但移除认证后控制台总是抛出警告
with open(path + "/" + id, "wb")as f:
f.write(res.content)
filepath = r"dingding-movie"
name_txt_filepath = r"name.txt"
files = os.listdir(filepath)
files = natsorted(files)
current_path = os.path.abspath(filepath)
name_txt_current_path = os.path.abspath(name_txt_filepath).strip()[:-8]
#print(files)
print()
print("运行前确保目录下name.txt不存在或为空文件")
print()
for file in files:
line = "file '"+ str(current_path + "\\" + file) +"'"
with open('name.txt','a') as f:
f.write(line+ '\n')
print("下载已完成")
time.sleep(3)
print("开始视频合并")
command = 'r"cd /d ' + name_txt_current_path + '&&ffmpeg -f concat -safe 0 -i name.txt -c copy ' + output_name + '.mp4'
# popen返回文件对象,跟open操作一样
f = os.popen(command, "r")
d = f.read() # 读文件
print(d)
print("视频合并完成!视频所在目录:" + current_path)
print()
f.close()
with open('run.bat', 'w') as f:
f.write('cmd /k "' + command.strip()[2:] + '&&exit')
print("如果合并失败,请自行执行CMD: " + command.strip()[2:])
print('或者运行py程序目录下的run.bat文件')
#最后的cmd命令 已测试成功 代码不美观 将将就 我也是个小白!
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付