下载抖音视频的skill
·
抖音视频下载代码实现
本文将提供一个完整的 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 头
- 请遵守抖音的使用条款,仅用于个人学习和研究目的
更多推荐
所有评论(0)