Install
openclaw skills install @jackchew7143/linkdigest-video-transcript抖音/小红书视频文案提取:口播逐字稿、画面上的字(带大致时间)、要点和互动数据。用户发来抖音、小红书视频笔记、TikTok、YouTube 或 X 的视频链接或分享文案,要提取文案、视频转文字、扒口播、提取字幕或画面文字时使用。长视频会排队,脚本自动轮询取结果。通过 LinkDigest API 读取,不用下载视频,不需要平台账号或 Cookie。需要 LINKDIGEST_API_KEY;每条 1 积分,另加每开始的 1 分钟 1 积分(1 分钟视频共 2 积分,约 ¥0.29)。不支持 B站。
openclaw skills install @jackchew7143/linkdigest-video-transcript把抖音、小红书视频笔记、TikTok、YouTube、X 的视频链接读成文字:口播逐字稿(没有平台字幕时用 Qwen3-ASR 语音识别;YouTube 例外,由 Gemini 看视频写出)、画面上出现的字和大致时间、标题和简介、要点、点赞评论收藏分享数、话题标签。不用下载视频,不用在本机装 ffmpeg 或语音识别模型,不需要你的平台账号或 Cookie。
POST /api/v1/digest/batch,最多 50 条)。ld_live_ 开头)。新账户送 10 积分,只送一次,不用绑卡。export LINKDIGEST_API_KEY=ld_live_...
也可以写进 OpenClaw 配置(~/.openclaw/openclaw.json)里这个技能的 env:
{ skills: { entries: { "linkdigest-video-transcript": { env: { LINKDIGEST_API_KEY: "ld_live_..." } } } } }
Key 只放在环境变量或配置里,不要贴进对话、代码或提交记录。
推荐用自带脚本(Python 3.8+ 标准库,已经处理好 202 排队和轮询):
python3 {baseDir}/scripts/linkdigest.py "<视频链接或整段分享文案>"
python3 {baseDir}/scripts/linkdigest.py "<视频链接>" --format json
python3 {baseDir}/scripts/linkdigest.py "<视频链接>" --translate-to en # 另附英文译文,+1 积分,原文保留
python3 {baseDir}/scripts/linkdigest.py "<视频链接>" --max-credits 5 # 超过 5 积分的视频不读、不扣费
printf '%s' "$SHARE_TEXT" | python3 {baseDir}/scripts/linkdigest.py -?wait=20 轮询,默认最多等 900 秒(--timeout 可改)。--job-id <jobId> 接着取。同一个 jobId 只扣一次费。任务完成后在服务端保留 15 分钟,尽快取;过期了就重新提交同一链接。curl -sS -X POST https://linkdigest.dev/api/v1/digest \
-H "Authorization: Bearer $LINKDIGEST_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://v.douyin.com/<短链>/", "format": "json"}'
200:结果 JSON。202:{"pending":true,"jobId":"…","poll":"/api/v1/digest/…","retryAfter":15}。用 jobId 取,不要重新提交:curl -sS "https://linkdigest.dev/api/v1/digest/<jobId>?wait=20" \
-H "Authorization: Bearer $LINKDIGEST_API_KEY"
wait=20 让服务端最多等 20 秒再回复;仍是 202(会带 stage 表示进行到哪一步)就再取一次,直到 200。要 Markdown 时,提交用 "format": "markdown",取结果加 &format=markdown(202 响应始终是 JSON)。其他可选参数:"translate_to": "en"、"max_credits": 5、"partial_ok": true、"breakdown": true。
可以直接运行的 bash/zsh 版本(提交 + 轮询,最多约 15 分钟):
API=https://linkdigest.dev/api/v1/digest
AUTH="Authorization: Bearer $LINKDIGEST_API_KEY"
LINK='https://v.douyin.com/<短链>/'
res=$(curl -sS -w '\n%{http_code}' -X POST "$API" -H "$AUTH" \
-H "Content-Type: application/json" -d "{\"url\": \"$LINK\", \"format\": \"json\"}")
code=${res##*$'\n'}; body=${res%$'\n'*}
n=0
while [ "$code" = 202 ] && [ $n -lt 45 ]; do
n=$((n+1))
job=$(printf '%s' "$body" | sed -n 's/.*"jobId":"\([^"]*\)".*/\1/p')
res=$(curl -sS -w '\n%{http_code}' "$API/$job?wait=20" -H "$AUTH")
code=${res##*$'\n'}; body=${res%$'\n'*}
done
echo "HTTP $code" >&2
printf '%s\n' "$body"
| 字段 | 内容 |
|---|---|
title / author / posted_at / caption | 标题、作者、发布日期、简介原文 |
transcript[] | 口播逐字稿,[{t, text}],t 是这一段开始的秒数 |
transcript_source | 逐字稿来源:asr(Qwen3-ASR 语音识别)、native_captions(平台自带字幕)、gemini_video(YouTube:Gemini 看视频写出,见下文)、none(没有可识别的语音) |
on_screen[] | 画面上的字,[{t, text}],t 是大致时间(秒)。YouTube 没有这一项 |
ocr_text[] | 画面文字的汇总列表(不带时间)。YouTube 的画面文字只在这里,也是 Gemini 写出的 |
key_points[] | 要点,用原文语言 |
stats | likes、comments、collects、shares、plays;读取当天平台给的数,as_of 是日期,拿不到的是 null |
tags[] | 话题标签 |
duration_seconds / read_seconds | 视频总长、实际读了多长 |
partial | 只读了开头时才有:read_seconds、duration_seconds、read_credits、full_credits(读全片要多少积分) |
translation | 加了 translate_to 才有;原文字段保持不变 |
raw_markdown | 整条内容的 Markdown:## Transcript(每段前面是 `mm:ss`)、## On-screen text(前面是 `≈mm:ss`) |
credits / cached | 本次扣了几个积分;读过的链接 cached=true,0 积分 |
degraded[] | 处理中没做完的部分的说明,正常为空 |
transcript[](asr):Qwen3-ASR 只返回文字、不返回逐句时间,所以音频按最长约 170 秒切段上传,每段一个开始时间。时间是段级的:不到 170 秒的视频只有一段(t=0);一条 15:42 的抖音视频返回的段落从 0、170、340、510、680、850 秒开始。这不是逐句时间轴。on_screen[]:全片均匀抽帧读字(目前最多 40 帧),时间取最近的关键帧,误差在一个关键帧间隔内(通常 2–5 秒);同样的字连续出现只记一次。视频越长抽帧越稀,一闪而过的字可能漏掉。要按秒定位,看 on_screen。degraded 里会写 read by Gemini watching the video directly。这时 transcript_source 是 gemini_video,逐字稿和它的时间 t、画面文字(ocr_text)、标题和作者都是 Gemini 写出的,属于模型输出,不是平台字幕,也不是 Qwen3-ASR;没有 on_screen。transcript 的全文,按原样,不改写、不总结,除非用户要求。画面文字单独列出,不要混进口播。transcript_source 是 asr 时,transcript 是语音识别结果,方言、口音、专有名词、中英混说时可能有错字;人名、品牌名、数字提醒用户核对。transcript_source 是 gemini_video(YouTube)时,告诉用户逐字稿是模型看视频写出的,要逐字引用请以视频本身为准。transcript_source 是 none 或逐字稿为空时,说明视频没有可识别的人声(比如纯音乐),这时文字主要在 on_screen 里。partial 时,告诉用户只读了前多少秒,以及读全片要多少积分。credits,缓存命中是 0)。每条 1 积分,另加每开始的 1 分钟 1 积分(1 分 01 秒按 2 分钟算)。按加量包 ¥36 = 250 积分折算,1 积分约 ¥0.144。
| 视频长度 | 积分 | 约合 |
|---|---|---|
| 1 分钟以内 | 2 | ¥0.29 |
| 3 分钟 | 4 | ¥0.58 |
| 5 分钟 | 6 | ¥0.86 |
| 10 分钟 | 11 | ¥1.58 |
加译文(--translate-to) | +1 | +¥0.14 |
加爆款拆解(--breakdown) | +1 | +¥0.14 |
| 任何人读过的链接(缓存) | 0 | 0 |
| 读不出内容 | 0 | 0 |
注册送 10 积分(每个账户一次,不按月补),够读一条 9 分钟的视频,或 5 条 1 分钟以内的视频。加量包 $5 = 250 积分,可用支付宝付款(按 ¥36 结算),不过期;或 Dev 月付 $9 = 每月 500 积分(银行卡)。价格以 https://linkdigest.dev/zh/docs 为准。
error_code: media_too_long),不扣费。--partial-ok(HTTP 里是 "partial_ok": true):只读开头,读多长取决于剩余积分,最多 10 分钟;结果里的 partial 写明读了多少秒。--depth transcript(HTTP 里是 "depth": "transcript",2026-10-06 起):全程逐字稿 + 少量截帧,基础 1 积分 + 每开始的 2 分钟 1 积分(44 分钟的视频 23 积分,完整档要 45)。长度上限也更高:免费和加量包账户 60 分钟,Dev 月付 2 小时。画面文字只读少量截帧,结果里的 coverage 会写明。YouTube 不支持这一档。scripts/linkdigest.py 只读环境变量 LINKDIGEST_API_KEY,只连 linkdigest.dev,不读写本地文件。https://linkdigest.dev/mcp,请求头 Authorization: Bearer <key>,工具 digest_url。Claude Code:
claude mcp add --transport http linkdigest https://linkdigest.dev/mcp --header "Authorization: Bearer <key>"npx mcp-remote https://linkdigest.dev/mcp --header "Authorization: Bearer <key>"jcaiagent7143-ui/linkdigestLinkDigest 由独立开发者 Jack(GitHub jcaiagent7143-ui)开发和维护。问题和反馈:support@linkdigest.dev