抖音视频下载代码实现

本文将提供一个完整的 Python 脚本,用于下载抖音无水印视频和音频。该脚本通过调用第三方 API 绕过抖音的反爬机制,并自动处理短链接解析、签名生成和 CDN 防盗链。

1. 完整代码

#!/usr/bin/env python3
import os
import sys
import re
import time
import hashlib
import urllib.request
import urllib.parse
import requests

SALT = '6HTugjCXxR'

def resolve_url(short_url):
    """解析抖音短链接,获取真实视频 URL"""
    print(f"正在解析短链接: {short_url}...")
    req = urllib.request.Request(
        short_url, 
        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'
        }
    )
    try:
        with urllib.request.urlopen(req) as response:
            return response.geturl()
    except Exception as e:
        print(f"链接解析失败: {e}")
        return short_url

def extract_media_info(url):
    """调用 SnapAny API 获取视频元数据"""
    api_url = "https://api.snapany.com/v1/extract/post"
    timestamp = str(int(time.time() * 1000))
    site_lang = 'zh'
    
    # 生成签名 (G-Footer)
    sign_str = f"{url}{site_lang}{timestamp}{SALT}"
    g_footer = hashlib.md5(sign_str.encode('utf-8')).hexdigest()
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',
        "Accept": "*/*", 
        "Accept-Language": site_lang, 
        "G-Timestamp": timestamp, 
        "G-Footer": g_footer, 
        "Content-Type": "application/json", 
        "Origin": "https://snapany.com", 
        "Referer": "https://snapany.com/",
    }
    
    payload = {"link": url}
    print("正在从 SnapAny API 获取元数据...")
    
    response = requests.post(api_url, json=payload, headers=headers, timeout=20)
    response.raise_for_status()
    return response.json()

def download_file(url, save_path, desc="文件"):
    """下载文件,自动添加 Referer 头绕过 CDN 防盗链"""
    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',
        'Referer': 'https://www.douyin.com/',
    }
    print(f"正在下载 {desc}...")
    response = requests.get(url, headers=headers, stream=True, timeout=60)
    response.raise_for_status()
    
    with open(save_path, "wb") as f:
        for chunk in response.iter_content(chunk_size=8192):
            if chunk:
                f.write(chunk)
    print(f"{desc}已保存至: {save_path}")

def clean_filename(title):
    """清理文件名中的非法字符"""
    return re.sub(r'[\/:*?"<>|#\s]', '_', title)[:100]

def main():
    if len(sys.argv) < 2:
        print("使用方法: python3 download.py <抖音链接>")
        sys.exit(1)
        
    input_url = sys.argv[1]
    
    # 1. 解析短链接
    if "v.douyin.com" in input_url:
        # 如果用户粘贴了整个分享消息,从中提取 URL
        urls = re.findall(r'https?://v\.douyin\.com/[a-zA-Z0-9_]+/?', input_url)
        if urls:
            url = resolve_url(urls[0])
        else:
            url = resolve_url(input_url)
    else:
        url = input_url
        
    print(f"视频 URL: {url}")
    
    # 2. 获取媒体元数据
    try:
        data = extract_media_info(url)
    except Exception as e:
        print(f"解析媒体信息失败: {e}")
        sys.exit(1)
        
    title = data.get("text", "douyin_video")
    safe_title = clean_filename(title)
    
    medias = data.get("medias", [])
    
    video_url = None
    audio_url = None
    
    for m in medias:
        if m.get("media_type") == "video":
            video_url = m.get("resource_url")
        elif m.get("media_type") == "audio":
            audio_url = m.get("resource_url")
            
    if not video_url:
        print("响应中未找到视频媒体")
        sys.exit(1)
        
    # 3. 下载视频
    video_path = f"{safe_title}.mp4"
    try:
        download_file(video_url, video_path, "视频")
    except Exception as e:
        print(f"视频下载失败: {e}")
        
    # 4. 下载音频(可选)
    if audio_url:
        audio_path = f"{safe_title}.mp3"
        try:
            download_file(audio_url, audio_path, "音频")
        except Exception as e:
            print(f"音频下载失败: {e}")
            
    print("\n下载过程完成!")

if __name__ == "__main__":
    main()

2. 使用方法

将上述代码保存为 download.py,然后运行:

python3 download.py "https://v.douyin.com/zNHSZiQW_7c/"

3. 依赖安装

确保已安装 requests 库:

pip install requests

4. 脚本功能说明

  • 短链接解析:自动处理抖音短链接(v.douyin.com)重定向
  • API 签名:生成 SnapAny API 所需的 G-Timestamp 和 G-Footer 签名
  • 元数据提取:获取无水印视频和音频的下载链接
  • CDN 绕过:自动添加 Referer 头避免 403 Forbidden 错误
  • 文件保存:自动清理文件名并保存为 .mp4(视频)和 .mp3(音频)

5. 注意事项

  • 需要稳定的网络连接访问 SnapAny API
  • 抖音的 CDN 链接可能会变化,如果失效需要更新 Referer 头
  • 请遵守抖音的使用条款,仅用于个人学习和研究目的

更多推荐