This commit is contained in:
HuangHai
2026-01-20 14:05:19 +08:00
parent 646f3acd6d
commit d89388ab51
89 changed files with 12526 additions and 0 deletions

View File

@@ -0,0 +1,232 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
抖音Cookie获取助手(手动版)
无需安装Playwright,通过浏览器开发者工具手动获取
"""
import json
import yaml
import os
import sys
from datetime import datetime
from typing import Dict
def print_instructions():
"""打印获取Cookie的详细说明"""
print("\n" + "="*60)
print("抖音Cookie获取教程")
print("="*60)
print("\n📝 获取步骤:\n")
print("1. 打开浏览器(推荐Chrome/Edge)")
print("2. 访问抖音网页版:https://www.douyin.com")
print("3. 登录您的账号(扫码/手机号/第三方登录)")
print("4. 登录成功后,按 F12 打开开发者工具")
print("5. 切换到 Network(网络)标签")
print("6. 刷新页面(F5)")
print("7. 在请求列表中找到任意一个 douyin.com 的请求")
print("8. 点击该请求,在右侧找到 Request Headers(请求标头)")
print("9. 找到 Cookie 字段,复制整个Cookie值")
print("\n" + "="*60)
print("\n⚠️ 重要提示:")
print("• Cookie包含您的登录信息,请勿分享给他人")
print("• Cookie有效期通常为7-30天,过期需重新获取")
print("• 建议定期更新Cookie以保证下载成功率")
print("\n" + "="*60)
def parse_cookie_string(cookie_str: str) -> Dict[str, str]:
"""解析Cookie字符串为字典"""
cookies = {}
# 清理输入
cookie_str = cookie_str.strip()
if cookie_str.startswith('"') and cookie_str.endswith('"'):
cookie_str = cookie_str[1:-1]
# 分割Cookie
for item in cookie_str.split(';'):
item = item.strip()
if '=' in item:
key, value = item.split('=', 1)
cookies[key.strip()] = value.strip()
return cookies
def validate_cookies(cookies: Dict[str, str]) -> bool:
"""验证Cookie是否包含必要字段"""
# 必要的Cookie字段
required_fields = ['ttwid'] # 最少需要ttwid
important_fields = ['sessionid', 'sessionid_ss', 'passport_csrf_token', 'msToken']
# 检查必要字段
missing_required = []
for field in required_fields:
if field not in cookies:
missing_required.append(field)
if missing_required:
print(f"\n❌ 缺少必要的Cookie字段: {', '.join(missing_required)}")
return False
# 检查重要字段
missing_important = []
for field in important_fields:
if field not in cookies:
missing_important.append(field)
if missing_important:
print(f"\n⚠️ 缺少部分重要Cookie字段: {', '.join(missing_important)}")
print("可能会影响某些功能,但可以尝试使用")
return True
def save_cookies(cookies: Dict[str, str], config_path: str = "config_simple.yml"):
"""保存Cookie到配置文件"""
# 读取现有配置
if os.path.exists(config_path):
with open(config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f) or {}
else:
config = {}
# 更新Cookie配置
config['cookies'] = cookies
# 保存配置
with open(config_path, 'w', encoding='utf-8') as f:
yaml.dump(config, f, allow_unicode=True, default_flow_style=False, sort_keys=False)
print(f"\n✅ Cookie已保存到 {config_path}")
# 同时保存完整Cookie字符串
cookie_string = '; '.join([f'{k}={v}' for k, v in cookies.items()])
with open('cookies.txt', 'w', encoding='utf-8') as f:
f.write(cookie_string)
print(f"✅ 完整Cookie字符串已保存到 cookies.txt")
# 保存带时间戳的备份
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_file = f'cookies_backup_{timestamp}.json'
with open(backup_file, 'w', encoding='utf-8') as f:
json.dump({
'cookies': cookies,
'cookie_string': cookie_string,
'timestamp': timestamp,
'note': '抖音Cookie备份'
}, f, ensure_ascii=False, indent=2)
print(f"✅ Cookie备份已保存到 {backup_file}")
def load_existing_cookies(config_path: str = "config_simple.yml") -> Dict[str, str]:
"""加载现有的Cookie"""
if os.path.exists(config_path):
with open(config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f) or {}
return config.get('cookies', {})
return {}
def main():
"""主函数"""
print("\n🍪 抖音Cookie配置助手")
print("-" * 40)
# 显示选项
print("\n请选择操作:")
print("1. 获取新的Cookie")
print("2. 查看当前Cookie")
print("3. 验证Cookie有效性")
print("4. 显示获取教程")
choice = input("\n请输入选项 (1-4): ").strip()
if choice == '1':
# 获取新Cookie
print_instructions()
print("\n请粘贴您复制的Cookie内容:")
print("(提示:粘贴后按Enter确认)")
print("-" * 40)
# 支持多行输入
lines = []
while True:
line = input()
if line:
lines.append(line)
else:
break
cookie_str = ' '.join(lines)
if not cookie_str:
print("\n❌ 未输入Cookie")
return
# 解析Cookie
cookies = parse_cookie_string(cookie_str)
if not cookies:
print("\n❌ Cookie解析失败,请检查格式")
return
print(f"\n✅ 成功解析 {len(cookies)} 个Cookie字段")
# 显示重要Cookie
print("\n📋 解析到的关键Cookie:")
important_fields = ['sessionid', 'sessionid_ss', 'ttwid', 'passport_csrf_token', 'msToken']
for field in important_fields:
if field in cookies:
value = cookies[field]
display_value = f"{value[:20]}..." if len(value) > 20 else value
print(f" • {field}: {display_value}")
# 验证Cookie
if validate_cookies(cookies):
# 询问是否保存
save_choice = input("\n是否保存Cookie到配置文件?(y/n): ").strip().lower()
if save_choice == 'y':
save_cookies(cookies)
print("\n🎉 配置完成!您现在可以运行下载器了:")
print("python3 downloader.py -c config_simple.yml")
else:
print("\n已取消保存")
elif choice == '2':
# 查看当前Cookie
cookies = load_existing_cookies()
if cookies:
print("\n📋 当前配置的Cookie:")
for key, value in cookies.items():
display_value = f"{value[:30]}..." if len(value) > 30 else value
print(f" • {key}: {display_value}")
else:
print("\n❌ 未找到配置的Cookie")
elif choice == '3':
# 验证Cookie
cookies = load_existing_cookies()
if cookies:
print("\n🔍 验证Cookie...")
if validate_cookies(cookies):
print("✅ Cookie格式正确")
print("\n注意:这只是格式验证,实际是否有效需要测试下载功能")
else:
print("\n❌ 未找到配置的Cookie")
elif choice == '4':
# 显示教程
print_instructions()
else:
print("\n❌ 无效的选项")
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print("\n\n👋 已退出")
except Exception as e:
print(f"\n❌ 发生错误: {e}")
import traceback
traceback.print_exc()