今年因為疫情的原因不能開學,所以很多學校都使用釘釘進行在線授課,但是在釘釘里面點擊下載群直播回放的時候卻發現管理員關閉了下載功能,那么,我們在這種情況下應該怎樣利用 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 專享技術內容哦。
總結
以上是生活随笔為你收集整理的利用python下载钉钉群直播视频的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。