开发者 · API / MCP

抖音、小红书链接 → AI 能读的文本

一个 POST 或一个 MCP 工具:逐字稿、画面里的字、每张图的描述和 OCR、要点,可选爆款拆解和翻译。 用的是我们的服务器去读,不需要你的抖音、小红书账号,也不需要 cookie,不会连累你的号。

REST

三步跑通

  1. 在 https://linkdigest.dev/app/keys 创建 API Key(用邮箱登录即可;中国大陆网络打不开 Google 登录),形如 ld_live_…。
  2. POST 一条链接——整段分享文案也行,我们会从里面取出链接。
  3. 视频较长时返回 202 和 jobId,用 ?wait=20 取结果,最多等 20 秒,没完成就再取一次。
curl -X POST https://linkdigest.dev/api/v1/digest \
  -H "Authorization: Bearer ld_live_..." \
  -H "Content-Type: application/json" \
  -d '{"url": "https://v.douyin.com/xxxx/", "format": "json", "breakdown": true}'

# 202 {"pending":true,"jobId":"abc…"}  →
curl "https://linkdigest.dev/api/v1/digest/abc…?wait=20" -H "Authorization: Bearer ld_live_..."

Python(requests)

import requests

API = "https://linkdigest.dev/api/v1/digest"
H = {"Authorization": "Bearer ld_live_..."}
link = "https://v.douyin.com/xxxx/"  # 抖音 / 小红书分享链接;整段分享文案也行

r = requests.post(API, headers=H, json={"url": link, "format": "json", "breakdown": True})
while r.status_code == 202:
    r = requests.get(f"{API}/{r.json()['jobId']}", headers=H, params={"format": "json", "wait": 20})
r.raise_for_status()
d = r.json()
print(d["title"], d["credits"], d["breakdown"]["hook"])

Node.js 18+(自带 fetch,存成 digest.mjs 后 node digest.mjs)

const API = "https://linkdigest.dev/api/v1/digest";
const headers = { Authorization: "Bearer ld_live_...", "Content-Type": "application/json" };
const link = "https://v.douyin.com/xxxx/"; // 抖音 / 小红书分享链接;整段分享文案也行

let r = await fetch(API, {
  method: "POST",
  headers,
  body: JSON.stringify({ url: link, format: "json", breakdown: true }),
});
while (r.status === 202) {
  const { jobId } = await r.json();
  r = await fetch(`${API}/${jobId}?format=json&wait=20`, { headers });
}
if (!r.ok) throw new Error(`${r.status} ${await r.text()}`);
const d = await r.json();
console.log(d.title, d.credits, d.breakdown?.hook);

返回字段

title / author / posted_at / caption标题、作者、发布时间、正文
transcript逐字稿,[{ t, text }]。有平台字幕用字幕;没有时来自 Qwen3-ASR,按段给,t 是这一段开始的秒数(每段最长约 170 秒)。YouTube 例外:transcript_source 为 gemini_video 时,逐字稿由 Gemini 看视频写出(时间 t 也是它给的),不是平台字幕,也不是 Qwen3-ASR。
transcript_source逐字稿从哪来:native_captions(平台字幕)、asr(Qwen3-ASR)、gemini_video(YouTube,Gemini 看视频写的)、none(没有逐字稿,比如图文笔记)
on_screen视频画面里的字,带大致时间(≈ 关键帧,误差几秒)
ocr_text / images[]图文笔记每张图的描述和图上文字
image_count / images_read帖子共有几张图、取了几张(取了几张就按几张计费)。60 张以内全部取;超过时取前 60 张;带 partial_ok 而积分不够时,取积分够的前几张(第 1 个积分 6 张,之后每个积分再 6 张),这时有 partial(公众号文章不带 partial_ok 也这样)。degraded 里写明没取的。取了不等于读出来了:下载失败或识图失败的图也算在 images_read 里,实际读出来几张看 coverage.images_read。2026-10-05 之前缓存的链接没有这两个字段
key_points要点,原文语言
key_point_support每条要点背后的一句原话,[{ point_index, kind, t, image_index, quote, verified }]:kind 是出处(transcript 逐字稿、on_screen 画面文字、image 图片、caption 正文、chapter 章节),t 是视频里的秒数,point_index、image_index 从 0 数。引用由引擎逐字核对,对不上的 verified 为 false,照样保留
coverage覆盖回执,由代码算出、不由模型写:视频转写了几秒(seconds_transcribed / duration_seconds)、抽帧最大间隔(largest_frame_gap_seconds),图文读了几张(images_read / images_total),not_captured 用一句话写明没读到的,比如「minutes 12:00-43:58 not read (budget)」「3 of 21 images skipped」「comments not read」。2026-10-05 之前缓存的链接没有 coverage 和 key_point_support
stats点赞、评论、收藏、分享(读取当天的平台数据,as_of 标日期)
tags话题标签
chapters / chapter_source章节,[{ t, title, summary }]:作者标的,或抖音自动生成的(每章带一句摘要),chapter_source 写 author 或 platform;不是我们推断的。只读了一部分时,只给读到的章节
category平台自己的分类,从大到小,例如 财经 › 投资理财 › 股票
depth / partial.transcript_credits这条视频怎么读的:full(完整读取,密集抽帧)或 transcript(逐字稿优先:完整逐字稿 + 大约每分钟一帧,coverage.not_captured 会写明抽帧稀疏)。完整读取只读到一部分时,partial.transcript_credits 是用逐字稿优先读完整条视频要多少积分;视频也超过逐字稿优先的时长上限时为 null。YouTube 例外:由 Gemini 看完整条视频,总是完整读取,按完整读取计费(每开始的 1 分钟 1 积分),传 depth: "transcript" 也一样。2026-10-05 之前缓存的链接没有 depth,都是完整读取
music背景音乐(歌名 — 歌手);作者自己的原声不算,为空
links帖子指向的链接,[{ url, found_in, label, kind }]:正文或 YouTube 简介里的网址、公众号文章的「阅读原文」、图片和视频帧里的二维码(只解码这次已经下载的图和帧)、画面文字里写全的网址、章节。只提取,不打开:要读其中某个链接,是另一次读取,另算积分,由你决定。found_in 是出处(caption / description / wechat_read_more / qr_code / on_screen / chapter);kind 是 web(网页)、payment(微信支付、支付宝等收款码)、group_invite(微信群、QQ 群、Telegram 群等)、app_deeplink(打开 App)或 other(名片、公众号)。去重,最多 20 个,coverage.links_found 是总数。2026-10-05 之前缓存的链接没有这个字段
breakdown爆款拆解(breakdown=true 时)
translation译文(translate_to 时),原文保留。逐字稿超过 24,000 字符时只译开头一段,translation.note 和 coverage.not_captured 会写明译到哪里(2026-10-06 起)
raw_markdown整条内容的 Markdown,含拆解和译文
credits / cached本次扣了几个积分;读过的链接 cached=true、0 积分

批量:POST /api/v1/digest/batch,一次最多 50 条,可带 breakdown 和签名的 webhook。 状态码:402 = 额度不够(返回体里有不用登录的付款链接 buy_url);422 = 链接读不了(删帖、私密、需要登录)。 完整说明见 英文文档,机器可读的规格在 /openapi.json。

MCP

Claude Code、Cursor、Trae、Cherry Studio、通义灵码

claude mcp add --transport http linkdigest \
  https://linkdigest.dev/mcp \
  --header "Authorization: Bearer ld_live_..."

所有客户端都一样:地址 https://linkdigest.dev/mcp,传输方式 Streamable HTTP(有的客户端叫「HTTP」或「可流式传输的 HTTP」), 请求头 Authorization: Bearer ld_live_…。只有一个工具 digest_url,参数 url、format、job_id、partial_ok、translate_to、breakdown、depth。长视频第一次调用会返回 job_id, 再调一次、只传 job_id 不传 url 就能取结果。对 agent 说「拆解这条抖音」它会自己带上 breakdown: true。 Dify 有现成插件(插件市场搜 LinkDigest)。

先确认连得上:tools/list 不需要 Key。

curl -s https://linkdigest.dev/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

各客户端的配置(复制即用,把 ld_live_... 换成你的 Key)

Claude Code — 项目根目录的 .mcp.json(或用上面的 claude mcp add 一行)

{
  "mcpServers": {
    "linkdigest": {
      "type": "http",
      "url": "https://linkdigest.dev/mcp",
      "headers": { "Authorization": "Bearer ld_live_..." }
    }
  }
}

Cursor — 全局 ~/.cursor/mcp.json,或项目里的 .cursor/mcp.json

{
  "mcpServers": {
    "linkdigest": {
      "url": "https://linkdigest.dev/mcp",
      "headers": { "Authorization": "Bearer ld_live_..." }
    }
  }
}

Trae — MCP 设置里手动添加,粘贴 JSON

{
  "mcpServers": {
    "linkdigest": {
      "url": "https://linkdigest.dev/mcp",
      "headers": { "Authorization": "Bearer ld_live_..." }
    }
  }
}

Cherry Studio — 【设置】→【MCP】→【MCP 服务器】→【添加】→ 从 JSON 导入;之后在 Agent 的【编辑】→【MCP】里启用

{
  "mcpServers": {
    "linkdigest": {
      "type": "streamableHttp",
      "baseUrl": "https://linkdigest.dev/mcp",
      "headers": { "Authorization": "Bearer ld_live_..." }
    }
  }
}

通义灵码(Lingma) — 个人设置 → MCP 服务 → 我的服务 →「+」→ 配置文件添加。通义灵码文档只列了 STDIO 和 SSE、没有请求头,所以用 mcp-remote 在本地转一层(需要 Node.js)。手工添加也行:类型 STDIO,命令 npx,参数照下面 args,环境变量 AUTH_HEADER

{
  "mcpServers": {
    "linkdigest": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://linkdigest.dev/mcp", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer ld_live_..." }
    }
  }
}

只支持 SSE 或本地命令(stdio)的客户端:不要把类型选成 SSE 直接填地址——/mcp 只支持 Streamable HTTP。 用 mcp-remote 在本地转一层(需要 Node.js;它默认先走 Streamable HTTP):

npx mcp-remote https://linkdigest.dev/mcp --header "Authorization: Bearer <key>"

写进 JSON 配置时,有的客户端(mcp-remote 的说明里点名了 Cursor、Windows 上的 Claude Desktop)不会转义参数里的空格, 所以上面通义灵码的写法把 Bearer … 放进环境变量 AUTH_HEADER,参数写成 Authorization:${AUTH_HEADER}。

字段从哪来

哪些是原文,哪些是 AI 写的

要引用、入库或给人看之前,先分清楚:左边是从帖子里读出来的(YouTube 有例外,见表格下面),右边是模型基于原文写的分析。

原文:读出来的,不改写

transcript平台字幕,或 Qwen3-ASR 语音识别的结果。YouTube 例外:transcript_source 为 gemini_video 时,逐字稿由 Gemini 看视频写出(时间 t 也是它给的),不是平台字幕,也不是 Qwen3-ASR。
on_screen / ocr_text / images[].ocr视觉模型从画面、图片上逐字读出的字。是识别,不是改写;识别错字会原样出现。YouTube 例外:transcript_source 为 gemini_video 时,ocr_text 由 Gemini 看视频写出,没有 on_screen。
stats平台在读取当天给出的点赞、评论、收藏、分享、播放,as_of 写着日期;平台没给的是 null。
tags帖子自带的话题标签。
chapters / category / music平台给的章节、分类和背景音乐。chapter_source 为 platform 的章节和它的摘要是抖音自动生成的,不是我们的模型写的。2026-10-05 之前缓存的链接没有这几个字段。
links正文、简介、章节里写着的网址,公众号的阅读原文,二维码里的内容:由代码提取和分类(kind),不打开。found_in 为 on_screen 的网址取自画面文字识别,识别错字会原样出现。
title / author / posted_at / caption平台元数据和正文。title、author 只有明显乱码时才会被整理。YouTube 走 gemini_video 时,能读到 YouTube 视频页就取视频页上的;读不到时 title、author 由 Gemini 写出,caption、posted_at 为空。

AI 生成:模型写的

key_points模型根据上面的原文写的要点,保持原文语言。
key_point_support模型为每条要点给出一句原话和出处;原话由引擎在帖子里逐字查找,找到的 verified 为 true,并由代码写上时间 t 或第几张图 image_index;找不到的 verified 为 false,不删。
images[].description模型对每张图画了什么的描述。
breakdown爆款拆解。其中 hook.spoken、hook.on_screen、beats[].quote、cover_text、cta 是原文引用,逐字核对过,对不上的会被删掉并写进 missing;engagement 和 tags 直接复制 stats 和 tags,不由模型写。
translation机器翻译,放在原文旁边;原文字段一个字不改。

YouTube 例外:YouTube 不让我们的服务器地址下载视频,所以 YouTube 链接一般由 Gemini 直接看视频来读,degraded 里会写 read by Gemini watching the video directly。这时 transcript_source 为 gemini_video,逐字稿和画面文字(ocr_text)是 Gemini 写出的,属于模型输出;要逐字引用,以视频本身为准。标题、作者、简介(caption)和发布日期取自 YouTube 视频页;视频页读不到时,标题和作者也由 Gemini 写出。

coverage 两边都不算:它既不是从帖子里读出来的,也不是模型写的,是引擎按这次实际读了什么、用代码算出的回执—— 转写了几秒、抽帧间隔多大、读了几张图、哪些没读到(not_captured)。Markdown 里是「## Coverage」一节。

2026-09-18 我们用同一批中文视频对比过 Whisper large-v3-turbo:它更快更便宜,但中文错得更多(把「900人」听成「酒派人」、「创业」听成「创意」),所以生产环境用 Qwen3-ASR。

爆款拆解 · breakdown

不只是文案,是这条内容怎么做出来的

加 "breakdown": true,在逐字稿、画面文字、图片和数据的基础上多一次分析(+1 积分), 用帖子本身的语言写(或 translate_to 指定的语言)。引用的原话会和原文逐字核对,对不上的会删掉并在 missing 里说明; 点赞、评论、话题标签直接来自平台,不由模型编。

hook开头怎么留人:说的(逐字)、屏幕上的字(逐字)、画面、为什么有效
beats结构节拍:每一步的时间(≈)或第几张图、标签(痛点 / 方法 / 结果 / 行动号召…)、摘要、一句原话
title_formula标题公式,例如「数字 + 结果 + 人群」
cover_text / cta封面文字、行动号召,逐字
audience目标人群
template可复用模板,4–8 步,用 [产品] [痛点] 这样的占位
remix_ideas二创方向 2–3 个
missing这次拆解看不到的东西:没有语音、只读了一部分、没有数据…

扣子 Coze

用 OpenAPI 导入成插件

  1. 扣子 → 资源库 → 创建插件 → 导入,选择「URL」,填 https://linkdigest.dev/openapi.json。 (规格按 OpenAPI 3.0.3 生成并通过校验;导入时遇到问题,回复任何一封我们的邮件或写信到 support@linkdigest.dev。)
  2. 授权方式选 Service(服务),位置 Header,参数名 Authorization,值 Bearer ld_live_…(你自己的 Key)。
  3. 会出现 4 个工具:digest_url、get_digest、digest_batch、get_batch。 工作流里先调 digest_url(format 用 json);如果返回 pending,循环调用get_digest(jobId, wait=20) 直到拿到结果(最多循环 10 次)。正文用 raw_markdown,拆解用 breakdown。

飞书多维表格

一列链接,旁边自动填好

字段捷径已经开发完成:选链接所在的列、要什么(文案 / 图文文字 / 要点 / 爆款拆解)、是否翻译,填入 API Key, 旁边会拆出结果、标题、作者、钩子、结构节拍、可复用模板、点赞、评论、收藏、分享和本次积分等列;额度用完时单元格里直接给付款链接。 上架飞书捷径中心需要飞书审核,完成后这里会给出链接。在那之前,可以用多维表格自动化的「发送 HTTP 请求」调同一个 API(见上面的 REST 例子)。

价格

按工作量计费

注册送 10 积分(一次性,不按月补),不用绑卡。一条图文 1 积分; 视频每开始的 1 分钟 1 积分(一条 1 分钟的视频共 2 积分); 爆款拆解 +1,翻译 +1。任何人读过的链接再读免费;读不出内容不收费。

长视频可以用 depth: "transcript"(逐字稿优先):完整逐字稿 + 大约每分钟一帧(有章节时每章一帧), 每开始的 2 分钟 1 积分;付费账号最长 120 分钟、 免费 60 分钟(完整读取是 30 / 10 分钟)。 一条 45 分钟的讲座 24 积分。YouTube 例外:由 Gemini 看完整条视频,总是完整读取,按完整读取计费(每开始的 1 分钟 1 积分),传 depth: "transcript" 也一样。

加量包 $5 = 250 积分,一次性、永不过期,支持支付宝(按人民币结算 ¥36,每积分 ¥0.144:一条 6 张图以内的图文 ¥0.144, 一条 1 分钟的视频 ¥0.288);或 $9/月 500 积分(银行卡)。

不支持的

先说做不到的

接进去之后才发现读不出来,比现在就知道更糟。以下是明确不支持的,写在这里也写在覆盖表上。

平台 / 类型原因
B站(哔哩哔哩)对我们服务器的地址直接返回 HTTP 412,请求到不了视频。需要代理,目前没有。
X 长文(Articles)只能拿到首图。普通帖子的图片、视频都能读,长文正文读不到。
Instagram代码已接入,但没有端到端验证过,所以不算支持。