把抖音、小红书、Bilibili 和 YouTube 的公开链接,统一转换成文字、元数据、视频、封面、图片和公开评论。
同时提供:
- Python SDK
socialkitCLI- MCP Server
当前版本:0.3.0。
请帮我安装 Social Media Toolkit:
https://github.com/JNHFlow21/social-post-extractor-mcp
要求:
1. 把仓库 clone 到独立的公共工具目录,不要放进我的知识库、笔记库或业务项目。
2. 确认 Python >= 3.10、uv、ffmpeg、Node.js 可用,然后执行 uv sync。
3. 安装 GetNote CLI:npm install -g @getnote/cli,并让我通过 getnote auth login 自己完成授权。
4. 检查 VOLCENGINE_ASR_API_KEY 是否已通过系统或 Agent 的 secret manager 安全配置;不要让我把 Key 发到聊天里,也不要把 Key 写进仓库、.env、README、MCP JSON 或日志。
5. 把 uv run social-media-toolkit-mcp 注册成 stdio MCP Server。
6. 执行 uv run socialkit doctor 和 uv run python -m unittest discover -s tests,最后只告诉我:安装路径、MCP 是否注册成功、GetNote 是否已登录、火山 ASR 是否已配置、还有哪些缺失项。不要输出任何 secret 值。
AI Agent 也可以按下面的命令手动安装:
git clone https://github.com/JNHFlow21/social-post-extractor-mcp.git
cd social-post-extractor-mcp
uv sync
uv run socialkit doctornpm install -g @getnote/cli
getnote auth login- 官方说明:@getnote/cli
- 源码:iswalle/getnote-cli
- 费用:GetNote CLI 本身开源,但其 OpenAPI / Skill 当前需要得到大脑会员。
- 凭据:由 GetNote 自己管理,不要复制到本项目。
GetNote 没有安装、没有登录或处理失败时,工具会继续检查平台原生字幕;视频仍无字幕时才进入火山云 ASR。
调用 text、启用文字的 capture,或者要求进行完整链路测试,即表示执行当前已配置的文字链路:GetNote → 平台原生字幕 → 火山云 ASR。工具不会再弹出二次授权确认。
- GetNote 可能会把链接保存到用户自己的 GetNote 账号。
- 火山 ASR 可能消耗资源包或产生按量费用。
- 执行结果必须说明实际命中了哪条路径以及是否调用了火山 ASR。
- 如果只想读取元数据且不触发 GetNote / ASR,请使用
inspect。
本项目只认一个 secret 名称:
VOLCENGINE_ASR_API_KEY
- 接口文档:大模型录音文件识别极速版 API
- 产品页面:豆包语音识别
- 费用:云服务可能产生按量费用或消耗资源包;是否有试用额度以火山引擎控制台当前显示为准。
- 本项目使用:
volc.bigasr.auc_turbo,与cloud-transcriptSkill 的火山云转写路径保持一致。
请通过操作系统、MCP 客户端或 Agent 的 secret manager 注入,不要创建项目 .env。
如果本机使用 Agent Switch,可通过隐藏输入写入,不把值放进命令参数:
read -s VOLCENGINE_ASR_API_KEY
printf %s "$VOLCENGINE_ASR_API_KEY" | agent-switch secret set --stdin VOLCENGINE_ASR_API_KEY
unset VOLCENGINE_ASR_API_KEY云 ASR 失败时会直接返回具体错误。不会切到本地 Whisper,不会切到其他云厂商,也不会让用户无提示地继续等待。
| 功能 | 作用 | 需要什么 | 是否可能付费 |
|---|---|---|---|
| 统一元数据 | 标题、作者、发布时间、互动指标、媒体地址 | Python 依赖;YouTube 需要 yt-dlp |
否 |
| 获取文字 | GetNote → 原生字幕 → 火山云 ASR | GetNote;无字幕视频需要 VOLCENGINE_ASR_API_KEY 和 ffmpeg |
GetNote 会员、火山 ASR 可能付费 |
| 下载视频 | 下载完整视频并生成 SHA-256 清单 | 抖音/小红书走公开 CDN;B站/YouTube 需要 yt-dlp 和 ffmpeg |
工具本身免费 |
| 下载封面/图片 | 保存封面和图文图片 | 公开链接 | 工具本身免费 |
| 获取评论 | 获取抖音公开接口返回的一级评论样本 | 不需要登录或 Cookie | 否 |
| 完整数据包 | 合并元数据、文字、评论和按需下载 | 取决于启用的能力 | 取决于 GetNote/火山 ASR |
| 环境检查 | 检查依赖、登录状态和 secret 名称 | 无 | 否 |
| 平台 | 元数据 | 文字 | 视频 | 封面/图片 | 公开评论 |
|---|---|---|---|---|---|
| 抖音 | ✅ | GetNote → 火山 ASR | ✅ | ✅,含公开图集 | ✅ 最多 10 条一级评论样本 |
| 小红书 | ✅ | GetNote → 图文正文 / 火山 ASR | ✅ | ✅ | — |
| Bilibili | ✅ | GetNote → 原生字幕 → 火山 ASR | ✅ | ✅ | — |
| YouTube | ✅ | GetNote → 人工字幕 → 自动字幕 → 火山 ASR | ✅ | ✅ | — |
评论的 likes / recent 排序,只针对公开接口实际返回的样本,不代表平台全量评论的全局排名。
flowchart LR
U["公开链接"] --> G["GetNote 原始内容"]
G -->|"没有可用文字"| N["平台原生字幕"]
N -->|"视频仍无字幕"| V["火山引擎云 ASR"]
V -->|"失败"| E["直接返回失败原因"]
没有以下路径:
- 本地 Whisper / 本地 ASR
- 其他云 ASR provider
- OCR / Vision 模型兜底
- LLM 清洗或改写
- 浏览器、CDP、Playwright、登录态抓取
- 自动生成
script.md/info.json
文字结果不会下载持久媒体。火山转写需要的音频只存在于临时目录:下载远程媒体、用 ffmpeg 转成单声道 16kHz MP3、调用云端、随后删除临时目录。
uv run socialkit doctor输出只包含:
- 依赖是否安装
- GetNote 是否登录
VOLCENGINE_ASR_API_KEY是否配置- 官方配置链接
- 缺失项
不会输出 secret 值。
uv run socialkit inspect "SHARE_URL"uv run socialkit text "SHARE_URL"uv run socialkit comments "DOUYIN_URL" --sort likes --limit 10
uv run socialkit comments "DOUYIN_URL" --sort recent --limit 10uv run socialkit download "SHARE_URL" \
--include video,cover,images \
--output "/absolute/path/to/output"uv run socialkit capture "SHARE_URL" \
--comments \
--output "/absolute/path/to/output"不传 --output 就不会持久下载媒体。
from social_media_toolkit import SocialMediaToolkit
toolkit = SocialMediaToolkit()
metadata = toolkit.inspect("SHARE_URL")
text = toolkit.get_text("SHARE_URL")
comments = toolkit.get_comments("DOUYIN_URL", sort_by="likes", limit=10)
bundle = toolkit.capture(
"SHARE_URL",
include_text=True,
include_comments=False,
)没有 asr_provider、asr_model 或本地 fallback 参数,避免同一链接产生多套行为。
启动:
uv run social-media-toolkit-mcpstdio MCP 示例:
{
"mcpServers": {
"social-media-toolkit": {
"command": "/ABSOLUTE/PATH/social-post-extractor-mcp/.venv/bin/python",
"args": ["-m", "social_post_extractor_mcp"]
}
}
}不要把 secret 直接写进这段 JSON。通过客户端 secret store 或安全的进程环境注入。
只保留六个 MCP Tool:
| MCP Tool | 作用 |
|---|---|
social_inspect |
返回统一 PostBundle,不下载、不转写 |
social_get_text |
执行唯一文字路径 |
social_get_comments |
获取当前支持的公开评论样本 |
social_download |
显式下载媒体并返回校验清单 |
social_capture_bundle |
按需合并数据和下载 |
social_doctor |
检查依赖和配置,仅显示 secret 名称 |
MCP、CLI 和 Python SDK 都调用同一个 SocialMediaToolkit,不存在第二套兼容调度器。
{
"schema_version": "1.0",
"source": {},
"post": {},
"author": {},
"media": {
"videos": [],
"covers": [],
"images": [],
"audio": []
},
"metrics": {},
"content": {},
"comments": {},
"provenance": {}
}uv sync
uv run python -m unittest discover -s tests
uv run python -m compileall social_media_toolkit social_post_extractor_mcp
uv build
git diff --check测试必须使用合成 fixture,不得提交 Cookie、Token、真实用户数据或私人内容。
- 只处理使用者有权访问的公开 URL,不绕过访问控制。
- 平台可能更改公开页面或接口;失败时返回来源和原因,不伪造成功。
- 下载、保存和再发布内容时,使用者必须遵守平台条款、版权和当地法律。
- 自动上传与自动发布属于另一个有账号副作用的产品,不在本工具包内。
架构和能力边界: