python3GUI--抖音无水印视频下载工具(附源码)

2023-11-19


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

一.准备工作

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

二.预览

0.复制抖音分享短链接

在这里插入图片描述

1.启动

在这里插入图片描述

2.运行

在这里插入图片描述

3.结果

在这里插入图片描述

(小姐姐挺漂亮,视频确实无水印

三.设计流程

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

1.总体设计

在这里插入图片描述

2.详细设计

2.1 analysis_real_addr()函数

在这里插入图片描述

2.2 download_video()函数
在这里插入图片描述

四.源代码

4.1 DouYin_Video_Downloader-v2.0.py

#--*coding:utf-8*--
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import os
import threading
from PIL import Image,ImageTk
from DouYin_Downloader_Engine import Douyin_Engine
'''
抖音无水印视频下载工具
难点:1.视频接口
      2.进度条
V2.0改进:


'''

imgs=['./rely/dy_logo.png','./rely/my_favicon.ico']
class App:
    def __init__(self):
        self.video_path = './video/'
        self.window = Tk()
        self.window.title('Downloader-v2.0')
        width = 295
        height = 400
        screenWidth = self.window.winfo_screenwidth()  # 获取显示区域的宽度
        screenHeight = self.window.winfo_screenheight()  # 获取显示区域的高度
        left = (screenWidth - width) / 2
        top = (screenHeight - height) / 2
        self.window.geometry("%dx%d+%d+%d" % (width, height, left, top))
        self.window.resizable(0, 0)
        self.window.iconbitmap(imgs[1])
        self.create_widget()
        self.set_widget()
        self.place_widget()
        self.window.mainloop()

    def create_widget(self):
        self.paned=PanedWindow(self.window)
        self.img=imgs
        photo = Image.open(imgs[0])
        photo = photo.resize((200, 50))
        self.paned.image = ImageTk.PhotoImage(photo)
        self.l0 = ttk.Label(self.window, imag=self.paned.image, justify='center')
        self.f1 = ttk.Labelframe(self.window, text='视频链接地址:')
        self.e1 = ttk.Entry(self.f1, width=30)
        self.f2 = ttk.Labelframe(self.window, text='信息:')
        self.t1 = Text(self.f2, height=6, width=30)
        self.b1 = ttk.Button(self.window, text='解析',)
        self.b2 = ttk.Button(self.window, text='下载')
        self.b3 = ttk.Button(self.window, text='打开文件夹')
        self.b4 = ttk.Button(self.window, text='退出')
        self.f3 = ttk.Labelframe(self.window)
        self.l1 = ttk.Label(self.f3, text='  敬告:本软件仅供学习交流使用!')
        self.f4 = ttk.LabelFrame(self.window, text='下载进度:')
        self.canvas = Canvas(self.f4,  bg="white")
        self.l2_var = StringVar()
        self.l2 = ttk.Label(self.f4, textvariable=self.l2_var, text='未下载')
        self.m = Menu(self.window)

    def place_widget(self):
        self.l0.pack()
        self.l1.pack(fill=X)
        self.f1.place(x=40, y=55)
        self.e1.pack()
        self.f2.place(x=40, y=102)
        self.t1.pack()
        self.b1.place(x=40, y=265)
        self.b2.place(x=170, y=265)
        self.b3.place(x=40, y=298)
        self.b4.place(x=170, y=298)
        self.f3.place(x=40, y=329)
        self.f4.place(x=40, y=210)
        self.canvas.pack(side='left')
        self.l2.pack(side='left', anchor=S)

    def set_widget(self):
        self.l1.config( width=30, justify='center', foreground='red')
        self.t1.insert(END, '{_xing}\n将抖音分享链接地址粘贴在上面输入框中,本程序会自动解析出视频的下载地址并且显示在这里\n{_xing}'.format(_xing='*' * 29))
        self.b1.config( command=lambda: self.thread_it(self.analysis_video))
        self.b2.config(state='disable', command=lambda: self.thread_it(self.download_video))
        self.b3.config(command=self.open_dir)
        self.b4.config( command=self.quit_window)
        self.canvas.config(width=210, height=20)
        self.window['menu'] = self.m
        self.s1 = Menu(self.m, tearoff=False)
        self.s2 = Menu(self.m, tearoff=False)
        self.s3=Menu(self.m,tearoff=False)
        self.s1.add_command(label='打开文件夹', command=self.open_dir)
        self.s1.add_separator()
        self.s1.add_command(label='退出', command=self.quit_window)
        self.s2.add_command(label='解析', command=self.analysis_video)
        self.s2.add_command(label='下载', command=self.download_video,state='disable')
        self.s3.add_command(label='关于',command=self.show_info)
        self.m.add_cascade(label='文件', menu=self.s1)
        self.m.add_cascade(label='视频', menu=self.s2)
        self.m.add_cascade(label='关于',menu=self.s3)
        self.window.protocol("WM_DELETE_WINDOW",self.quit_window)
        self.window.bind('<Escape>',self.escape)
        self.window.bind('<Return>',lambda :self.thread_it(self.download_video))

    def analysis_video(self):
        src_link=self.e1.get()
        if len(src_link)!=0:
            global item
            item=Douyin_Engine().analysis_real_addr(src_link)
            if item:
                self.t1.delete(0.0,END)
                self.t1.insert(END,item['video_title']+"\n"+item["video_link"])
                self.b2.config(state=NORMAL)
                self.s2.entryconfig('下载',state='normal')
            else:
                messagebox.showwarning('警告','解析失败!')
            print(item)
        else:
            messagebox.showwarning('警告','请输入链接!')

    def download_video(self):
        try:
            os.mkdir(self.video_path)
        except:
            pass
        video_title=item['video_title']
        full_path=self.video_path+video_title+'.mp4'
        fill_line = self.canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green")
        for n in Douyin_Engine().download_video(full_path,item['video_link']):
            self.canvas.coords(fill_line, (0, 0, n, 60))
            self.window.update()
        self.t1.delete('0.0', END)
        self.t1.insert(END, '{title}.mp4\n下载完成!'.format(title=video_title))

    # 打开文件夹函数
    def open_dir(self):
        try:
            os.mkdir(self.video_path)
        except:
            pass
        abs_path = os.path.abspath(self.video_path)
        os.startfile(abs_path)

    def escape(self,event):
        self.quit_window()

    # 退出窗口函数
    def quit_window(self):
        ret=messagebox.askyesno('退出','是否要退出?')
        if ret:
            self.window.destroy()

    def show_info(self):
        messagebox.showinfo('关于','***本软件仅供学习交流使用!***\n\n将抖音分享链接地址粘贴在输入框中\n解析后显示视频的无水印下载地址')

    # 函数打包进线程
    def thread_it(self,func, *args):
        t = threading.Thread(target=func, args=args)
        t.setDaemon(True)  # 先守护主线程
        t.start()  # 再启动

if __name__ == '__main__':
    app=App()
'''
test_url:   https://v.douyin.com/JcxTMj2/
'''

4.2 DouYin_Downloader_Engine.py

import requests
import json
import re

class Douyin_Engine:

    def clean_txt(self, str):  # 清洗标题中不能用于命名文件的字符
        rstr = r"[\/\\\:\*\?\"\<\>\|]"  # '/ \ : * ? " < > |'
        str = re.sub(rstr, "_", str)  # 替换为下划线
        return str

    def analysis_real_addr(self,src_link):
        item={}
        headers = {
            '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',
            'sec-fetch-dest': 'document',
            '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'
        }
        try:
            r=requests.get(src_link,headers=headers,allow_redirects=False)
            item_id=re.findall(r'/video/(\d+)/?',r.text)
            interface_url='https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}'.format(''.join(item_id))
            r2=requests.get(interface_url,headers=headers)
            _json=json.loads(r2.text)
            title=_json.get('item_list')[0].get('share_info').get('share_title')
            wm_link=_json.get('item_list')[0].get('video').get('play_addr').get('url_list')[0]
            item['video_title']=self.clean_txt(title)
            item['video_link']=re.sub('playwm','play',wm_link)
            return item
        except :
            return False

    def download_video(self,file,link):
        headers = {
            'sec-fetch-dest': 'document',
            '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'
        }
        r=requests.get(link,headers=headers,stream=True)
        chunk_size=1024
        video_size=int(r.headers['Content-Length'])
        raise_data = 210 / (video_size / chunk_size)  # 增量大小,210为进度条的长度
        with open(file,'wb')as f:
            size_ = 0
            for data in r.iter_content(chunk_size):
                size_+=raise_data
                f.write(data)
                yield size_

五.说明&总结

5.1说明:

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

5.2总结:
本次使用python的tkinter撰写了一个抖音无水印视频爬取GUI工具,因为中间写过几个GUI界面了对tkinter的widget有些熟悉了,线程用起来更加熟练。他山之石,可以攻玉,本次思路、代码的撰写参考了:

tkinter实现下载进度条(python)

以上帮助我解决了进度条问题。

最新版抖音(20200624)去水印原理及源码,简单的原理与面临的挑战

以上帮助我解决了视频接口获取问题。
本程序做到了UI界面与爬虫分开。

在此感谢帮助我的人!,工具已经打包上传到了蓝奏云https://wws.lanzoux.com/isCLul0dlfa
, 思路、代码方面有什么不足欢迎各位大佬指正、批评!觉得工具还行的话点个呗!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3GUI--抖音无水印视频下载工具(附源码) 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc

随机推荐

  • 【Linux扩容】Vmware虚拟机内的Linux扩容

    1 虚拟机设置 Vmware 虚拟机 设置 硬盘 扩展 40 64G 2 Linux磁盘扩展 有图形化桌面 GParted 分区上右键 扩展 保存 无图形化桌面 找一个有图形化桌面的Linux live镜像 CD载入 或者LinuxToGo
  • Linux网络编程之Tcp(内含服务器、客户端代码实例)

    文章目录 前言 Tcp模型 服务器端 客户机端 代码 运行结果 结束 前言 本节讲解需要相关的网络基础知识 如果缺少相关知识 请先学习 Linux网络编程之网络基础 和 Linux网络编程之网络基础2 Tcp模型 先打开我们之前讲过的Tcp
  • CVE-2021-40444漏洞复现详细

    2021年9月8日 微软官方发布了MSHTML组件的风险通告 漏洞编号 CVE 2021 40444 未经身份验证的攻击者可以利用该漏洞在目标系统上远程执行代码 微软官方表示已经监测到该漏洞存在在野利用 1 漏洞详情 Microsoft M
  • js 本地存储和获取

    localStorage setItem temp orderAr 存入 参数 1 调用的值 2 所要存入的数据 console log localStorage getItem temp 输出
  • 安装用jieba,实现用TF-IDF算法进行关键词的提取

    文本知识提取 目录 1 安装jieba 2 TF IDF算法 2 1算法的定义 2 2算法的应用 1 词性标注 2 去停用词 3 关键词提取 1 安装jieba Jieba分词官网 https github com fxsjy jieba
  • 基于k8s的微服务一键部署解决方案

    父项目msagd配置 编写pom xml的属性标签
  • Day8_8 Java学习之List集合类

    目录 一 List集合的概述 ArrayList集合类的概述 ArrayList集合的语法定义 ArrayList集合的常用方法 LinkedList集合概述 LinkedList集合的语法定义 LinkedList集合类常用方法 二 Se
  • Unity项目资源加载管理简易框架(Resource)

    文章目录 一 背景 二 思路概述 三 具体实现代码及其思路梳理 1 资源路径 2 资源管理 3 资源加载 4 资源管理 四 说明 一 背景 在Unity的轻量型项目中如果对优化没有特别搞得要求 如果需要用到Resource Load这个接口
  • 算高差改正数的计算机程序,水准测量中测量高差的改正数怎么计算?

    原标题 水准测量中测量高差的改正数怎么计算 工程测量中 高速铁路 城市轨道涉及到二等水准 一般铁路涉及三 四等水准 高速公路 房建 市政一般采用四等水准 沉降观测各等级均涉及 在水准测量中高差的改正三四等水准需要进行水准标尺长度改正 正常水
  • 基于51单片机简易电子琴设计(含Keil程序和Proteus文件)

    一 系统概述 系统使用的模块有AT89C51单片机 8位共阳数码管 矩阵键盘 小灯 按键 蜂鸣器 本次设计的电子琴系统以AT89C51单片机为控制核心 使用数码管显示音符 右侧的矩阵键盘可以理解为琴键 按下不同的按键就能显示不同的音符 按下
  • 最新服务器CPUe5,看这里!2019 至强 Xeon E5 服务器系列 CPU 天梯图分享

    排名名称评分 1Intel Xeon E5 2679 v4 2 50GHz25 236 2Intel Xeon E5 2699 v4 2 20GHz23 200 3Intel Xeon E5 2696 v3 2 30GHz22 548 4I
  • LNCS用户写作指南【 Springer Computer Science Proceedings 】

    转自 http blog csdn net wyskys article details 18075471 重点是文末的参考文献格式 主要的是 链接 期刊论文 会议论文的引用格式 下載地址 http static springer com
  • Jsoup 抓取网页内容demo

    1 代码 public Document getDocument String url try return Jsoup connect url get catch IOException e e printStackTrace retur
  • 为什么电脑的时间总是快2分钟

    由于工作需要 今天领到一台新的笔记本 轻轻地抚摸 新伙伴 的同时 发现笔记本的时间 快了2分钟 o o表情 明明已经联网了 为啥还是快两分钟呢 于是我就一顿操作猛如虎 结果一看 服务器连接的是 time windows com 这可不行 我
  • 【Linux】Ubuntu系统下用apt命令删除/卸载软件包

    大家都知道 在ubuntu中安装一个新的软件包时 直接使用sudo apt get install命令就好 那么 如果要卸载或者删除一个软件包呢 1 删除为了满足依赖而安装的 但现在不再需要的软件包 包括已安装包 保留配置文件 这个命令容易
  • C/C++编程题开头字符串、数据输入几种写法

    1 题设 在IT公司编程题中 多数会让你一并写上测试数据输入和结果输出的Demo 这也是程序员基本的功底 想一想如果连自己的测试数据都无法给入 后面的算法写的再好 也无法测试它的准确性和效果 下面分别从c c 以及字符串输入和数组输入 来谈
  • Python 多线程、线程池、进程池

    线程间的通讯机制 消息队列 event 事件对象 当线程创建完成之后 并不会马上执行线程 而是等待某一事件发生 线程才会启动 import threading 创建 event 对象 event threading Event 重置代码中的
  • BeyondCompare破解版的下载安装

    目前Beyond Compare的版本已经支持到4 2的release版本 官网 https www scootersoftware com download php 支持 windows mac linux版本 这里我们选择的mac版本
  • android设置白天模式和夜间模式

    if isDay AppCompatDelegate setDefaultNightMode AppCompatDelegate MODE NIGHT YES else AppCompatDelegate setDefaultNightMo
  • python3GUI--抖音无水印视频下载工具(附源码)

    文章目录 一 准备工作 二 预览 0 复制抖音分享短链接 1 启动 2 运行 3 结果 三 设计流程 1 总体设计 2 详细设计 四 源代码 五 说明 总结 hello 大家好啊 失踪人口回归了 捂脸 本次使用tkinter撰写一篇 抖音无