无需浏览器、无需登录、无需 cookies,一条命令下载抖音无水印视频到本地。基于 iesdouyin 移动端 SSR 解析,纯 Python 实现。
背景
在服务器/终端环境下下载抖音视频,通常会遇到几个痛点:
- yt-dlp 需要 cookies,服务器上没有浏览器无法导出
- 第三方 GUI 工具 依赖 Chrome/Playwright,纯终端跑不了
- 付费解析 API 不稳定,随时可能挂
本文介绍一种纯 curl/Python 方案,零依赖,任何能联网的 Linux 服务器都能跑。
原理
抖音有一个移动端分享页面 iesdouyin.com,访问时会做 SSR(服务端渲染),视频信息直接嵌入在 HTML 的 window._ROUTER_DATA JSON 中,包括无水印视频直链。
核心流程:
- 解析短链接 → 提取视频 ID
- 请求
iesdouyin.com/share/video/{id}(模拟 iPhone UA) - 从 HTML 提取
_ROUTER_DATA→ 解析videoInfoRes.item_list[0].video - 将
playwm(有水印)替换为play(无水印) - 下载 MP4
一键脚本
#!/usr/bin/env python3
"""抖音无水印视频下载 - 零依赖纯终端方案"""
import json, os, re, sys, urllib.request
from urllib.parse import unquote
MOBILE_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15"
def resolve_url(input_str):
input_str = input_str.strip()
if re.match(r"^\d{15,25}$", input_str):
return input_str
m = re.search(r"/video/(\d{15,25})", input_str)
if m:
return m.group(1)
# 短链跟随重定向
try:
req = urllib.request.Request(input_str)
req.add_header("User-Agent", MOBILE_UA)
resp = urllib.request.urlopen(req, timeout=10)
return resolve_url(resp.url)
except:
raise ValueError(f"无法提取视频ID: {input_str}")
def download(vid, out_dir="~/Downloads/douyin"):
url = f"https://www.iesdouyin.com/share/video/{vid}"
req = urllib.request.Request(url)
req.add_header("User-Agent", MOBILE_UA)
html = urllib.request.urlopen(req, timeout=15).read().decode()
m = re.search(r"window\._ROUTER_DATA\s*=\s*(\{.*?\});?\s*</script>", html, re.DOTALL)
if not m:
raise ValueError("未找到视频数据,可能已删除或需要登录")
data = json.loads(m.group(1))
items = data["loaderData"]["video_(id)/page"]["videoInfoRes"]["item_list"]
if not items:
raise ValueError("视频不可用")
item = items[0]
print(f"标题: {item['desc']}")
print(f"作者: {item['author']['nickname']}")
# 提取视频URL(去水印)
video = item["video"]
vurl = video["play_addr"]["url_list"][0]
vurl = vurl.replace("playwm", "play") # 去水印
# 下载
out = os.path.expanduser(f"{out_dir}/{vid}.mp4")
os.makedirs(os.path.dirname(out), exist_ok=True)
dl_req = urllib.request.Request(vurl)
dl_req.add_header("User-Agent", MOBILE_UA)
dl_req.add_header("Referer", "https://www.douyin.com/")
urllib.request.urlretrieve(vurl, out)
size = os.path.getsize(out)
print(f"Done: {out} ({size/1024:.0f} KB)")
if __name__ == "__main__":
vid = resolve_url(sys.argv[1])
download(vid)
使用方法
# 保存为 douyin_dl.py 后直接用
python3 douyin_dl.py https://v.douyin.com/xxxxx/
python3 douyin_dl.py 7490784822923742490
# 输出示例:
# 标题: 在喧嚣都市渴望一方宁静?这现代极简别墅客厅...
# 作者: 设计师方恒
# Done: /root/Downloads/douyin/7490784822923742490.mp4 (385 KB)
AI Agent 集成
如果你使用 Hermes Agent 等终端 AI 助手,可以直接对 Agent 说:
帮我下载这个抖音视频:https://v.douyin.com/xxxxx/
Agent 会自动执行解析和下载,下载完成后还能直接通过 Telegram 发送视频给你。
限制
- 部分私密视频或审核中的内容无法获取
- 视频直链有时效性(通常几小时),建议下载后及时保存
- 抖音随时可能调整 SSR 页面结构,脚本可能需要跟进更新
技术细节
| 项目 | 说明 |
|---|---|
| 依赖 | Python 3 标准库(零外部依赖) |
| 适用环境 | 任何能联网的 Linux/macOS 终端 |
| 视频质量 | 720p(SSR 默认返回) |
| 有无水印 | 无水印(playwm → play) |
| 是否需要登录 | 不需要 |
| 是否需要 cookies | 不需要 |
暂无评论
