Install
openclaw skills install @panting09266-ai/douyin-video-studio抖音短视频一站式解析与创作工场。用户直接输入抖音视频链接加一句简单要求即可:视频转文字(字幕/口播/画面内容)、内容分析总结、爆款视频拆解(按带货/流量逻辑拆结构分段、脚本类型、爆款归因、六维评分报告,照着学照着抄)、视频转脚本(镜头/运镜/转场/情绪/时间线/屏幕文字)、爆款脚本生成(原骨架改写成你的脚本,或按方向/目的/商品原创口播脚本,含分段表与六维质检评分)、视频提示词反推(画面和内容转成 agent 可理解的提示词)。底层经 Cue Omni Reader 远程端点解析(自动绕过抖音反爬),再由大模型按场景加工交付。
openclaw skills install @panting09266-ai/douyin-video-studio输入一个抖音视频链接 + 一句需求,产出可直接使用的文字稿、拆解报告、分镜脚本、原创脚本或生成提示词。管线:Cue Omni Reader 远程端点(解析)→ 大模型(场景化加工)→ 交付。
mcp.cuecue.cn)抓取并解析,解析结果由大模型加工后交付。no_store=true:源文件与解析结果不落盘、不持久化于服务端。CUE_API_KEY 传入,避免明文写入配置文件。| # | 场景 | 用户典型说法 | 交付物 |
|---|---|---|---|
| 1 | 视频转文字 | 转文字 / 文字稿 / 字幕 / 转录 / 提取文字 | 口播全文 + 画面文字稿 + 时间线合并稿 |
| 2 | 内容分析总结 | 总结一下 / 讲了什么 / 分析 / 摘要 | 主旨 + 结构分段 + 核心要点 + 金句 + 受众分析 |
| 3 | 爆款视频拆解 | 拆解 / 为什么火 / 对标 / 抄作业 / 照着学 | 结构分段表 + 脚本类型 + 爆款归因 + 六维评分报告 + 可抄清单 |
| 4 | 视频转脚本 | 转脚本 / 分镜 / 还原脚本 | 分镜脚本表(镜头/运镜/转场/情绪/时间线/屏幕文字)+ 口播净稿 |
| 5 | 爆款脚本生成 | 帮我写脚本 / 改写成我的 / 仿写 / 原创脚本 | 多条脚本(分段表 + 口播全文 + 六维质检评分) |
| 6 | 视频提示词反推 | 反推提示词 / prompt / 提示词 | 风格提示词 + 分镜提示词序列 + TTS 文案 + 结构化 JSON |
路由规则:
1.76 h@B.gO Mws:/ ... 复制此链接,打开Dou音搜索 之类乱码)。先从中只提取干净 URL(v.douyin.com/xxx 或 iesdouyin.com/... 或 douyin.com/video/xxx),丢掉其余文字,再进入预处理。Cue API Key:与 cue-omni-reader 技能共用同一把 Key,无需新建。获取:cuecue.cn/hub/api-key(新账号送 500 积分 + 每天 10 免费积分)。推荐用环境变量传入,避免明文写盘:
export CUE_API_KEY="sk你的key"
如确需落盘,可写 ~/.cue/config.json(格式 {"api_key": "sk你的key"})。
远程端点直连(无需本地 Bridge、无需配置 MCP):抖音视频解析只走远程端点 https://mcp.cuecue.cn/api/omni-reader/mcp/(streamable-http),鉴权头 Authorization: Bearer <Cue Key>。不依赖 ~/.mcp.json 注册 MCP,也不装本地 Bridge;本地 Bridge 仅在降级方案中使用。
手动调用依赖:curl(Python 参考实现另需 python3,仅标准库)。实际使用时 Agent 自动完成解析,用户只需给一个抖音视频链接 + 一句需求。
抖音链接前置展开依赖 curl(见步骤 0)。部分环境若无 curl,可用 python3 + urllib 带浏览器 UA 做等价重定向跟随。
https://mcp.cuecue.cn/api/omni-reader/mcp/(streamable-http)。抖音 Web 是强反爬站点,本地 Bridge 提交抖音 URL 会立即被拒(REMOTE_REQUEST_REJECTED);远程端点由 Cue 服务端抓取,可正常解析。v.douyin.com 短链直连解析会失败:实测直接提交 https://v.douyin.com/xxxx/ 会返回 PARSE_FAILED(retryable:false、file_uploaded:false),即远程端点连抓取都未成功。原因通常是短链做了反爬跳转/签名校验。必须先展开:用浏览器 UA 跟随重定向取到真实地址 https://www.iesdouyin.com/share/video/<video_id>/?...(命令见步骤 0),再提交真实地址。share_sign / ts 可能过期:iesdouyin.com/share/video/... 的 ts(Unix 秒)与 share_sign 是带时效的访问凭证(实测几小时内有效),过期后解析会失败。每次解析前重新展开短链最稳妥;若用户直接给已展开的 iesdouyin 链接且解析失败,提示其重新复制分享链接。Accept: application/json, text/event-stream,否则报 Not Acceptable: Client must accept both application/json and text/event-stream。所有调用都必须带此头。parse / get_parse_status / cancel_parse,无 read_result。结果在 get_parse_status 返回 completed 时内联携带(result 字段)。detail 只能用 text:grounded/layout 在远程报 UNSUPPORTED_DETAIL。text 模式的结果已含关键帧画面文字([画面 mm:ss] 标注)+ ASR 口播稿([说话人N mm:ss] 标注)。tools/call 返回是 MCP 信封 {content:[{type:"text",text:"<JSON字符串>"}]},必须先取 content[].text 再 json.loads,否则状态字段永远读不到。响应为 SSE 流(data: 前缀行)。[说话人] 口播稿为准;交付时如引用画面识别内容,需标注「⚠️ 画面识别,可能误判」。从分享文案中提取干净 URL:忽略 复制此链接,打开Dou音搜索,直接观看视频! 等一切多余文字,只取 https://... 部分。
三种可输入的链接形态:
https://v.douyin.com/jhSnHUQwe5A/。不要直接提交,先展开(见下)。https://www.iesdouyin.com/share/video/<video_id>/?region=CN&mid=...&share_sign=...&ts=...。保留全部参数(尤其 share_sign、ts),不要清理——或干脆重新展开短链拿最新有效参数。https://www.douyin.com/video/<video_id>。远程端点通常可抓取,但若失败优先改用 iesdouyin.com/share/video/<id>/ 形态。短链展开(必须用浏览器 UA 跟随重定向):
UA="Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1"
curl -sS -L --max-time 20 -A "$UA" -o /dev/null -w "%{url_effective}\n" "https://v.douyin.com/<短码>/"
# 输出形如:https://www.iesdouyin.com/share/video/7674946589839969542/?region=CN&mid=...&share_sign=...&ts=...
取该真实地址作为后续 parse 的 source。
图文 vs 视频判断:拿到的是抖音图文帖(多图、无视频)时,本技能不适用,直接告知用户。
时长预判:短视频直接提交;遇到超长视频(>20 分钟)先告知用户解析耗时更长,让其确认。
告知用户等待时长后,调用 parse(参考实现见「解析调用手册」)。返回 {"status":"processing","operation_id":"op_..."},记下 operation_id。
循环调用 get_parse_status(wait_ms: 20000),status=completed 后从 result 字段取出全文。解析结果的三类原料:
[画面 mm:ss] ... —— 关键帧画面 OCR 文字与视觉描述(注意误识别风险,见事实 9)[说话人N mm:ss] ... —— ASR 口播全文(权威来源)按「场景交付规范」用解析原料生成对应交付物。事实纪律:口播、画面文字、时间戳一律以解析结果为准;镜头、运镜、转场、情绪等解析结果中没有的信息,由大模型基于画面文字与叙事推断,必须标注「⚠️ 推断」。禁止编造视频中不存在的内容。
<video_id或短码>_<场景>.md(如 7674946589839969542_爆款拆解.md)。三件套,按用户需要给全或给精简:
[说话人 mm:ss] 时间戳;另出一份净稿(去时间戳、去语气词,可直接当文案用)。[画面 mm:ss] 逐条列出屏幕上出现的文字(标题卡、字幕条、贴纸、价格牌等),并标注「⚠️ 画面识别,可能误判人物/作品」。| 时间 | 口播 | 屏幕文字 |
|---|
基本盘:标题 / 时长 / 博主 / 标签(来自解析结果与用户提供;点赞收藏评论等数据用户提供了才写)。
结构分段表(核心)——按视频实际逻辑二选一或混合:
| 时间轴 | 段落功能 | 时长 | 手法 | 话术摘录 |
|---|
脚本类型判定:口播干货型 / 剧情演绎型 / 混剪解说型(影视解说多属此类)/ 教程演示型 / 测评种草型 / vlog记录型 / 直播切片型……给出判定依据。
爆款归因(两层):
六维评分报告:见「六维评分体系」,表格 + 总分 + 评级(S/A/B/C)+ 每维一句依据。
抄作业清单:可复用的骨架模板(占位符化)、钩子公式、话术库、节奏参数(每段时长配比)。
还原为可拍摄的分镜脚本表:
| 时间线 | 镜头(景别/机位)⚠️推断 | 运镜 ⚠️推断 | 转场 ⚠️推断 | 画面内容 | 屏幕文字 | 口播/台词 | 情绪 | 备注 |
|---|
两种模式,先确认用户要哪种:
每条脚本交付:
把画面和内容转成 agent / 生成式 AI 可直接使用的提示词:
/)与重音(**加粗**)标记。{"style_prompt": "...", "shots": [...], "narration": "..."},供 agent 自动化流水线直接调用。| 维度 | 考察点 | 评分 1-10 |
|---|---|---|
| 钩子力 | 前 3-5 秒留人能力(悬念/冲突/利益点前置) | |
| 节奏密度 | 信息与画面切换频率,无冗余 | |
| 情绪势能 | 情绪唤起与曲线(共鸣/好奇/焦虑/爽感) | |
| 价值密度 | 观众实际获得感(干货/娱乐/情绪价值) | |
| 转化引导 | CTA 清晰度与行动驱动力(关注/点赞/下单) | |
| 可复制性 | 结构与话术可模板化程度(越高越容易抄) |
# 0)先从分享文案提取短链,并用浏览器 UA 展开为真实地址(关键!v.douyin.com 直连会 PARSE_FAILED)
UA="Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1"
REAL=$(curl -sS -L --max-time 20 -A "$UA" -o /dev/null -w "%{url_effective}" "https://v.douyin.com/<短码>/")
# ① 提交解析(记下返回的 operation_id;务必带 Accept 头)
curl -sS -X POST "https://mcp.cuecue.cn/api/omni-reader/mcp/" \
-H "Authorization: Bearer $(python3 -c "import json;print(json.load(open('$HOME/.cue/config.json'))['api_key'])")" \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"parse\",\"arguments\":{\"source\":\"$REAL\",\"detail\":\"text\"}}}"
# ② 轮询(每 15-20 秒一次,直到 status=completed)
# arguments 换成 {"operation_id":"op_xxx","wait_ms":20000}
# ③ completed 后取 result 字段文本 = 解析全文
import json, subprocess, time, os, re
KEY = json.load(open(os.path.expanduser("~/.cue/config.json")))["api_key"]
EP = "https://mcp.cuecue.cn/api/omni-reader/mcp/"
UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1"
def call(name, args, timeout=90):
body = json.dumps({"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":name,"arguments":args}}).encode()
p = subprocess.run(["curl","-sS","--max-time",str(timeout),"-X","POST",EP,
"-H",f"Authorization: Bearer {KEY}","-H","Content-Type: application/json",
"-H","Accept: application/json, text/event-stream","--data-binary",body],
capture_output=True, text=True)
for line in p.stdout.splitlines():
line = line.strip()
if line.startswith("data: "): line = line[6:]
if line.startswith("{"):
r = json.loads(line)
if "result" in r:
txt = "".join(c.get("text","") for c in r["result"].get("content",[]))
try: return json.loads(txt) # 拆信封后再解析
except Exception: return {"_raw": txt}
raise RuntimeError(json.dumps(r.get("error","unknown"), ensure_ascii=False))
raise RuntimeError("无响应")
def resolve_real(url):
"""v.douyin.com 短链必须展开;已是 iesdouyin/douyin 真实地址则原样返回。"""
if "v.douyin.com" in url:
out = subprocess.run(["curl","-sS","-L","--max-time","20","-A",UA,
"-o","/dev/null","-w","%{url_effective}",url],
capture_output=True, text=True).stdout.strip()
return out or url
return url
url = resolve_real("<用户给的抖音URL>")
st = call("parse", {"source": url, "detail": "text"}) # 提交
op = st.get("operation_id")
if not op:
raise RuntimeError("提交失败:" + json.dumps(st, ensure_ascii=False))
while st.get("status") == "processing": # 轮询
time.sleep(min(st.get("poll_after_seconds", 10) or 10, 15))
st = call("get_parse_status", {"operation_id": op, "wait_ms": 20000})
r = st.get("result")
text = r if isinstance(r, str) else (r or {}).get("text") or st.get("text") or ""
# text 即解析全文(含 [说话人 mm:ss] 与 [画面 mm:ss])
| 错误码 | 含义 | 处理 |
|---|---|---|
PARSE_FAILED(file_uploaded:false,提交 v.douyin.com 短链时高发) | 短链未展开,远程端点连抓取都没成功 | 用浏览器 UA 展开短链为 iesdouyin.com/share/video/<id>/ 后重试;retryable:false 但换真实 URL 可成功 |
REMOTE_REQUEST_REJECTED | 多半是误走了本地 Bridge,或 URL 非规范抖音链接 | 确认走远程端点、URL 已预处理展开 |
SERVICE_TEMPORARILY_UNAVAILABLE | 服务临时不可用(retryable:true) | 等 10 秒重新提交同一请求 |
UNSUPPORTED_DETAIL | 传了 grounded/layout | 改回 detail:"text" |
SOURCE_TOO_LARGE / 超长视频 | 超出上限 | 引导用户确认是否继续(抖音长解说偶发) |
INSUFFICIENT_CREDITS | 积分不足 | 指引 cuecue.cn/pay 充值或等次日免费额度 |
远程端点不可达时,本技能无免登录公开直链降级路径——抖音视频直链需平台登录态与签名,涉及浏览器 Cookie/登录态的本地下载方式本技能不采用。建议:
SERVICE_TEMPORARILY_UNAVAILABLE(retryable:true)时等 10 秒重新提交同一请求;偶发过载通常几分钟内恢复。OMNI_ALLOWED_ROOTS 授权目录内)以 detail:"text" 解析,需用户确认文件路径。首选仍是远程端点;本技能不读取、不收集浏览器 Cookie 或登录态。
Q: 用户直接丢了一整段抖音分享文案(含乱码 h@B.gO 之类)? 只从中提取 https://... 部分的干净 URL(通常是 v.douyin.com/xxx 或 iesdouyin.com/...),丢掉其余文字再解析。
Q: 提交 v.douyin.com/xxx 直接报 PARSE_FAILED? 抖音短链直连解析会失败(file_uploaded:false)。必须先用浏览器 UA 跟随重定向展开为 www.iesdouyin.com/share/video/<id>/?... 真实地址再提交,重试即可成功。
Q: 展开后的 iesdouyin 链接又解析失败了? 该链接的 ts/share_sign 是带时效的访问凭证,可能已过期。让用户重新在抖音 App 复制分享链接,再走一遍展开流程。
Q: 解析结果里把《甄嬛传》识别成了《大长今》/别的韩剧? 这是影视解说类视频的典型误识别——画面是二创剪辑素材,视觉模型会把片中人物/作品张冠李戴。关键剧情与事实以 [说话人] 口播稿为准,画面描述仅作辅助并标注「⚠️ 可能误判」。
Q: 解析结果只有口播没有画面文字? 该视频可能没有文字版面(纯真人出镜口播,或画面文字太花识别不出)。detail:"text" 已是画面信息最全的模式,layout/grounded 当前不可用,勿再尝试。
Q: 视频很长(>15 分钟)? 抖音影视解说经常 5–15 分钟甚至更长。若遇到,先告知用户解析耗时更长(可能 8 分钟以上),确认后再提交。
Q: 积分/额度? 与 cue-omni-reader 共用:新用户 500 积分 + 每天 10 免费积分,同一视频重复解析会复用结果不重复扣费。
Q: 想要的不是转录稿,而是爆款脚本? 用场景 5:先说「改写成我的脚本」或给方向/目的/商品,或先跑场景 3 拿骨架再改写。