下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/reexin--dyvideos-extract-text.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @reexin/dyvideos-extract-text。抖音视频提取文案(dyvideos-extract-text)。从腾讯文档表格读取当天抖音视频链接,逐条下载视频音频,用 Whisper 语音转文字,AI 校对文案(歧义词/错字/病句/分段),校正后存入 IMA 知识库。每次调用扣 40 点(点数制 pay.reexin.cn),一次调用不限视频条数。Invoke when user needs to extract text/scripts from Douyin videos.
阅读全文 (展开查看完整说明)
概述
抖音视频提取文案
从腾讯文档表格取当天抖音链接 → 逐条提取完整口播文稿 → AI 质检 → 存入 IMA 知识库。
一次调用 = 40 点,本批次内不限视频条数。
付费门(已启用)
⚠️ 本技能为收费版,走自建
credits_server(https://pay.reexin.cn 点数制),每次调用扣 40 点。触发即走付费门:自检 API Key → 扣点确认 → 跑主链路 → 失败退点。
计费口径(重要)
| 口径 | 说明 |
|---|---|
| 40 点/次 | 一次 skill 调用只扣一次 |
| 不限条数 | 本批次处理 1 条还是 20 条,都只扣 40 点 |
| 失败退点 | 任意环节失败 → 全额退 40 点 |
文件构成
config.json:API_KEY(必填,去 https://pay.reexin.cn/recharge 扫码获取)+SERVER_URL+ IMA / 模型 / 工具路径credits_sdk.py:点数平台客户端(consume / refund / balance)check_payment.py:执行前扣点,成功往 stdout 吐invocation_id+client_request_idrefund_payment.py <invocation_id>:失败退点
执行顺序(agent 必须照做)
- 启动自检:读
config.json的API_KEY。无 Key / Key 失效 → 停下引导获取,绝不继续。 - 扣点确认:先告知「本次扣 40 点 + 当前余额 + 扣后余额 + 本批条数」,等用户说"继续/可以"才跑
check_payment.py。 - 退出码非 0(3/4/1)→ 立刻停下,按话术表告知用户,引导去 https://pay.reexin.cn/recharge。绝不绕过、绝不免费跑。
- 扣点成功(退出 0)→ 才跑主链路,并记住
invocation_id(退点要用)。 - 任一环节失败 → 跑
refund_payment.py <invocation_id>退点,并明确告知用户。
退出码话术表(agent 必须按表回应)
| 脚本 | 退出码 | 含义 | agent 话术 | 是否重试 |
|---|---|---|---|---|
| check_payment.py | 0 | 扣点成功 | "✅ 扣点成功,余额 XX 点。开始提取。" | 否 |
| check_payment.py | 3 | Key 无效 | "API Key 无效,前往 https://pay.reexin.cn/recharge 获取。" | 否 |
| check_payment.py | 4 | 余额不足 | "点数不足,余额 XX 点,需 40 点。前往充值:https://pay.reexin.cn/recharge" | 否 |
| check_payment.py | 1 | 网络异常 | "网络波动,正在重试(不会重复扣点)…" | 重试 2 次 |
| refund_payment.py | 0 | 退点成功 | "✅ 40 点已退回,余额 XX 点。可重新发起。" | 否 |
| refund_payment.py | 5 | 退点失败(含已退过/重复退、网络错误、Key 无效) | "退点异常:<原因>。任务 ID:XX" | 否,不重复退 |
硬规则
- 客户端不传点数:扣多少由服务端
skills表决定,防篡改。 - 必须用
ConsumeSession:固定client_request_id,网络重试不会二次扣点。 - 不静默退点:退点前先说"正在为你退还 40 点",退完再说结果。
- 退点必须用本次的
invocation_id:服务端对已退过的 ID 返回 HTTP 409 +idempotent_replay: true,
新版 SDK 抛 CreditsError("该 invocation_id 已退过点,请勿重复退点"),脚本退出码 5(旧版只返回 200
- 退出码 0 但实际未退,会误退成 0 消费陷阱)。
run_batch.py会把它存进output/_state.json。 - 解析
check_payment.py输出必须按 JSON 解析,按冒号split(":")[-1]会取到balance_after而非invocation_id。
主链路(8 步)
| 步 | 动作 | 命令 / 做法 |
|---|---|---|
| 1 | 读腾讯文档表格,取当天链接 | python scripts/fetch_links.py(默认取今天,已处理自动跳过) |
| 2 | 取第一条链接 | 队列化,逐条处理 |
| 3 | 提取文案 | python scripts/extract.py --url "<链接>"(或 scripts/run_batch.py --stage extract 批量) |
| 4 | AI 质检 | 按 scripts/qc_rules.md 校对,产出 final.md + qc_report.md |
| 5 | 存入 IMA | python scripts/ima_push.py --title "<标题>" --content-file <final.md>(或 run_batch.py --stage push) |
| 6 | 回写表格状态 | 可选。默认用本地 output/<id>/ 去重,不改动用户表格 |
| 7 | 取下一条 | 回到第 3 步,直到当天队列清空 |
| 8 | 汇总收尾 | 报告:成功 N 条 / 失败 M 条 / 入库位置;失败条已退点说明 |
一键批量(推荐)
python scripts/run_batch.py # 读表 → 扣点 → 逐条提取 → 入库
python scripts/run_batch.py --stage extract # 只提取
python scripts/run_batch.py --stage push # 只入库(final.md 需已存在)
python scripts/run_batch.py --date 2026-09-09 --yesrun_batch.py 负责:读表取当天链接 → 扣点门(一次 40 点)→ 逐条 extract.py → 逐条 ima_push.py → 写 output/_state.json(含 invocation_id、待质检清单)。
质检(第 4 步)必须由 AI 完成,脚本只检测 final.md 是否存在;不存在则该条列入 pending_qc,等 AI 校对后再跑 --stage push。
读表脚本(第 1 步)
scripts/fetch_links.py 经腾讯文档 MCP(td.cjs raw)读取 config.json 的 DOC_FILE_ID / DOC_SHEET_ID:
- 表格结构:A 列 = 日期(
2026年9月9日),B 列 = 视频链接(抖音分享口令整段粘贴即可) - 从分享口令中正则提取
https://v.douyin.com/...短链,自动剥掉口令噪声得到摘要标题 - 去重:比对本地
output/<video_id>/final.md,已完成的不重复处理(支持中断续跑) - 参数:
--date(默认今天)、--all(全部日期)、--include-done
第 3 步内部(extract.py)
抓直链(Playwright 驱动系统 Edge)→ 选流下载 → ffmpeg 转 16k 单声道 → faster-whisper 识别 → 产出 raw.txt / raw_timed.txt / meta.json。
选流规则(重要):抖音现网多为音视频分离流,grab_url.mjs 会给每个候选打 kind 标签:
| kind | 特征 | 处理 |
|---|---|---|
audio | URL 含 media-audio | 优先,直接下载当音频源(体积最小、最快) |
muxed | 音视频合并 | 次选,下载后用 ffmpeg 提音轨 |
video | URL 含 media-video | 兜底,纯画面无音轨,无法转写 |
| 退出码 | 含义 |
|---|---|
| 0 | 成功 |
| 3 | 抓直链失败(需登录/链接失效/被风控) |
| 4 | 下载失败 |
| 5 | 音频提取失败 |
| 6 | 识别为空(纯音乐无语音) |
参数表
| 参数 | 必填 | 说明 |
|---|---|---|
--outdir | 否 | 输出目录,默认 output/ |
--date / --all | 否 | fetch_links.py / run_batch.py:指定日期或忽略日期 |
--stage all|extract|push | 否 | run_batch.py:阶段控制 |
--yes | 否 | run_batch.py:跳过人工确认 |
--skip-billing | 否 | run_batch.py:仅供开发自测,正式运行禁止使用 |
环境依赖(本机已就绪)
| 依赖 | 状态 |
|---|---|
| ffmpeg | ✅ C:/ffmpeg/bin/ffmpeg |
| Edge 浏览器 | ✅ 供 Playwright 驱动 |
| playwright-core | ✅ 装在 node workspace |
| faster-whisper | ✅ venv C:/Users/zhouy/.workbuddy/binaries/python/envs/default |
| Whisper small 模型 | ✅ 已下载 483MB,路径见 config.json |
已知坑(已规避,不要重新踩)
| 坑 | 处理 |
|---|---|
| yt-dlp 走不通(抖音要 cookie,Edge Cookie 库被进程锁) | 改用 Playwright 拦截网络响应拿直链 |
| HuggingFace 官方 502、镜像客户端下出空文件 | 用 curl 从 hf-mirror.com 直连下载 |
ffmpeg 路径 /c/ 形式 Windows 程序不认 | 统一用 C:/ 路径 |
| 视频直链有时效 | 抓到后立即下载,不要缓存 URL |
| 下载到纯画面流导致「无音轨」报错 | 抖音现网是音视频分离流,必须选 media-audio 候选(见选流规则) |
ESM 脚本不认 NODE_PATH | playwright-core 装在技能目录自己的 node_modules/ |
venv 缺 requests | 已装;新环境需 pip install requests faster-whisper |
| 短链取不到视频 ID | 用重定向后的最终 URL page.url() 解析 |
| 表格 CSV 手工按行切会出错 | 用标准 csv.reader,单元格内逗号/引号才不会错 |
合规
提取的文案版权归原视频作者所有,仅供个人学习分析,不得直接搬运发布。