Add Douyin video downloader with auto-cookie feature

This commit is contained in:
2026-03-02 21:42:52 +08:00
commit 0f3dd8f287
50 changed files with 6471 additions and 0 deletions

156
download_with_cookie.py Normal file
View File

@@ -0,0 +1,156 @@
import requests
import re
import os
import json
import time
from urllib.parse import unquote
COOKIE_FILE = r"C:\Users\Administrator\Desktop\TikTokDownload-main\douyin_cookie.txt"
def get_or_load_cookie():
"""Get cookie from file or prompt user"""
if os.path.exists(COOKIE_FILE):
with open(COOKIE_FILE, 'r', encoding='utf-8') as f:
cookie = f.read().strip()
if cookie:
print(f"Loaded cookie from {COOKIE_FILE}")
return cookie
print("\n" + "="*60)
print("需要Cookie才能下载抖音视频")
print("="*60)
print("\n获取Cookie步骤:")
print("1. 打开Chrome/Edge浏览器访问 www.douyin.com 并登录")
print("2. 按F12打开开发者工具")
print("3. 点击'网络'(Network)标签")
print("4. 刷新页面")
print("5. 点击列表中的任意一个请求")
print("6. 在右侧'请求标头'(Request Headers)中找到Cookie")
print("7. 复制整个Cookie值很长的一串")
print("\n" + "="*60)
cookie = input("\n请粘贴Cookie (直接回车跳过): ").strip()
if cookie:
# Save cookie for future use
with open(COOKIE_FILE, 'w', encoding='utf-8') as f:
f.write(cookie)
print(f"Cookie已保存到 {COOKIE_FILE}")
return cookie
return None
def download_with_cookie(share_url, cookie, save_dir=r"C:\Users\Administrator\Desktop\TestDownload"):
"""Download using provided cookie"""
os.makedirs(save_dir, exist_ok=True)
session = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Cookie': cookie,
'Referer': 'https://www.douyin.com/',
'Accept': 'application/json, text/plain, */*',
}
session.headers.update(headers)
# Get video ID
print(f"\n获取视频ID...")
resp = session.get(share_url, allow_redirects=True)
final_url = resp.url
print(f"URL: {final_url}")
match = re.search(r'/video/(\d+)', final_url)
if not match:
match = re.search(r'video[=/](\d{19})', final_url)
if not match:
print("无法提取视频ID")
return False
video_id = match.group(1)
print(f"视频ID: {video_id}")
# Try using f2 with the cookie
print(f"\n使用f2下载...")
import subprocess
cmd = [
r"C:\Program Files\Python311\python.exe",
"-m", "f2", "dy",
"-M", "one",
"-u", share_url,
"-p", save_dir,
"-k", cookie,
]
result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='replace')
print(result.stdout)
if result.returncode == 0:
print("\n✓ 下载完成!")
return True
else:
print(f"\n错误: {result.stderr}")
# If f2 fails, try direct method
print("\n尝试直接下载...")
# Get video detail API
api_url = f"https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id={video_id}&aid=6383&cookie_enabled=true"
resp = session.get(api_url)
print(f"API状态: {resp.status_code}")
if resp.status_code == 200 and resp.text:
try:
data = resp.json()
if 'aweme_detail' in data:
aweme = data['aweme_detail']
# Get video URL
video_info = aweme.get('video', {})
play_addr = video_info.get('play_addr', {})
url_list = play_addr.get('url_list', [])
if url_list:
video_url = url_list[0]
desc = aweme.get('desc', 'video')
desc = re.sub(r'[\\/:*?"<>|]', '_', desc)[:50]
print(f"\n下载视频...")
video_resp = session.get(video_url)
if video_resp.status_code == 200 and len(video_resp.content) > 50000:
filename = f"{desc}_{video_id}.mp4"
filepath = os.path.join(save_dir, filename)
with open(filepath, 'wb') as f:
f.write(video_resp.content)
print(f"\n✓ 下载成功!")
print(f" 文件: {filepath}")
print(f" 大小: {len(video_resp.content) / 1024 / 1024:.2f} MB")
return True
except Exception as e:
print(f"解析错误: {e}")
return False
def download_douyin_video(share_url, save_dir=r"C:\Users\Administrator\Desktop\TestDownload"):
"""Main download function"""
cookie = get_or_load_cookie()
if cookie:
return download_with_cookie(share_url, cookie, save_dir)
else:
print("\n未提供Cookie尝试无Cookie下载...")
print("(可能无法成功)\n")
# Try without cookie as last resort
return download_with_cookie(share_url, "", save_dir)
if __name__ == "__main__":
url = "https://v.douyin.com/R5doyi5_cTk/"
download_douyin_video(url)