├── requirements.txt ├── .gitignore ├── README.md ├── .cursorrules ├── utils ├── cookie_manager.py └── qr_handler.py └── main.py /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.31.0 2 | python-dotenv==1.0.0 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Python 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | *.so 6 | .Python 7 | env/ 8 | build/ 9 | develop-eggs/ 10 | dist/ 11 | downloads/ 12 | eggs/ 13 | .eggs/ 14 | lib/ 15 | lib64/ 16 | parts/ 17 | sdist/ 18 | var/ 19 | wheels/ 20 | *.egg-info/ 21 | .installed.cfg 22 | *.egg 23 | 24 | # Virtual Environment 25 | venv/ 26 | ENV/ 27 | 28 | # IDE 29 | .idea/ 30 | .vscode/ 31 | *.swp 32 | *.swo 33 | 34 | # Project specific 35 | data/ 36 | *.log 37 | .env 38 | 39 | # macOS 40 | .DS_Store 41 | .AppleDouble 42 | .LSOverride -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 抖音Cookies管理工具 2 | 3 | 这是一个简单易用的抖音Cookies管理工具,可以帮助用户导入和管理抖音网页版的登录凭证,并支持解析抖音分享链接获取视频ID。 4 | 5 | ## 功能特点 6 | 7 | - 📋 支持直接粘贴Cookies 8 | - 🔄 自动转换Cookies格式 9 | - 💾 自动保存Cookies 10 | - ✅ 验证Cookies有效性 11 | - 📎 一键复制有效Cookies 12 | - 🔍 解析抖音分享链接 13 | - 📝 自动提取视频ID 14 | - 📋 一键复制视频ID 15 | - 🔒 安全的本地存储 16 | 17 | ## 使用方法 18 | 19 | 1. 安装依赖: 20 | ```bash 21 | pip install -r requirements.txt 22 | ``` 23 | 24 | 2. 准备工作: 25 | - 使用Chrome浏览器访问抖音网页版 26 | - 在Chrome商店安装 "Cookie Editor" 扩展 27 | - 登录抖音网页版 28 | 29 | 3. 获取Cookies: 30 | - 登录成功后,点击Cookie Editor扩展图标 31 | - 点击 "Export" -> "Export as JSON" 32 | - 全选并复制导出的JSON内容 33 | 34 | 4. 运行程序: 35 | ```bash 36 | python main.py 37 | ``` 38 | 39 | 5. 导入Cookies: 40 | - 将复制的JSON内容粘贴到文本框中 41 | - 点击 "导入Cookies" 按钮 42 | - 等待导入完成 43 | 44 | 6. 验证和使用Cookies: 45 | - 点击 "验证Cookies" 按钮检查有效性 46 | - 点击 "复制Cookies" 按钮获取格式化的Cookies字符串 47 | - 复制的Cookies可直接用于浏览器或其他工具 48 | 49 | 7. 解析视频链接: 50 | - 从抖音APP或网页版获取视频分享链接 51 | - 将分享链接粘贴到输入框中 52 | - 点击 "解析链接" 按钮 53 | - 自动提取并显示视频ID 54 | - 点击 "复制ID" 按钮获取视频ID 55 | 56 | ## 项目结构 57 | 58 | - `main.py`: 主程序入口 59 | - `utils/`: 工具函数目录 60 | - `cookie_manager.py`: Cookie管理模块 61 | - `data/`: 数据存储目录 62 | 63 | ## 技术架构 64 | 65 | - 使用`tkinter`提供图形界面 66 | - 使用`requests`库处理HTTP请求 67 | - 使用`json`处理Cookie数据 68 | - 使用`re`模块解析分享链接 69 | 70 | ## 注意事项 71 | 72 | - 请勿将cookies分享给他人 73 | - 建议定期更新cookies 74 | - 遵守抖音平台的使用规范 -------------------------------------------------------------------------------- /.cursorrules: -------------------------------------------------------------------------------- 1 | 你是一名精通 Python 开发的高级工程师,拥有 20 年的开发经验。你的任务是帮助一位不太懂技术的初中生用户完成一个简单易用软件。这个插件需要功能完善且用户友好. 2 | ##目标 3 | 你的目标是通过用户可以轻松理解的方式,指导他们完成一个简单的 Python 项目开发和调试工作。你需要主动推动项目进展,而不是等待用户不断催促,并确保用户理解每个步骤,并给出反馈,编写README.md文件用于说明项目功能、架构和开发计划。 4 | 5 | ##第一步:项目初始化 6 | 1. 浏览项目文件 7 | • 如果用户已经提供了项目文件,包括主要的 Python 脚本或配置文件,优先仔细阅读。 8 | • 如果还没有任何文件,创建一个基础的 Python 项目结构,包括以下内容: 9 | • main.py: 主程序文件 10 | • requirements.txt: 依赖文件 11 | • README.md: 项目说明文件 12 | 2. 创建 README.md 13 | • 在项目根目录创建 README.md 文件,用于说明项目功能、架构和开发计划。 14 | • 内容包括: 15 | • 项目的功能目标。 16 | • 项目各部分的作用,如主程序文件、模块划分等。 17 | • 未来可能的优化方向。 18 | 19 | ##第二步:需求分析和开发 20 | 21 | 理解用户需求时: 22 | • 充分沟通:理解项目的核心功能,比如是否需要 GUI 界面、文件操作或数据处理。 23 | • 提出改进建议:如果需求不够完善,主动提出改进方案。 24 | • 简化实现方案:选择适合用户理解和开发的简单解决方案。 25 | 26 | 编写代码时: 27 | 1. 主程序文件 28 | • 在 main.py 中定义项目的主逻辑。 29 | • 使用清晰的函数划分每个功能模块。 30 | • 为每段代码添加中文注释,帮助用户理解。 31 | 2. 模块化代码 32 | • 如果项目较复杂,将不同功能划分为单独模块。 33 | • 在 modules/ 目录中存放辅助脚本(如 data_processing.py、utils.py)。 34 | 3. 依赖管理 35 | • 在 requirements.txt 文件中列出项目所需的第三方库。 36 | • 提供如何安装依赖的说明(如使用 pip install -r requirements.txt)。 37 | 4. 图形用户界面(可选) 38 | • 如果项目需要 GUI,可使用 tkinter、PyQt 或 Kivy 等框架。 39 | • 设计简单、直观的界面,方便用户操作。 40 | 41 | 解决问题时: 42 | • 全面检查:分析可能的错误或异常。 43 | • 反馈与调整:与用户沟通后及时修复问题。 44 | • 测试兼容性:确保代码在不同操作系统和 Python 版本中都能正常运行。 45 | 46 | ##第三步:项目总结和优化 47 | 1. 反思与总结 48 | • 完成后总结开发过程,整理每一步的思路。 49 | • 更新 README.md,包括项目功能说明、操作指南和优化建议。 50 | 2. 性能优化 51 | • 使用 cProfile 或 line_profiler 分析代码性能。 52 | • 优化算法,减少不必要的计算,提高运行效率。 53 | 3. 新特性建议 54 | • 介绍 Python 的高级特性(如异步编程、生成器)用于未来优化。 55 | • 提供用户可选的增强功能建议,比如支持多线程处理、自动化任务等。 -------------------------------------------------------------------------------- /utils/cookie_manager.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import json 6 | import requests 7 | from datetime import datetime 8 | 9 | class CookieManager: 10 | def __init__(self): 11 | self.cookie_file = "data/cookies.json" 12 | self.verify_url = "https://www.douyin.com/user/self" 13 | self.headers = { 14 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", 15 | "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.7", 16 | "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", 17 | "Connection": "keep-alive" 18 | } 19 | 20 | # 确保data目录存在 21 | os.makedirs(os.path.dirname(self.cookie_file), exist_ok=True) 22 | 23 | def save_cookies(self, cookies): 24 | """保存cookies到文件""" 25 | try: 26 | cookie_data = { 27 | "cookies": cookies, 28 | "timestamp": datetime.now().isoformat() 29 | } 30 | 31 | with open(self.cookie_file, "w", encoding="utf-8") as f: 32 | json.dump(cookie_data, f, ensure_ascii=False, indent=2) 33 | return True 34 | 35 | except Exception as e: 36 | print(f"保存cookies时出错: {str(e)}") 37 | return False 38 | 39 | def load_cookies(self): 40 | """从文件加载cookies""" 41 | try: 42 | if not os.path.exists(self.cookie_file): 43 | return None 44 | 45 | with open(self.cookie_file, "r", encoding="utf-8") as f: 46 | cookie_data = json.load(f) 47 | return cookie_data["cookies"] 48 | 49 | except Exception as e: 50 | print(f"加载cookies时出错: {str(e)}") 51 | return None 52 | 53 | def verify_cookies(self, cookies): 54 | """验证cookies是否有效""" 55 | try: 56 | session = requests.Session() 57 | session.cookies.update(cookies) 58 | 59 | response = session.get( 60 | self.verify_url, 61 | headers=self.headers, 62 | allow_redirects=False, 63 | timeout=10 64 | ) 65 | 66 | print(f"验证响应状态码: {response.status_code}") # 添加调试信息 67 | 68 | # 如果返回200且不是重定向,说明cookies有效 69 | return response.status_code == 200 70 | 71 | except Exception as e: 72 | print(f"验证cookies时出错: {str(e)}") 73 | return False -------------------------------------------------------------------------------- /utils/qr_handler.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import qrcode 5 | import requests 6 | import json 7 | import time 8 | import random 9 | from PIL import Image 10 | from io import BytesIO 11 | from requests.adapters import HTTPAdapter 12 | from urllib3.util.retry import Retry 13 | 14 | class QRCodeHandler: 15 | def __init__(self): 16 | self.session = requests.Session() 17 | 18 | # 配置重试策略 19 | retry_strategy = Retry( 20 | total=3, # 最大重试次数 21 | backoff_factor=1, # 重试间隔 22 | status_forcelist=[500, 502, 503, 504] # 需要重试的HTTP状态码 23 | ) 24 | 25 | # 配置适配器 26 | adapter = HTTPAdapter(max_retries=retry_strategy) 27 | self.session.mount("http://", adapter) 28 | self.session.mount("https://", adapter) 29 | 30 | self.qr_id = None 31 | self.device_id = str(random.randint(10000000000, 99999999999)) 32 | self.headers = { 33 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", 34 | "Accept": "application/json, text/plain, */*", 35 | "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", 36 | "Content-Type": "application/json;charset=UTF-8", 37 | "Origin": "https://www.douyin.com", 38 | "Referer": "https://www.douyin.com/", 39 | "Cookie": "", 40 | "Host": "www.douyin.com", 41 | "Connection": "keep-alive" 42 | } 43 | 44 | def _make_request(self, method, url, **kwargs): 45 | """发送请求的通用方法,包含重试逻辑""" 46 | kwargs.setdefault('timeout', 30) # 设置默认超时时间为30秒 47 | max_retries = 3 48 | 49 | for attempt in range(max_retries): 50 | try: 51 | response = self.session.request(method, url, **kwargs) 52 | response.raise_for_status() 53 | return response 54 | except requests.exceptions.RequestException as e: 55 | if attempt == max_retries - 1: # 最后一次重试 56 | raise 57 | print(f"请求失败,正在重试 ({attempt + 1}/{max_retries}): {str(e)}") 58 | time.sleep(2 ** attempt) # 指数退避 59 | 60 | def generate_qr_code(self): 61 | """生成登录二维码""" 62 | try: 63 | # 首先访问主页获取必要的cookies 64 | self._make_request("GET", "https://www.douyin.com/", headers=self.headers) 65 | 66 | # 获取二维码ID 67 | data = { 68 | "service": "https://www.douyin.com", 69 | "need_logo": False, 70 | "device_id": self.device_id, 71 | "aid": 1128, 72 | "platform": "web_pc", 73 | "web_timestamp": int(time.time()) 74 | } 75 | 76 | response = self._make_request( 77 | "POST", 78 | "https://sso.douyin.com/get_qrcode/", 79 | headers=self.headers, 80 | json=data 81 | ) 82 | 83 | try: 84 | data = response.json() 85 | print(f"获取二维码响应: {data}") 86 | except json.JSONDecodeError as e: 87 | print(f"解析响应失败: {str(e)}") 88 | print(f"响应内容: {response.text}") 89 | return None 90 | 91 | if data.get("data", {}).get("qrcode"): 92 | self.qr_id = data["data"]["token"] 93 | qr_url = data["data"]["qrcode"] 94 | 95 | if not qr_url: 96 | print(f"未找到二维码URL: {data}") 97 | return None 98 | 99 | # 生成二维码图片 100 | qr = qrcode.QRCode( 101 | version=1, 102 | error_correction=qrcode.constants.ERROR_CORRECT_L, 103 | box_size=10, 104 | border=4, 105 | ) 106 | qr.add_data(qr_url) 107 | qr.make(fit=True) 108 | 109 | qr_image = qr.make_image(fill_color="black", back_color="white") 110 | return qr_image 111 | else: 112 | print(f"获取二维码失败: {data}") 113 | return None 114 | 115 | except Exception as e: 116 | print(f"生成二维码时出错: {str(e)}") 117 | return None 118 | 119 | def check_login(self): 120 | """检查登录状态""" 121 | if not self.qr_id: 122 | return False 123 | 124 | try: 125 | data = { 126 | "token": self.qr_id, 127 | "service": "https://www.douyin.com", 128 | "device_id": self.device_id, 129 | "web_timestamp": int(time.time()) 130 | } 131 | 132 | response = self._make_request( 133 | "POST", 134 | "https://sso.douyin.com/check_qrconnect/", 135 | headers=self.headers, 136 | json=data 137 | ) 138 | 139 | try: 140 | data = response.json() 141 | print(f"检查登录状态响应: {data}") 142 | except json.JSONDecodeError: 143 | print("解析登录状态响应失败") 144 | return False 145 | 146 | # 检查登录状态 147 | if data.get("data", {}).get("status") == "confirmed": 148 | return True 149 | elif data.get("data", {}).get("status") == "scanned": 150 | print("已扫码,等待确认") 151 | else: 152 | print("等待扫码") 153 | return False 154 | 155 | except Exception as e: 156 | print(f"检查登录状态时出错: {str(e)}") 157 | return False 158 | 159 | def get_cookies(self): 160 | """获取登录后的cookies""" 161 | if not self.session.cookies: 162 | return None 163 | 164 | return self.session.cookies.get_dict() -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import tkinter as tk 6 | from tkinter import messagebox, scrolledtext 7 | import json 8 | import re 9 | import requests 10 | from utils.cookie_manager import CookieManager 11 | 12 | class DouYinCookieManager: 13 | def __init__(self): 14 | self.root = tk.Tk() 15 | self.root.title("抖音Cookies管理工具") 16 | self.root.geometry("600x800") 17 | 18 | self.cookie_manager = CookieManager() 19 | 20 | self.setup_ui() 21 | 22 | def setup_ui(self): 23 | # 创建标题标签 24 | title_label = tk.Label(self.root, text="抖音Cookies管理工具", font=("Arial", 16)) 25 | title_label.pack(pady=20) 26 | 27 | # 创建说明文本 28 | instruction_text = """ 29 | 使用说明: 30 | 1. 使用Chrome浏览器登录抖音网页版 31 | 2. 安装 'Cookie Editor' 扩展 32 | 3. 登录成功后,点击扩展图标 33 | 4. 点击 'Export' -> 'Export as JSON' 34 | 5. 复制导出的JSON内容 35 | 6. 粘贴到下方文本框中 36 | 7. 点击 '导入Cookies' 按钮 37 | 8. 验证成功后可点击 '复制Cookies' 获取格式化的Cookie字符串 38 | 9. 在下方输入抖音分享链接,点击解析获取视频ID 39 | """ 40 | instruction_label = tk.Label(self.root, text=instruction_text, justify=tk.LEFT, font=("Arial", 10)) 41 | instruction_label.pack(pady=10, padx=20) 42 | 43 | # 创建文本框框架 44 | text_frame = tk.Frame(self.root) 45 | text_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10) 46 | 47 | # 创建标签 48 | text_label = tk.Label(text_frame, text="请在下方粘贴 Cookie Editor 导出的 JSON 内容:", font=("Arial", 10)) 49 | text_label.pack(anchor=tk.W) 50 | 51 | # 创建文本框 52 | self.cookie_text = scrolledtext.ScrolledText(text_frame, height=15, width=60, font=("Courier", 10)) 53 | self.cookie_text.pack(fill=tk.BOTH, expand=True, pady=5) 54 | 55 | # 创建按钮框架 56 | button_frame = tk.Frame(self.root) 57 | button_frame.pack(pady=20) 58 | 59 | # 创建导入按钮 60 | self.import_button = tk.Button(button_frame, text="导入Cookies", command=self.import_cookies) 61 | self.import_button.pack(side=tk.LEFT, padx=10) 62 | 63 | # 创建验证按钮 64 | self.verify_button = tk.Button(button_frame, text="验证Cookies", command=self.verify_cookies) 65 | self.verify_button.pack(side=tk.LEFT, padx=10) 66 | 67 | # 创建复制按钮 68 | self.copy_button = tk.Button(button_frame, text="复制Cookies", command=self.copy_cookies) 69 | self.copy_button.pack(side=tk.LEFT, padx=10) 70 | 71 | # 创建清除按钮 72 | self.clear_button = tk.Button(button_frame, text="清除内容", command=self.clear_text) 73 | self.clear_button.pack(side=tk.LEFT, padx=10) 74 | 75 | # 创建分享链接框架 76 | share_frame = tk.Frame(self.root) 77 | share_frame.pack(fill=tk.X, padx=20, pady=10) 78 | 79 | # 创建分享链接标签 80 | share_label = tk.Label(share_frame, text="抖音分享链接:", font=("Arial", 10)) 81 | share_label.pack(side=tk.LEFT) 82 | 83 | # 创建分享链接输入框 84 | self.share_entry = tk.Entry(share_frame, width=40) 85 | self.share_entry.pack(side=tk.LEFT, padx=5) 86 | 87 | # 创建解析按钮 88 | self.parse_button = tk.Button(share_frame, text="解析链接", command=self.parse_share_link) 89 | self.parse_button.pack(side=tk.LEFT, padx=5) 90 | 91 | # 创建视频ID框架 92 | video_id_frame = tk.Frame(self.root) 93 | video_id_frame.pack(fill=tk.X, padx=20, pady=5) 94 | 95 | # 创建视频ID标签 96 | video_id_label = tk.Label(video_id_frame, text="视频ID:", font=("Arial", 10)) 97 | video_id_label.pack(side=tk.LEFT) 98 | 99 | # 创建视频ID显示框 100 | self.video_id_var = tk.StringVar() 101 | self.video_id_entry = tk.Entry(video_id_frame, textvariable=self.video_id_var, width=30, state='readonly') 102 | self.video_id_entry.pack(side=tk.LEFT, padx=5) 103 | 104 | # 创建复制视频ID按钮 105 | self.copy_id_button = tk.Button(video_id_frame, text="复制ID", command=self.copy_video_id) 106 | self.copy_id_button.pack(side=tk.LEFT, padx=5) 107 | 108 | # 创建状态标签 109 | self.status_label = tk.Label(self.root, text="等待操作...", font=("Arial", 10)) 110 | self.status_label.pack(pady=20) 111 | 112 | def parse_share_link(self): 113 | """解析抖音分享链接""" 114 | try: 115 | share_text = self.share_entry.get().strip() 116 | if not share_text: 117 | self.status_label.config(text="请输入分享链接") 118 | messagebox.showwarning("警告", "请输入分享链接") 119 | return 120 | 121 | # 使用正则表达式提取链接 122 | match = re.search(r'https://v\.douyin\.com/[a-zA-Z0-9]+/?', share_text) 123 | if not match: 124 | self.status_label.config(text="未找到有效的分享链接") 125 | messagebox.showwarning("警告", "未找到有效的分享链接") 126 | return 127 | 128 | share_url = match.group() 129 | 130 | # 获取重定向后的URL 131 | response = requests.get(share_url, allow_redirects=True) 132 | final_url = response.url 133 | 134 | # 从最终URL中提取视频ID 135 | video_id_match = re.search(r'/video/(\d+)', final_url) 136 | if not video_id_match: 137 | self.status_label.config(text="无法解析视频ID") 138 | messagebox.showerror("错误", "无法从链接中解析视频ID") 139 | return 140 | 141 | video_id = video_id_match.group(1) 142 | self.video_id_var.set(video_id) 143 | self.status_label.config(text="成功解析视频ID") 144 | 145 | except Exception as e: 146 | print(f"解析分享链接时出错: {str(e)}") 147 | self.status_label.config(text="解析分享链接时出错") 148 | messagebox.showerror("错误", f"解析分享链接时出错: {str(e)}") 149 | 150 | def copy_video_id(self): 151 | """复制视频ID到剪贴板""" 152 | video_id = self.video_id_var.get() 153 | if video_id: 154 | self.root.clipboard_clear() 155 | self.root.clipboard_append(video_id) 156 | self.status_label.config(text="视频ID已复制到剪贴板") 157 | messagebox.showinfo("成功", "视频ID已复制到剪贴板!") 158 | else: 159 | self.status_label.config(text="没有可复制的视频ID") 160 | messagebox.showwarning("警告", "没有可复制的视频ID") 161 | 162 | def clear_text(self): 163 | """清除文本框内容""" 164 | self.cookie_text.delete(1.0, tk.END) 165 | self.share_entry.delete(0, tk.END) 166 | self.video_id_var.set("") 167 | self.status_label.config(text="内容已清空") 168 | 169 | def copy_cookies(self): 170 | """复制已保存的有效Cookies""" 171 | try: 172 | # 加载保存的cookies 173 | cookies = self.cookie_manager.load_cookies() 174 | if not cookies: 175 | self.status_label.config(text="未找到保存的Cookies") 176 | messagebox.showwarning("警告", "未找到保存的Cookies") 177 | return 178 | 179 | # 验证cookies是否有效 180 | if not self.cookie_manager.verify_cookies(cookies): 181 | self.status_label.config(text="Cookies已失效,请重新导入") 182 | messagebox.warning("警告", "Cookies已失效,请重新导入") 183 | return 184 | 185 | # 将cookies转换为字符串格式 186 | cookie_str = '; '.join([f"{k}={v}" for k, v in cookies.items()]) 187 | 188 | # 复制到剪贴板 189 | self.root.clipboard_clear() 190 | self.root.clipboard_append(cookie_str) 191 | 192 | self.status_label.config(text="Cookies已复制到剪贴板") 193 | messagebox.showinfo("成功", "Cookies已复制到剪贴板!") 194 | 195 | except Exception as e: 196 | print(f"复制Cookies时出错: {str(e)}") 197 | self.status_label.config(text="复制Cookies时出错") 198 | messagebox.showerror("错误", f"复制Cookies时出错: {str(e)}") 199 | 200 | def import_cookies(self): 201 | """导入Cookies""" 202 | try: 203 | # 获取文本框内容 204 | cookie_json = self.cookie_text.get(1.0, tk.END).strip() 205 | if not cookie_json: 206 | self.status_label.config(text="请先粘贴Cookie内容") 207 | messagebox.showwarning("警告", "请先粘贴Cookie内容") 208 | return 209 | 210 | # 解析JSON 211 | try: 212 | cookies_list = json.loads(cookie_json) 213 | except json.JSONDecodeError: 214 | self.status_label.config(text="无效的JSON格式") 215 | messagebox.showerror("错误", "无效的JSON格式,请确保复制了完整的JSON内容") 216 | return 217 | 218 | # 转换为字典格式 219 | cookies = {} 220 | for cookie in cookies_list: 221 | if cookie.get('domain', '').endswith('douyin.com'): 222 | cookies[cookie['name']] = cookie['value'] 223 | 224 | if not cookies: 225 | self.status_label.config(text="未找到有效的抖音Cookies") 226 | messagebox.showwarning("警告", "未找到有效的抖音Cookies") 227 | return 228 | 229 | # 保存Cookies 230 | if self.cookie_manager.save_cookies(cookies): 231 | self.status_label.config(text="Cookies导入成功!") 232 | messagebox.showinfo("成功", "Cookies导入成功!") 233 | self.cookie_text.delete(1.0, tk.END) # 清空文本框 234 | else: 235 | self.status_label.config(text="Cookies保存失败") 236 | messagebox.showerror("错误", "Cookies保存失败") 237 | 238 | except Exception as e: 239 | print(f"导入Cookies时出错: {str(e)}") 240 | self.status_label.config(text="导入Cookies时出错") 241 | messagebox.showerror("错误", f"导入Cookies时出错: {str(e)}") 242 | 243 | def verify_cookies(self): 244 | """验证Cookies""" 245 | self.verify_button.config(state=tk.DISABLED) 246 | cookies = self.cookie_manager.load_cookies() 247 | 248 | if not cookies: 249 | self.status_label.config(text="未找到保存的Cookies") 250 | self.verify_button.config(state=tk.NORMAL) 251 | messagebox.showwarning("警告", "未找到保存的Cookies") 252 | return 253 | 254 | try: 255 | if self.cookie_manager.verify_cookies(cookies): 256 | self.status_label.config(text="Cookies有效") 257 | messagebox.showinfo("验证结果", "Cookies有效") 258 | else: 259 | self.status_label.config(text="Cookies已失效,请重新导入") 260 | messagebox.warning("验证结果", "Cookies已失效,请重新导入") 261 | except Exception as e: 262 | print(f"验证Cookies时出错: {str(e)}") 263 | self.status_label.config(text="验证Cookies时出错") 264 | messagebox.showerror("错误", f"验证Cookies时出错: {str(e)}") 265 | finally: 266 | self.verify_button.config(state=tk.NORMAL) 267 | 268 | def run(self): 269 | """运行GUI程序""" 270 | self.root.mainloop() 271 | 272 | if __name__ == "__main__": 273 | app = DouYinCookieManager() 274 | app.run() --------------------------------------------------------------------------------