• 售前

  • 售后

热门帖子
入门百科

python gui开辟——制作抖音无水印视频下载工具(附源码)

[复制链接]
浓茶人生 显示全部楼层 发表于 2021-10-25 19:00:46 |阅读模式 打印 上一主题 下一主题
目次


  • 一.预备工作
  • 二.预览

    • 0.复制抖音分享短链接
    • 1.启动

  • 2.运行
  • 3.结果
  • 三.计划流程

    • 1.总体计划
    • 2.详细计划

  • 四.源代码
  • 五.阐明&总结

    • 5.1阐明:
    • 5.2总结:

hello,各人好啊,失落生齿回归了 [捂脸]!本次使用tkinter撰写一篇 抖音无水印视频下载,目标很纯粹,就是为了设置 微信状态视频。本篇博文中,我会写下我的代码撰写思绪以及想写计划流程,代码放在了第四节,工具打包好放在了 蓝奏云,慢慢看,后面有链接。

一.预备工作


本次要用到以下依靠库:re json os random tkinter threading requests pillow 其中后两个须要安装后使用

二.预览



0.复制抖音分享短链接



1.启动



2.运行



3.结果


(小姐姐挺美丽,视频确实无水印)

三.计划流程


计划流程分为总体计划和详细计划,这里我会使用viso画出几个流程图,用以展示我的思绪,详细计划部门列举了两个函数实现的详细流程。

1.总体计划



2.详细计划


2.1 download()函数

2.2 parse()函数


四.源代码
  1. #--*coding:utf-8*--
  2. from tkinter import *
  3. from tkinter import ttk
  4. from tkinter import messagebox
  5. import os
  6. import json
  7. import threading
  8. import requests
  9. from PIL import Image,ImageTk
  10. '''
  11. 抖音无水印视频下载工具
  12. 难点:1.视频接口
  13. 2.进度条
  14. '''
  15. def clean_progressbar():
  16. # 清空进度条
  17. fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="white")
  18. x = 500 # 未知变量,可更改
  19. n = 600 / x # 465是矩形填充满的次数
  20. for t in range(x):
  21. n = n + 600 / x
  22. # 以矩形的长度作为变量值更新
  23. canvas.coords(fill_line, (0, 0, n, 60))
  24. window.update()
  25. def download():
  26. #先清空进度条,再下载
  27. clean_progressbar()
  28. real_link=t1.get('0.0',END).split('**')[-1]
  29. headers2 = {
  30. 'sec-fetch-dest': 'document',
  31. 'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36'
  32. }
  33. r2 = requests.get(real_link, headers=headers2, stream=True)
  34. try:
  35. os.mkdir(video_path)
  36. except:
  37. pass
  38. file =video_path+ video_title + '.mp4'
  39. #下载与进度条
  40. chunk_size = 1024 # 每一块的大小,每次下载块的大小
  41. file_size = int(r2.headers['Content-Length']) # 提取出来的文件大小为string格式,使用int()强制转化
  42. fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green")
  43. raise_data = 600 / (file_size / chunk_size) # 增量大小,600为进度条的长度
  44. _size = 0 # 已经下载文件的大小
  45. with open(file, "wb") as f:
  46. n=0
  47. for data in r2.iter_content(chunk_size): # inter_content:用于边下载边存硬盘,每次下载chunk_size大小的块
  48. f.write(data)
  49. n = n + raise_data
  50. canvas.coords(fill_line, (0, 0, n, 60))
  51. window.update()
  52. #下载完以后清空
  53. t1.delete('0.0',END)
  54. t1.insert(END,'{title}.mp4\n下载完成!'.format(title=video_title))
  55. #解析出无水印视频下载地址以及视频标题
  56. def parse(share_link):
  57. # 先处理短链接获取item_ids
  58. headers = {
  59. 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  60. 'sec-fetch-dest': 'document',
  61. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
  62. }
  63. # 使用allow_redirects=False禁止重定向,拿到重定向的url
  64. r1 = requests.get(share_link, allow_redirects=False, headers=headers)
  65. item_ids = re.findall(r'video/(\d+)/', r1.text)
  66. interface_url='https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}'.format(''.join(item_ids))
  67. r=requests.get(interface_url,headers=headers)
  68. _json=json.loads(r.text)
  69. try:
  70. item_list=_json.get('item_list')[0]
  71. video_title=item_list.get('desc')#视频名称
  72. watermark_video_link=item_list.get('video').get('play_addr').get('url_list')[0]#视频带水印地址
  73. real_video_link=watermark_video_link.replace('playwm','play')#视频无水印地址
  74. return video_title,real_video_link
  75. except TypeError:
  76. messagebox.showerror('提示','请检查输入地址!')
  77. t1.delete('0.0',END)
  78. return '输入地址有误','请检查!'
  79. #调用jiexi()将视频标题和下载链接显示在Text Widget中
  80. def pre_parse():
  81. share_link=e1.get()
  82. if len(share_link)!=0:
  83. global video_title, real_video_link
  84. try:
  85. video_title, real_video_link=parse(share_link)
  86. except TypeError:
  87. t1.insert(END,'输入地址有误,请检查!')
  88. t1.delete('0.0',END)
  89. #去除标题中的表情以及符号,只保留汉字
  90. try:
  91. t1.insert(END, video_title + '\n' +'*'*30+ real_video_link)
  92. b2.config(state='normal')
  93. except TclError:
  94. filted_title=re.findall(r'[\u4E00-\u9FA5\s]+',video_title)
  95. t1.insert(END,''.join(filted_title)+'\n'+'*'*30+real_video_link)
  96. b2.config(state='normal')
  97. else:
  98. messagebox.showerror('错误','请输入地址!')
  99. t1.delete('0.0',END)
  100. t1.insert(END,'请在上面输入地址!')
  101. #打开文件夹函数
  102. def open_dir():
  103. try:
  104. os.mkdir(video_path)
  105. except:
  106. pass
  107. abs_path=os.path.abspath(video_path)
  108. os.startfile(abs_path)
  109. #退出窗口函数
  110. def quit_window():
  111. window.destroy()
  112. #函数打包进线程
  113. def thread_it(func,*args):
  114. t=threading.Thread(target=func,args=args)
  115. t.setDaemon(True)#先守护主线程
  116. t.start()#再启动
  117. if __name__ == '__main__':
  118. video_path='./video/'
  119. window=Tk()
  120. window.title('Downloader-v1.0')
  121. width=295
  122. height=380
  123. screenWidth = window.winfo_screenwidth() # 获取显示区域的宽度
  124. screenHeight = window.winfo_screenheight() # 获取显示区域的高度
  125. left = (screenWidth - width) / 2
  126. top = (screenHeight - height) / 2
  127. window.geometry("%dx%d+%d+%d" % (width, height, left, top))
  128. window.resizable(0,0)
  129. window.iconbitmap('./rely/my_favicon.ico')
  130. photo=Image.open('./rely/dy_logo.png')
  131. photo=photo.resize((200,50))
  132. image=ImageTk.PhotoImage(photo)
  133. l0=ttk.Label(window,imag=image,justify='center')
  134. l0.pack()
  135. f1=ttk.Labelframe(window,text='视频链接地址:')
  136. f1.place(x=40,y=55)
  137. e1=ttk.Entry(f1,width=30)
  138. e1.pack()
  139. f2=ttk.Labelframe(window,text='信息:')
  140. f2.place(x=40,y=102)
  141. t1=Text(f2,height=6,width=30)
  142. t1.pack()
  143. t1.insert(END,'{_xing}\n将抖音分享链接地址粘贴在上面输入框中,本程序会自动解析出视频的下载地址并且显示在这里\n{_xing}'.format(_xing='*'*29))
  144. b1=ttk.Button(window,text='解析',command=lambda :thread_it(pre_parse))
  145. b1.place(x=40,y=265)
  146. b2=ttk.Button(window,text='下载',state='disable',command=lambda :thread_it(download))
  147. b2.place(x=170,y=265)
  148. b3=ttk.Button(window,text='打开文件夹',command=open_dir)
  149. b3.place(x=40,y=298)
  150. b4=ttk.Button(window,text='退出',command=quit_window)
  151. b4.place(x=170,y=298)
  152. f3=ttk.Labelframe(window)
  153. f3.place(x=40,y=329)
  154. l1=ttk.Label(f3,text=' 敬告:本软件仅供学习交流使用!',width=30,justify='center',foreground='red')
  155. l1.pack(fill=X)
  156. f4=ttk.LabelFrame(window,text='下载进度:')
  157. f4.place(x=40,y=210)
  158. canvas = Canvas(f4, width=210, height=20,bg="white")
  159. canvas.pack(side='left')
  160. l2_var=StringVar()
  161. l2=ttk.Label(f4,textvariable=l2_var,text='未下载')
  162. l2.pack(side='left',anchor=S)
  163. window.mainloop()
  164. '''
  165. test_url: https://v.douyin.com/JcxTMj2/
  166. '''
复制代码
五.阐明&总结



5.1阐明:

所示截图均为举例,本软件仅供学习交换使用!


5.2总结:


本次使用python的tkinter撰写了一个抖音无水印视频爬取GUI工具,因为中央写过几个GUI界面了对tkinter的widget有些认识了,线程用起来更加熟练。他山之石,可以攻玉,本次思绪、代码的撰写参考了:
www.jb51.net/article/205619.htm
在此感谢帮助我的人!,工具已经打包上传到了蓝奏云https://wws.lanzous.com/isCLul0dlfa
, 思绪、代码方面有什么不敷接待各位大佬指正、批评!
以上就是python gui开辟——制作抖音无水印视频下载工具(附源码)的详细内容,更多关于python 抖音视频下载的资料请关注草根技术分享别的干系文章!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作