字
字节笔记本
2026年2月22日
douyin-mcp-server:抖音无水印视频下载与文案提取 MCP 服务器
本文介绍 douyin-mcp-server,一个用于提取抖音无水印视频链接和文案的 MCP 服务器。该项目支持 WebUI 可视化界面、MCP Server 集成和命令行工具三种使用方式,帮助用户轻松下载抖音视频并自动提取语音文案。
项目简介
douyin-mcp-server 是一个开源的抖音视频处理工具,由 yzfly 开发维护。截至目前,该项目在 GitHub 上已获得 607 stars 和 126 forks,主要使用 Python 和 HTML 编写。
该项目提供以下核心功能:
- 解析抖音分享链接获取无水印视频链接
- 下载视频并提取音频
- 使用 AI 语音识别自动提取视频文案
- 支持大文件自动分段处理
核心特性
- 无水印视频:获取高质量无水印视频下载链接
- AI 语音识别:使用硅基流动 SenseVoice 自动提取文案
- 大文件支持:自动分段处理超过 1 小时或 50MB 的音频
- WebUI 界面:现代化浏览器界面,无需命令行操作
- MCP 集成:支持 Claude Desktop 等 AI 应用直接调用
技术栈
- Python 3.10+:核心开发语言
- FastMCP:MCP 服务器框架
- FFmpeg:音视频处理
- SenseVoice API:语音识别(硅基流动)
- HTML/JavaScript:WebUI 前端
安装指南
前置要求
- Python 3.10+
- uv(Python 包管理器)
- FFmpeg
安装步骤
bash
# 克隆项目
git clone https://github.com/yzfly/douyin-mcp-server.git
cd douyin-mcp-server
# 安装依赖
uv sync使用方式
方式一:WebUI(推荐)
最简单的使用方式,打开浏览器即可使用:
bash
# 启动服务
uv run python web/app.py打开浏览器访问 http://localhost:8080
配置 API Key:
- 方式一:浏览器内配置(推荐)- 点击顶部的「API 未配置」按钮输入 API Key
- 方式二:环境变量 -
export API_KEY="sk-xxxxxxxxxxxxxxxx"
方式二:MCP Server
在 Claude Desktop、Cherry Studio 等支持 MCP 的应用中使用:
json
{
"mcpServers": {
"douyin-mcp": {
"command": "uvx",
"args": ["douyin-mcp-server"],
"env": {
"API_KEY": "sk-xxxxxxxxxxxxxxxx"
}
}
}
}可用工具:
| 工具名 | 功能 | 需要 API |
|---|---|---|
parse_douyin_video_info | 解析视频信息 | ❌ |
get_douyin_download_link | 获取下载链接 | ❌ |
extract_douyin_text | 提取视频文案 | ✅ |
方式三:命令行工具
适合开发者和批量处理场景:
bash
# 查看帮助
uv run python douyin-video/scripts/douyin_downloader.py --help
# 获取视频信息(无需 API)
uv run python douyin-video/scripts/douyin_downloader.py -l "分享链接" -a info
# 下载无水印视频
uv run python douyin-video/scripts/douyin_downloader.py -l "分享链接" -a download -o ./videos
# 提取文案(需要 API_KEY)
export API_KEY="sk-xxx"
uv run python douyin-video/scripts/douyin_downloader.py -l "分享链接" -a extract -o ./output核心代码解析
以下是 server.py 的核心实现:
python
#!/usr/bin/env python3
"""
抖音无水印视频下载并提取文本的 MCP 服务器
"""
import os
import re
import json
import requests
import tempfile
import asyncio
from pathlib import Path
from typing import Optional
import dashscope
from mcp.server.fastmcp import FastMCP, Context
# 创建 MCP 服务器实例
mcp = FastMCP("Douyin MCP Server")
class DouyinProcessor:
"""抖音视频处理器"""
def __init__(self, api_key: str, model: Optional[str] = None):
self.api_key = api_key
self.model = model or "paraformer-v2"
self.temp_dir = Path(tempfile.mkdtemp())
dashscope.api_key = api_key
def parse_share_url(self, share_text: str) -> dict:
"""从分享文本中提取无水印视频链接"""
# 提取分享链接
urls = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', share_text)
if not urls:
raise ValueError("未找到有效的分享链接")
share_url = urls[0]
share_response = requests.get(share_url, headers=HEADERS)
video_id = share_response.url.split("?")[0].strip("/").split("/")[-1]
# 获取视频页面内容并解析
response = requests.get(share_url, headers=HEADERS)
pattern = re.compile(r"window\._ROUTER_DATA\s*=\s*(.*?)</script>", re.DOTALL)
find_res = pattern.search(response.text)
json_data = json.loads(find_res.group(1).strip())
data = json_data["loaderData"]["video_(id)/page"]["videoInfoRes"]["item_list"][0]
# 获取无水印视频链接
video_url = data["video"]["play_addr"]["url_list"][0].replace("playwm", "play")
return {
"url": video_url,
"title": data.get("desc", "").strip() or f"douyin_{video_id}",
"video_id": video_id
}
@mcp.tool()
def get_douyin_download_link(share_link: str) -> str:
"""获取抖音视频的无水印下载链接"""
try:
processor = DouyinProcessor("")
video_info = processor.parse_share_url(share_link)
return json.dumps({
"status": "success",
"video_id": video_info["video_id"],
"title": video_info["title"],
"download_url": video_info["url"]
}, ensure_ascii=False, indent=2)
except Exception as e:
return json.dumps({
"status": "error",
"error": f"获取下载链接失败: {str(e)}"
}, ensure_ascii=False, indent=2)
@mcp.tool()
async def extract_douyin_text(share_link: str, model: Optional[str] = None, ctx: Context = None) -> str:
"""从抖音分享链接提取视频中的文本内容"""
try:
api_key = os.getenv('API_KEY')
if not api_key:
raise ValueError("未设置环境变量 API_KEY")
processor = DouyinProcessor(api_key, model)
ctx.info("正在解析抖音分享链接...")
video_info = processor.parse_share_url(share_link)
ctx.info("正在从视频中提取文本...")
text_content = processor.extract_text_from_video_url(video_info['url'])
return text_content
except Exception as e:
raise Exception(f"提取抖音视频文本失败: {str(e)}")
def main():
"""启动MCP服务器"""
mcp.run()
if __name__ == "__main__":
main()大文件处理机制
当音频文件超过 API 限制时(1 小时或 50MB),系统会自动:
- 检测音频时长和文件大小
- 使用 FFmpeg 分割成 9 分钟的片段
- 逐段调用 API 转录
- 合并所有文本结果
注意事项
- 需要提供有效的硅基流动 API 密钥(通过环境变量或浏览器配置)
- 获取下载链接无需 API 密钥
- 本项目仅供学习和研究使用
- 使用者需遵守相关法律法规
项目链接
- GitHub 仓库:https://github.com/yzfly/douyin-mcp-server
- PyPI 包:https://pypi.org/project/douyin-mcp-server/
- 硅基流动(获取 API Key):https://cloud.siliconflow.cn/
分享: