私信小編01即可獲取大量Python學習資料
非逆向破解_signature!非逆向破解_signature!非逆向破解_signature!訂閱前請謹慎。
抖音更新頻繁,不保證長期有效,有效日期會在標題寫出。
本文僅限交流學習使用, 請勿使用在任何非法商業活動。
某天,一朋友甩給我一張圖片(下圖)和一個視頻分享連結(如下)
山西方言在內蒙古居然可以暢通無阻?「燜當戶對面」送給大家... #貧窮料理 #美食趣胃計劃 https://v.douyin.com/JA77fMD/ 複製此連結,打開【抖音短視頻】,直接觀看視頻!
問我能不能拿到無水印的視頻文件
我們按常規套路一步步來:
打開網址,F12先分析一下網頁請求
首先看到短連結被302重定向到視頻播放頁的連結。
視頻播放頁的連結返回完整的網頁代碼
https://www.iesdouyin.com/share/video/6874779817993276685/?region=CN&mid=6874780172541774599&u_code=16j6jj9bf&titleType=title×tamp=1600844701&utm_campaign=client_share&app=aweme&utm_medium=ios&tt_from=copy&utm_source=copy
另外一個接口返回了視頻相關的數據
https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6874779817993276685
目測 item_ids 就是視頻編號,這個接口並不需要 _signature、dytk 等複雜參數,非常簡單。
看到這裡就首先想到了兩個解決方案:
https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6874779817993276685https://www.iesdouyin.com/share/video/6874779817993276685/?region=CN&mid=6874780172541774599&u_code=16j6jj9bf&titleType=title×tamp=1600844701&utm_campaign=client_share&app=aweme&utm_medium=ios&tt_from=copy&utm_source=copy
# 電腦UA訪問短連結,通過302重定向時response.headers中的location標籤獲取視頻id號headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', }response = requests.get(url=shrot_video_url, headers=headers, allow_redirects=False)items_ids = re.findall(r'video/(.*?)/', response.headers['location'])[0]# 電腦UA訪問官方api視頻分享接口,獲取視頻播放連結url = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}'.format(items_ids)headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', }response = requests.get(url=url, headers=headers)play_addr = response.json().get('item_list')[0]['video']['play_addr']['url_list'][0]
我們拿到的視頻文件連結連結如下:
# 有水印https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f9a0000btk1rt9c21acl8d6vjl0&ratio=720p&line=0
這個連結還是有水印的,我們只需要把連結中的 「playwm」 改為 「play」,即可變為無水印的。
(wm是watermark 「水印」 的縮寫,不止抖音,其他平臺也有用到)
# 無水印https://aweme.snssdk.com/aweme/v1/play/?video_id=v0300f9a0000btk1rt9c21acl8d6vjl0&ratio=720p&line=0
當我們用手機UA訪問上面連結時,發現又會跳轉一次
http://v5-dy-d.ixigua.com/a181ba8f34818155b859b70c8b518643/5f70462f/video/tos/cn/tos-cn-ve-15/a0f9a89ec46b4cad83e8cd9215129521/?a=1128&br=6237&bt=2079&cr=0&cs=0&cv=1&dr=0&ds=3&er=&l=202009271456590101980601475921B6A9&lr=&mime_type=video_mp4&qs=0&rc=M205O2Y0Znc0dzMzZGkzM0ApNWVlPDtpOWRpNzU5ZTM7Omdpc2FpXi82b2hfLS02LTBzczAvNTQtXjMvLy4wLy4vYi46Yw%3D%3D&vl=&vr=
好了,現在可以下載視頻了
def download_video(shrot_video_url): # 電腦UA訪問短連結,通過302重定向時response.headers中的location標籤獲取視頻id號 headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', } response = requests.get(url=shrot_video_url, headers=headers, allow_redirects=False) items_ids = re.findall(r'video/(.*?)/', response.headers['location'])[0] # 電腦UA訪問官方api視頻分享接口,獲取視頻播放連結,通過替換 playwm 為 play 後,得到無水印的視頻播放連接 url = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}'.format(items_ids) headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', } response = requests.get(url=url, headers=headers) play_addr = response.json().get('item_list')[0]['video']['play_addr']['url_list'][0] play_addr_nowm = str(play_addr).replace('playwm', 'play') print(play_addr_nowm) # 手機UA訪問無水印的視頻播放連結,經過302重定向後,獲取無水印視頻播放真實連結 (注意:此處若使用電腦UA則獲取不到任何數據) headers = {'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1', } response = requests.get(url=play_addr_nowm, headers=headers, allow_redirects=False) real_play_addr_nowm = response.headers['location'] print(real_play_addr_nowm) # 手機UA訪問,下載視頻 (注意:此處若使用電腦UA則獲取不到任何數據) headers = { 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1', 'Connection': 'keep-alive', 'Host': 'v5-dy-d.ixigua.com' } r = requests.get(url=real_play_addr_nowm, headers=headers, stream=True) # 下載視頻 print("{}開始下載".format(items_ids)) with open('{}.mp4'.format(items_ids), "wb") as mp4: for chunk in r.iter_content(chunk_size=1024 * 1024): if chunk: mp4.write(chunk) print("{}下載結束".format(items_ids))if __name__ == '__main__': # 單個視頻分享頁————下載無水印視頻 video_list = ['https://v.douyin.com/JA77fMD/'] for j in video_list: download_video(j)