您当前的位置: 首页 >  Python

蔚1

暂无认证

  • 0浏览

    0关注

    4753博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

利用python下载钉钉群直播视频

蔚1 发布时间:2020-04-25 23:30:45 ,浏览量:0

今年因为疫情的原因不能开学,所以很多学校都使用钉钉进行在线授课,但是在钉钉里面点击下载群直播回放的时候却发现管理员关闭了下载功能,那么,我们在这种情况下应该怎样利用 Python 程序来达到我们下载视频的需求呢?这篇文章会给你答案。

今年因为疫情的原因不能开学,所以很多学校都使用钉钉进行在线授课,但是在钉钉里面点击下载群直播回放的时候却发现:在这里插入图片描述真好,管理员设置了不允许下载回放。这就完了吗?NoNoNo!既然正常途径下载不了,那么我们就通过程序来进行下载。

环境准备

fiddler 抓包软件,钉钉 PC 客户端,格式工厂软件,python 环境以及 requests,moviepy 库。新建一个 python 文件 dingding.py,在 python 文件所在位置新建一个‘钉钉’文件夹来存放数据。桌面新建一个文件夹,名称默认‘新建文件夹’就好,然后在新建文件夹里面新建一个‘video’文件夹以及 video_add.py 文件。

抓取思路

我们在网站观看视频的时候,并不是一次性的将所有视频内容全部请求完,而是把它分为了很多小段视频,每次请求一小段。这一规则,几乎所有的视频网站以及视频软件都是如此,所以这就导致了我们在爬取视频的时候,并不能一次性爬取到视频的全部,而爬取下来的视频是一小节一小节的分开的 ts 文件;所以我们在抓取视频的时候,首先得获取到每一个小节视频的 URL 地址,然后去请求它,将所有小节的 ts 文件保存下来,然后再使用格式工厂将所有 ts 文件转换成 MP4 格式,最后再将所有的 MP4 文件合并为一个 MP4 文件。那么按照这个思路,我们开始实际的操作。

抓取分析

首先我们需要先获取到每个小节视频的 URL 地址,由于不是在浏览器当中,所以我们会用到 fiddler 来对软件的数据包进行抓取;打开 fiddler 抓包软件,然后登陆钉钉 PC 客户端,找到你想要下载的群直播回放视频:在这里插入图片描述然后打开第一个视频并播放,我们就可以在 fiddler 软件当中看到抓取到的数据包:在这里插入图片描述在图中我标记的 1 号数据包下面的那个数据包,就是当前视频所有小节的 URL 地址;大家可以选中这条数据,然后在右边 Inspectors 中的 Raw 当中打开 GET 后面的链接,会提示你下载一个文件,将这个文件下载到本地,然后使用记事本打开,就可以看到当前视频每一个小节的 URL 地址(图中红色边框选中,并且所有类似选框内的皆是):在这里插入图片描述当然,这些 URL 地址是不完整的,因为他们前面省略了“https://dtliving-pre.alicdn.com/live/”这部分;如何得知呢?点击刚才标记 1 号数据包下面紧挨着的 2 号视频数据包,然后注意观察他们在右边 Inspectors 中的 Raw 当中打开 GET 后面的链接,刚好省略了前面的一部分内容。当然你也可以多找几组作以对比。

代码书写

接下来,我们就可以进行到代码书写的环节:打开我们创建的 dingding.py 文件,导入 requests 库,然后将我们刚才获取到的 1 号数据包里面的下载 URL 地址写入,再写入请求头,由于我们暂时不知道它需要哪些请求头的参数,所以我们索性将 fiddler 上所有的请求头参数都写上,然后我们先打印一下状态码,看是否可以请求成功:

import requestsdef dingding():    url='https://dtliving-pre.alicdn.com/live/bd82384b-883e-444b-8499-2b60bfc244e0_merge.m3u8?app_type=win&auth_key=1590309873-0-0-745e015e4c7a1580895c875450c97d7c&cid=5977ad6e9da132f335b2d62203b7beed&token=bd58052a744b52e78d01bc9328bbf2f52n6pZZhOITKrfmA40UASVqOs0tbqts1jxM7u0Hoef9hPqAHJMoaeWYXB01SjavnoT5Ke3pM1VC3IKxt9b1MxXh540meiaUNU-m_nzJFKHN4=&token2=3b5453fbca3841e11d534ac7ecc7d9a5fNFEc-4e5ZTb8k6SKy22dqh7fq5krVqHURw0pJx8hU6YOhtP5aKSXdHODZCvmwFdMSxtREtJJF03LntnCpvzvSx_g4OBfmcSnSDin-Peyk4&version=5.0.15-Release.26'    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(5.0.15-Release.26) Mojo/1.0.0 Native AppType(release)',        'Accept-Language':'zh-CN,zh;q=0.9',        'Accept-Encoding':'gzip, deflate, br',        'Accept':'*/*',        'Referer':'https://h5.m.taobao.com/tblive/dingtalk/pc-playback.html?cid=31664625310&uuid=bd82384b-883e-444b-8499-2b60bfc244e0&anchorId=275440629',        'Origin':'https://h5.m.taobao.com',        'Connection':'keep-alive',        'Host':'dtliving-pre.alicdn.com'    }    response=requests.get(url,headers=headers)    print(response)if __name__ == '__main__':    dingding()

运行程序之后,我们会看到一个 SSL 的报错,这是因为网站可能并没有设置好 HTTPS 证书,或者网站的 HTTPS 证书不被 CA 机构认可,这时候,这些网站可能就会出现 SSL 证书错误的提示,这个时候,我们一般只需要在 requests.get 的参数里面加上“verify=False”即可,意思就是不验证 SSL 证书;这时我们再运行程序,就发现我们的报错没有了,而是多了一个 Warning 警告,这个警告我们可以不用理它,因为它并不会使我们的程序无法运行,或者也可以使用下面的代码忽略 warning:

import warningswarnings.filterwarnings('ignore')

再运行程序,我们就看不到刚才的 Warning 警告了。接下来,我们的思路就是请求这个 URL 地址,然后将该地址里面的文件保存成 txt 文件存放在本地,然后再读取这个 txt 文件里面的内容,利用正则表达式将我们所需要的每小节视频的 URL 地址提取出来,再将缺少的部分拼接上,然后请求即可。有了这个思路,我们的代码书写起来就很容易了;下面是完整代码展示:

import requestsimport reimport warnings# 忽略警告warnings.filterwarnings('ignore')i=1def dingding():    url = 'https://dtliving-pre.alicdn.com/live/bd82384b-883e-444b-8499-2b60bfc244e0_merge.m3u8?app_type=win&auth_key=1590309873-0-0-745e015e4c7a1580895c875450c97d7c&cid=5977ad6e9da132f335b2d62203b7beed&token=bd58052a744b52e78d01bc9328bbf2f52n6pZZhOITKrfmA40UASVqOs0tbqts1jxM7u0Hoef9hPqAHJMoaeWYXB01SjavnoT5Ke3pM1VC3IKxt9b1MxXh540meiaUNU-m_nzJFKHN4=&token2=3b5453fbca3841e11d534ac7ecc7d9a5fNFEc-4e5ZTb8k6SKy22dqh7fq5krVqHURw0pJx8hU6YOhtP5aKSXdHODZCvmwFdMSxtREtJJF03LntnCpvzvSx_g4OBfmcSnSDin-Peyk4&version=5.0.15-Release.26'    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(5.0.15-Release.26) Mojo/1.0.0 Native AppType(release)',        'Accept-Language': 'zh-CN,zh;q=0.9',        'Accept-Encoding': 'gzip, deflate, br',        'Accept': '*/*',        'Referer': 'https://h5.m.taobao.com/tblive/dingtalk/pc-playback.html?cid=31664625310&uuid=bd82384b-883e-444b-8499-2b60bfc244e0&anchorId=275440629',        'Origin': 'https://h5.m.taobao.com',        'Connection': 'keep-alive',        'Host': 'dtliving-pre.alicdn.com'    }    # 获取二进制数据    response = requests.get(url, headers=headers, verify=False).content    # 将.content 二进制转换为 str 数据类型,否则会报数据类型错误    wenjian = response.decode('utf-8')    # 保存 txt 文件    with open('钉钉/1.txt', 'w')as f:        f.write(wenjian)    # 读取 txt 文件    with open('钉钉/1.txt', 'r')as f:        wenben = f.read()        # 使用正则表达式进行数据匹配        url1 = re.findall(r'.*?-.*?-.*?-\d+-.*?/\d+\.ts\?auth_key=\d+-0-0-.*', wenben)        global i        for url_video in url1:            # 将匹配到的数据拼接完整            url_video_all = 'https://dtliving-pre.alicdn.com/live/' + url_video            # 请求所有小节视频的 URL 链接            video_response = requests.get(url_video_all, headers=headers, verify=False).content            # 将所有小节的 ts 文件存放到新建的‘钉钉’文件夹            with open('钉钉/{}.ts'.format(i), 'wb')as f:                f.write(video_response)            i += 1            # 显示正在保存的内容            print('正在保存{}.ts'.format(i))if __name__ == '__main__':    dingding()

视频整合

然后我们在钉钉文件夹当中就可以看到我们保存的所有 ts 文件:在这里插入图片描述然后我们使用格式工厂软件,将所有的文件转换为 MP4 格式:在这里插入图片描述点击添加文件夹,将存储所有 ts 文件的文件夹添加进来,然后转换成 MP4 格式,存放在指定文件夹(在输出文件夹指定)。这里我们将输出文件放在桌面新建文件夹中的 video。视频整合我们所用到的库叫做 moviepy,这个库可以对视频进行整合、裁剪以及一些剪辑操作,我们目前只会使用合并视频的功能,所以对其他功能不做介绍。打开之前创建的 video_add.py 文件,写入下列代码:

from natsort import natsortedfrom moviepy.editor import *import os# 定义一个空列表存放数据L=[]# 将 video 文件夹中的视频导入for root,dirs,files in os.walk('./video'):    # 按照 1,2,3,4……的顺序排列视频    files = natsorted(files)    for file in files:        # 进行 if 判断,如果文件后缀名是 MP4,那么就将其添加至列表        if os.path.splitext(file)[1]=='.mp4':            filePath=os.path.join(root,file)            video=VideoFileClip(filePath)            L.append(video)# 将列表视频合并final_clip=concatenate_videoclips(L)# 将合并好的视频输出为 target.mp4 文件,帧率 24final_clip.to_videofile('./target.mp4',fps=24)

等待程序运行完成,就可以在新建文件夹当中就可以看到已经合并好的视频 target.mp4 文件。这样就完成了对群直播回放视频的保存工作。

如果觉得这篇文章还不错的话,欢迎转发分享,或者觉得哪里说得不正确的也欢迎批评指正,谢谢!

原创不易,未经作者授权请勿转载或用于商业用途,谢谢合作。

阅读全文: http://gitbook.cn/gitchat/activity/5ea4190bf959c85b79a3d341

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

关注
打赏
1560489824
查看更多评论
立即登录/注册

微信扫码登录

0.0531s