钉钉更新后,钉钉录播回放视频python下载

, Read in about 4 min

Posted by Ryen on Tuesday, April 13, 2021
With final update in December 26,2023

本文总阅读量
前言

最近(2021.4.14)下载钉钉群的网课,发现以往使用的m3u8下载方式没法正常下载了,经过观察发现是钉钉对m3u8文件进行了改写,导致正常的下载器直接下载出错。

下载m3u8文件后进行编辑可使其符合下载格式。

需要的软件:Fiddler或Charles等抓包软件、m3u8下载器、支持正则表达式替换的文本编辑器

记录两个变量(用于python)

2021.05.06更新

一、m3u8文件的修改方式

经过查找,阿里文档中有提到如何改写文件,链接如下

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命令 已测试成功 代码不美观 将将就 我也是个小白!

「真诚赞赏,手留余香」

Ryen's Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付