当前位置: 首页 > 科技观察

一步步教你抖音系列视频批量下载器开发

时间:2023-03-14 01:15:12 科技观察

程序演示大家好,我是小明。这里开发了一个抖音视频下载器,打开效果如下:如果本地谷歌浏览器之前没有访问过抖音主页,点击开始下载按钮会有如下输出:此时,我们只需点击访问抖音主页,程序会使用本地谷歌浏览器访问抖音主页。再次点击下载按钮:可以看到视频是一个合集视频:那么程序只需要勾选第一个选项即可下载整个合集:这样就可以一次性下载整个合集了:开发过程先根据上篇文章:提取谷歌浏览器Cookies的五境读取谷歌浏览器安装位置和本地抖音相关cookies:"""小明代码CSDN主页:https://blog.csdn.net/as604049322"""__author__='Xiaoming'__time__='2022/1/23'importbase64importjsonimportosimportsqlite3importwinregimportwin32cryptfromcryptography.hazmat.primitives.ciphers.aeadimportAESGCMdefload_local_key(localStateFilePath):"在chrome中读取存储在json文件中的密钥,然后进行base64解码和DPAPI解密以获得真正的AESGCM密钥"withopen(localStateFilePath,encoding='u8')asf:encrypted_key=json.load(f)['os_crypt']['encrypted_key']encrypted_key_with_header=base64.b64decode(encrypted_key)encrypted_key=encrypted_key_with_header[5:]key=win32crypt.CryptoneenkeyUnprotected,Data(,0)[1]返回keydefdecrypt_value(key,data):"AESGCMdecrypt"nonce,cipherbytes=data[3:15],data[15:]aesgcm=AESGCM(key)plaintext=aesgcm.decrypt(nonce,cipherbytes,None).解码('u8')returnplaintextdeffetch_host_cookie(host):"获取指定域名下的所有cookies"userDataDir=os.environ['LOCALAPPDATA']+r'\Google\Chrome\UserData'localStateFilePath=userDataDir+r'\LocalState'cookiepath=userDataDir+r'\Default\Cookies'#97版已经将Cookies移动到网络目录下如果不是os.path。存在(cookiepath)或os.stat(cookiepath).st_size==0:cookiepath=userDataDir+r'\Default\Network\Cookies'#print(cookiepath)sql=f"selectname,encrypted_valuefromcookieswherehost_keylike'%.{host}'"cookies={}key=load_local_key(localStateFilePath)withsqlite3.connect(cookiepath)asconn:cu=conn.cursor()forname,encrypted_valueincu.execute(sql).fetchall():cookies[name]=decrypt_value(key,encrypted_value)returncookiesdefget_chrome_path():尝试:key=winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,r"ChromeHTML\Application")path=winreg.QueryValueEx(key,"ApplicationIcon")[0]chrome_path=path[:path.rfind(",")]返回chrome_path除了FileNotFoundError作为e:returnif__name__=='__main__':print(fetch_host_cookie("douyin.com"))print(get_chrome_path())有了这个工具类,我们就不用再用selenium了。那么视频解析的核心代码如下:defget_video_url(url,cookies):headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/87.0.4280.66Safari/537.36","referer":"https://www.douyin.com"}res=requests.get(url,headers=headers,cookies=cookies)ifres.status_code==200:RENDER_DATA,=re.findall(r'',res.text)data=json.loads(unquote(RENDER_DATA))key='8'ifurl.find("collection")!=-1else'34'try:detail=data[key]['aweme']['detail']title=detail['desc']除了Exceptionase:print(f"{url}isinvalid,theerrorkey:",e)returnifnottitle:title,=re.findall("]+>\s*([^>]+)\s*",res.text)video_url=urljoin(url,detail['video']['playApi'])collection_urls=set(re.findall("//www.douyin.com/collection/\d+/\d+",res.text))collection_urls=[urljoin("https://www.douyin.com",url)forurlincollection_urls]collection_urls.sort(key=lambdas:int(s[s.rfind("/")+1:]))collection_title=re.findall("]+>([^<>]+)",res.text)[0]returnvideo_url,title,collection_urls,collection_titleelse:print('视频链接请求失败!!!')视频下载的核心代码:defdownload_video(video_url,title,folder):start_time=time.time()res=requests.get(url=video_url,stream=True)done_size,total=0,int(res.headers['content-length'])chunk_size=1024*1024title=format_filename(title)file_size=round(int(res.headers['content-length'])/1024/1024,2)basename=f"{title}.mp4"filename=f"{folder}/{title}.mp4"ifos.path.exists(filename):print(basename,"Exists,skip...")returnprint("------------------------------------")print(f'开始下载文件:{basename}\n当前文件大小:{file_size}MB')withopen(filename,'wb')asf:forchunkinres.iter_content(chunk_size):f.write(chunk)done_size+=len(chunk)cost_time=time.time()-start_timeyielddone_size,cost_time,total#print(f"progress:{done_size/total:.2%},{done_size/cost_time/1024/1024:.2f}MB/s")cost_time=time.time()-start_timeprint(f'file:{basename}下载是完成!\n耗时:{cost_time:0.2f}秒')视频链接分析,可以参考蔡哥的文章:《用Python搞定抖X无水印短视频下载》链接:https://mp.weixin.qq.com/s/NNVT6IH6dpT0rTeu1-oD6wUI界面设计核心代码如下:layout=[[sg.Text('视频网址:',font=("Italic",12)),sg.In(key='url',size=(70,1),text_color="#bb8b59",default_text="https://www.douyin.com/video/6803929443069988103")],[sg.Checkbox('如果是合集,下载整个合集',key="download_collection",default=False),sg.Button('开始下载'),sg。Button('清除输出'),sg.Button('访问抖音Home'),sg.Button('访问当前地址'),],[sg.Output(size=(85,10),key="out",text_color="#15d36a")],[sg.ProgressBar(1000,size=(20,20),key='video_bar',bar_color=("#bb8b59","#295273")),sg.Text('000.0MB,00/00\n00:00<00:00',key="message_video"),sg.ProgressBar(1000,size=(20,20),key='progressbar',bar_color=("#15d36a","#295273")),sg.Text('00.00MB/00.00MB\n00.00MB/s',key="message")],[sg.Text('输出目录:',font=("Italian",12)),sg.In(size=(35,1),key="save_dir"),sg.FolderBrowse('...',target='save_dir',initial_folder="."),sg.Checkbox('下载后\n打开目录',key="open_folder",default=True),sg.Button('打开输出目录'),],[sg.Text("@小小明:https://blog.csdn.net/as604049322"),],]程序下载工具完整代码及打包好的工具下载地址:https://gitcode.net/as604049322/python_gui/-/tree/master/douyin