拼兮兮视频下载工具源码

查看 97|回复 9
作者:hfol85   
成品已打包exe在精软版块:https://www.52pojie.cn/thread-2000070-1-1.html
[Python] 纯文本查看 复制代码import tkinter as tk
from tkinter import messagebox, filedialog
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import os
import configparser
import re
import requests
from urllib.parse import urlparse
class BrowserAutomationApp:
    def __init__(self, root):
        self.root = root
        self.root.title("多多视频下载")
        
        # 加载配置文件
        self.config = configparser.ConfigParser()
        self.config.read('config.ini')
        if not self.config.has_section('Settings'):
            self.config.add_section('Settings')
            self.config.set('Settings', 'browser_path', '')
            self.config.set('Settings', 'profile_path', '')
            self.config.set('Settings', 'browser_type', 'chrome')
        
        # 创建菜单栏
        self.create_menu()
        
        # 浏览器选择
        self.browser_frame = tk.Frame(root)
        self.browser_frame.pack(pady=5)
        
        self.browser_label = tk.Label(self.browser_frame, text="选择浏览器:")
        self.browser_label.pack(side=tk.LEFT)
        
        self.browser_var = tk.StringVar(value=self.config.get('Settings', 'browser_type', fallback='chrome'))
        self.browser_menu = tk.OptionMenu(self.browser_frame, self.browser_var, "chrome", "firefox", "edge")
        self.browser_menu.pack(side=tk.LEFT, padx=5)
        
        # 浏览器路径选择
        self.path_frame = tk.Frame(root)
        self.path_frame.pack(pady=5)
        
        self.path_label = tk.Label(self.path_frame, text="浏览器路径:")
        self.path_label.pack(side=tk.LEFT)
        
        self.path_entry = tk.Entry(self.path_frame, width=40)
        self.path_entry.insert(0, self.config.get('Settings', 'browser_path', fallback=''))
        self.path_entry.pack(side=tk.LEFT, padx=5)
        
        self.path_button = tk.Button(self.path_frame, text="浏览...", command=self.select_browser_path)
        self.path_button.pack(side=tk.LEFT)
        
        # 用户数据目录选择
        self.profile_frame = tk.Frame(root)
        self.profile_frame.pack(pady=5)
        
        self.profile_label = tk.Label(self.profile_frame, text="用户数据目录:")
        self.profile_label.pack(side=tk.LEFT)
        
        self.profile_entry = tk.Entry(self.profile_frame, width=40)
        self.profile_entry.insert(0, self.config.get('Settings', 'profile_path', fallback=''))
        self.profile_entry.pack(side=tk.LEFT, padx=5)
        
        self.profile_button = tk.Button(self.profile_frame, text="浏览...", command=self.select_profile_path)
        self.profile_button.pack(side=tk.LEFT)
        
        # URL输入
        self.url_label = tk.Label(root, text="输入URL:")
        self.url_label.pack()
        
        # URL输入框
        self.url_entry = tk.Entry(root, width=50)
        self.url_entry.pack()
        
        # 添加右键菜单
        self.url_menu = tk.Menu(self.url_entry, tearoff=0)
        self.url_menu.add_command(label="复制", command=lambda: self.url_entry.event_generate(">"))
        self.url_menu.add_command(label="粘贴", command=lambda: self.url_entry.event_generate(">"))
        self.url_menu.add_command(label="剪切", command=lambda: self.url_entry.event_generate(">"))
        self.url_menu.add_separator()
        self.url_menu.add_command(label="全选", command=lambda: self.url_entry.select_range(0, tk.END))
        
        # 绑定右键事件
        self.url_entry.bind("[B]", self.show_url_menu)
        
        # 按钮框架
        self.button_frame = tk.Frame(root)
        self.button_frame.pack(pady=10)
        
        # 获取源代码按钮
        self.get_source_button = tk.Button(self.button_frame, text="获取源代码", command=self.get_source_code)
        self.get_source_button.pack(side=tk.LEFT, padx=5)
        
        # 下载视频按钮
        self.download_button = tk.Button(self.button_frame, text="下载视频", command=self.download_video)
        self.download_button.pack(side=tk.LEFT)
        
        # 源代码显示
        self.source_text = tk.Text(root, wrap=tk.WORD, width=80, height=30)
        self.source_text.pack(padx=10, pady=10)
        
        # 滚动条
        scrollbar = tk.Scrollbar(root)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.source_text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.source_text.yview)
        
    def create_menu(self):
        """创建菜单栏"""
        menubar = tk.Menu(self.root)
        
        # 文件菜单
        file_menu = tk.Menu(menubar, tearoff=0)
        file_menu.add_command(label="退出", command=self.root.quit)
        menubar.add_cascade(label="文件", menu=file_menu)
        
        # 帮助菜单
        help_menu = tk.Menu(menubar, tearoff=0)
        help_menu.add_command(label="使用说明", command=self.show_help)
        help_menu.add_command(label="关于", command=self.show_about)
        menubar.add_cascade(label="帮助", menu=help_menu)
        
        self.root.config(menu=menubar)
        
    def show_help(self):
        """显示帮助说明"""
        help_text = """网页源代码查看器 使用说明
1. 选择浏览器类型(Chrome/Firefox/Edge)
2. 设置浏览器可执行文件路径(可选)
3. 设置用户数据目录(可选)
4. 输入要查看的网页URL
5. 点击"获取源代码"按钮
6. 源代码将显示在下方文本框中
7. 可以点击"下载视频"按钮下载页面中的视频
注意:
- 首次使用需要安装对应浏览器的WebDriver
- 确保浏览器版本与WebDriver版本匹配
- 下载视频功能仅支持部分网站"""
        messagebox.showinfo("使用说明", help_text)
        
    def show_about(self):
        """显示关于信息"""
        about_text = """网页源代码查看器 v1.0
作者:Cline
功能:自动获取网页源代码并支持视频下载"""
        messagebox.showinfo("关于", about_text)
        
    def select_browser_path(self):
        filetypes = [("可执行文件", "*.exe")]
        path = filedialog.askopenfilename(title="选择浏览器可执行文件", filetypes=filetypes)
        if path:
            self.path_entry.delete(0, tk.END)
            self.path_entry.insert(0, path)
    def select_profile_path(self):
        path = filedialog.askdirectory(title="选择用户数据目录")
        if path:
            self.profile_entry.delete(0, tk.END)
            self.profile_entry.insert(0, path)
    def get_source_code(self):
        url = self.url_entry.get().strip()
        if not url:
            messagebox.showwarning("输入错误", "请输入有效的URL")
            return
            
        browser_path = self.path_entry.get().strip()
        profile_path = self.profile_entry.get().strip()
            
        try:
            # 初始化浏览器
            browser = self.browser_var.get()
            if browser_path:
                if browser == "chrome":
                    options = webdriver.ChromeOptions()
                    if profile_path:
                        options.add_argument(f'--user-data-dir={profile_path}')
                    else:
                        options.add_argument(f'--user-data-dir={os.path.join(os.getcwd(), "chrome_profile")}')
                    options.binary_location = browser_path
                    driver = webdriver.Chrome(options=options)
                elif browser == "firefox":
                    options = webdriver.FirefoxOptions()
                    options.add_argument('--headless')
                    if profile_path:
                        profile = webdriver.FirefoxProfile(profile_path)
                    else:
                        profile = webdriver.FirefoxProfile(os.path.join(os.getcwd(), "firefox_profile"))
                    options.profile = profile
                    options.binary_location = browser_path
                    driver = webdriver.Firefox(options=options)
                elif browser == "edge":
                    options = webdriver.EdgeOptions()
                    options.add_argument('--headless')
                    if profile_path:
                        options.add_argument(f'--user-data-dir={profile_path}')
                    else:
                        options.add_argument(f'--user-data-dir={os.path.join(os.getcwd(), "edge_profile")}')
                    options.binary_location = browser_path
                    driver = webdriver.Edge(options=options)
            else:
                if browser == "chrome":
                    options = webdriver.ChromeOptions()
                    if profile_path:
                        options.add_argument(f'--user-data-dir={profile_path}')
                    else:
                        options.add_argument(f'--user-data-dir={os.path.join(os.getcwd(), "chrome_profile")}')
                    driver = webdriver.Chrome(options=options)
                elif browser == "firefox":
                    options = webdriver.FirefoxOptions()
                    if profile_path:
                        profile = webdriver.FirefoxProfile(profile_path)
                    else:
                        profile = webdriver.FirefoxProfile(os.path.join(os.getcwd(), "firefox_profile"))
                    options.profile = profile
                    driver = webdriver.Firefox(options=options)
                elif browser == "edge":
                    options = webdriver.EdgeOptions()
                    if profile_path:
                        options.add_argument(f'--user-data-dir={profile_path}')
                    else:
                        options.add_argument(f'--user-data-dir={os.path.join(os.getcwd(), "edge_profile")}')
                    driver = webdriver.Edge(options=options)
            
            # 访问URL
            driver.get(url)
            time.sleep(2)  # 等待页面加载
            
            # 直接获取页面源代码
            try:
                # 确保页面加载完成
                time.sleep(2)
               
                # 获取页面源代码
                page_source = driver.page_source
               
                # 在文本框中显示源代码
                self.source_text.delete(1.0, tk.END)
                self.source_text.insert(tk.END, page_source)
               
                # 关闭浏览器
                driver.quit()
            except Exception as e:
                messagebox.showerror("错误", f"获取源代码失败: {str(e)}")
                if 'driver' in locals():
                    driver.quit()
            
        except Exception as e:
            messagebox.showerror("错误", f"发生错误: {str(e)}")
            if 'driver' in locals():
                driver.quit()
    def save_config(self):
        self.config.set('Settings', 'browser_path', self.path_entry.get())
        self.config.set('Settings', 'profile_path', self.profile_entry.get())
        self.config.set('Settings', 'browser_type', self.browser_var.get())
        with open('config.ini', 'w') as configfile:
            self.config.write(configfile)
    def find_video_urls(self, html):
        """从HTML中查找视频URL"""
        video_urls = set()
        
        # 查找h5AutoPlayUrl标签
        h5_pattern = r'h5AutoPlayUrl["\']?:\s*["\'](https?:\\u002F\\u002F[^"\']+)'
        h5_matches = re.findall(h5_pattern, html)
        
        # 处理Unicode转义字符
        for url in h5_matches:
            # 替换Unicode转义字符
            formatted_url = url.replace('\\u002F', '/')
            # 验证URL格式
            if re.match(r'^https?://', formatted_url):
                video_urls.add(formatted_url)
        
        # 查找常规视频链接
        pattern = r'(https?://[^\s"\']+?\.(mp4|webm|ogg|mov|avi|mkv))'
        matches = re.findall(pattern, html, re.IGNORECASE)
        video_urls.update([m[0] for m in matches])
        
        return list(video_urls)
    def show_url_menu(self, event):
        """显示URL输入框的右键菜单"""
        self.url_menu.post(event.x_root, event.y_root)
    def download_video(self):
        """下载视频"""
        html = self.source_text.get(1.0, tk.END)
        if not html.strip():
            messagebox.showwarning("警告", "请先获取网页源代码")
            return
            
        video_urls = self.find_video_urls(html)
        if not video_urls:
            messagebox.showwarning("警告", "未找到可下载的视频链接")
            return
            
        # 选择保存路径
        save_path = filedialog.asksaveasfilename(
            defaultextension=".mp4",
            filetypes=[("MP4 files", "*.mp4"), ("All files", "*.*")]
        )
        if not save_path:
            return
            
        try:
            # 下载第一个找到的视频
            url = video_urls[0]
            response = requests.get(url, stream=True)
            response.raise_for_status()
            
            total_size = int(response.headers.get('content-length', 0))
            downloaded = 0
            
            with open(save_path, 'wb') as f:
                for chunk in response.iter_content(chunk_size=8192):
                    f.write(chunk)
                    downloaded += len(chunk)
                    progress = int(100 * downloaded / total_size)
                    self.download_button.config(text=f"下载中...{progress}%")
                    self.root.update()
                    
            self.download_button.config(text="下载视频")
            messagebox.showinfo("成功", f"视频已保存到:{save_path}")
            
        except Exception as e:
            messagebox.showerror("错误", f"下载视频失败: {str(e)}")
            self.download_button.config(text="下载视频")
if __name__ == "__main__":
    root = tk.Tk()
    app = BrowserAutomationApp(root)
    root.protocol("WM_DELETE_WINDOW", lambda: [app.save_config(), root.destroy()])
    root.mainloop()

源代码, 视频

yanyukun   

很实用,谢谢楼主分享
hangzai1667   

感谢分享!
LateCherish   

好东西 收藏下载了
huyudian   

666,看起来很厉害
ldecxh   

很棒,刚刚试一下,运行速度很快
zhanghaixin110   

试一试。
cnmiss   

下载来试一下,666
aiguohou   

收藏下载了
suiyuan00a   

很实用,谢谢楼主分享
您需要登录后才可以回帖 登录 | 立即注册

返回顶部