'commit'
This commit is contained in:
232
DouYin/get_cookies_manual.py
Normal file
232
DouYin/get_cookies_manual.py
Normal 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()
|
||||
Reference in New Issue
Block a user