适用版本: v4 · 最后更新: 2026-07-12 · 维护者: Yht20927
抖音评论运营 CLI 工具。基于 Bridge Framework(Bridge Server + 油猴脚本),支持视频搜索、评论获取、AI 人格化回复、ReplyEngine 独立生成、草稿管理、运营仪表盘。
核心亮点:ReplyEngine 评论生成引擎(generateComment / generateReply / generateReplies)+ A-F 六类回复策略 + Anthropic & OpenAI 双 Provider 支持 + Token 用量追踪,让代管自有账号的评论运营全流程自动化。
| 功能 | 说明 |
|---|---|
| 🔍 视频搜索 | 关键词搜索视频 |
| 💬 评论获取 | 获取评论及嵌套回复,--new 增量拉取 |
| 🧠 ReplyEngine | 独立评论生成引擎,3 种模式 + 人格绑定 + 上下文隔离 |
| 🤖 AI 人格化回复 | 7 种人格自动轮换,A-F 六类回复策略,避免"AI 味" |
| 📝 草稿管理 | 回复草稿 save/list/show/post/delete 完整生命周期 |
| 🎭 行为模拟 | 模拟真实浏览(搜索→看视频→点赞),穿插在发布流程中 |
| ⏱️ 随机延迟 | 发布间隔 40-55s 随机 + 疲劳累加,模拟真人节奏 |
| 🎲 请求参数随机化 | browser_version 动态获取、paste_edit_method / enter_from 随机切换 |
| 🛡️ 风控断路器 | 10 分钟内 post 失败 ≥3 次自动暂停 |
| 📥 视频下载 | 下载视频+音频(BGM),支持 ffmpeg 截图多模态分析 |
| 📊 运营仪表盘 | 本地 HTML 可视化,含推广活动卡片 |
| 💾 持久化记忆 | SQLite schema v8(events / users / videos / comments / corpus / failures / campaigns / llm_usage / drafts) |
npm install
# 1. 复制配置
cp config.example.json config.json
# 编辑 config.json:填入 bridge.token 和 llm.api_key
# 支持 OpenAI 兼容 API 和 Anthropic 原生 Messages API(自动检测切换)
# 2. 启动 Bridge Server
node server.js
# 3. Chrome 安装油猴脚本 scripts/douyin.user.js
# ⚠️ Chrome 用户:需先在 Tampermonkey 中启用"允许访问文件网址"
# 详见下方「疑难排解」→ Chrome 连接问题
# 打开 douyin.com 并登录
# 4. 验证连接
node cli.js my
# 5. 开始使用
node cli.js search "关键词"
node cli.js get <aweme_id> --pages 1 --count 5
node cli.js suggest <aweme_id> --auto
node cli.js getReply <aweme_id> --batch独立于 suggest 命令的新一代评论生成系统,支持三种模式:
# 评论模式:以普通用户身份生成视频的顶级评论
node cli.js getReply <aweme_id>
node cli.js getReply <aweme_id> --count 3 # 多条候选
node cli.js getReply <aweme_id> --persona casual_friend # 指定人格
# 回复模式:以博主身份回复单条评论
node cli.js getReply <aweme_id> <cid> # 自动加载视频上下文 + 用户画像
node cli.js getReply <aweme_id> <cid> --interactive # 交互式审核(生成→编辑→发布)
# 批量模式:对视频下所有未回复评论批量生成回复
node cli.js getReply <aweme_id> --batch # 自动跳过作者自评ReplyEngine 架构:
- 人格绑定(persona-binder):同视频复用人格,第 8 条自动换风格,microAdjust 微调温度
- 上下文隔离(context-scope):L1 本视频语料 → L2 全局成功语料 → L3 失败模式避雷
- 多模态(video-context):支持 text-only / screenshots(ffmpeg 取帧)/ video 三种模式
- A-F 回复策略:提问型 / 赞美型 / 讨论型 / 简短型 / 批评质疑型 / 艾特型
7 种内置人格自动轮换,每条评论风格不同:
| 人格 | 特征 | 示例 |
|---|---|---|
| casual 朋友 | 口语短句,1-2 个 emoji | "哈哈哈这也太真实了😂" |
| 好奇提问型 | 以问句为主,真诚追问 | "这个是在哪里买的呀?" |
| 经验分享型 | "我之前也..." | "我之前试过,确实不错" |
| 热情追捧型 | 感叹号+emoji,情绪化 | "啊啊啊这个绝了!!" |
| 温和探讨型 | "我觉得..."委婉补充 | "说得挺有道理的,不过..." |
| 轻松幽默型 | 玩梗、自嘲、夸张 | "我的手:我会了 我的脑:不你不会" |
| 简短反应型 | 极简,3-15 字 | "真实👍" "马住了" |
使用:
# 生成建议(不发布,看风格)
node cli.js suggest <aweme_id>
# 自动发布(人格轮换 + 随机延迟 + 浏览穿插)
node cli.js suggest <aweme_id> --auto
# ReplyEngine 单条回复(自动绑定人格 + 用户画像注入)
node cli.js getReply <aweme_id> <cid>模拟真实用户浏览行为,解决"只发不看"的账户不对称检测:
# 随机搜索热门词 → 看 1-2 个视频 → 偶尔点赞评论
node cli.js browse --max-notes 2 --like-chance 0.2
# 指定关键词浏览
node cli.js browse 穿搭 美食 --max-notes 3suggest --auto 已内置 browse 穿插:每发约 5 条评论自动穿插一次浏览+点赞。
抖音油猴脚本内置多项请求参数随机化:
| 参数 | 随机化策略 |
|---|---|
browser_version |
动态读取 navigator.userAgent(非硬编码) |
paste_edit_method |
90% non_paste / 10% paste |
enter_from |
85% others_homepage / 15% search_result |
previous_page |
85% others_homepage / 15% homepage |
| 命令 | 用途 | 示例 |
|---|---|---|
my |
我的作品列表 | node cli.js my |
user |
查看用户作品信息 | node cli.js user <sec_user_id|主页URL> |
search |
搜索视频 | node cli.js search "关键词" --count 5 |
get |
获取评论 | node cli.js get <id> --pages 1 --count 5 |
replies |
获取回复列表 | node cli.js replies <cid> <aweme_id> |
post |
发表评论/回复 | node cli.js post <id> "内容" --reply-to <cid> |
like |
点赞视频 | node cli.js like <id> |
delete-comment |
删除评论 | node cli.js delete-comment <cid> |
download |
下载视频+音频 | node cli.js download <id> [--audio-only] |
| 命令 | 用途 | 示例 |
|---|---|---|
analyze |
AI 分析评论情感/优先级 | node cli.js analyze <id> |
suggest |
AI 回复建议 + 自动发布 | node cli.js suggest <id> --auto |
getReply |
ReplyEngine 生成评论/回复 | node cli.js getReply <id> [<cid>] [--batch] |
draft |
草稿管理 | node cli.js draft <list|save|show|post|delete> |
browse |
模拟浏览行为 | node cli.js browse --max-notes 2 |
dashboard |
运营仪表盘 HTML | node cli.js dashboard |
| 命令 | 用途 |
|---|---|
replied |
已回复 cid 列表 |
corpus search/recent/stats |
回复语料库 |
failures |
失败模式 top-N(避雷清单) |
dedup |
查重护栏 |
whois |
用户全量画像 |
note |
用户标记(tier/tag/notes) |
comment |
单条评论实体查询 |
profile |
用户交互历史 |
events |
原始事件流 |
log |
操作日志 |
| 命令 | 用途 |
|---|---|
preflight |
节奏守卫自检 |
repo-info |
GitHub 仓库真实信息(推广事实源) |
factcheck |
推广评论发布前事实校验 |
campaign |
推广引擎(create/plan/run/stop/status) |
validate-prompts |
校验提示词模板格式 |
| 命令 | 用途 |
|---|---|
dm |
私信发送/监听/列表 |
cleanup |
清理过期记忆(TTL) |
config.json(从 config.example.json 复制):
{
"bridge": {
"host": "127.0.0.1",
"port": 19422,
"token": "your-bridge-token"
},
"llm": {
"api_key": "sk-...",
"base_url": "https://api.openai.com/v1",
"model": "gpt-4o-mini",
"max_tokens": 4096,
"timeout_ms": 60000,
"max_retries": 3
},
"vision": {
"screenshot_count": 4,
"screenshot_width": 1024
}
}LLM Provider 自动检测:
base_url含anthropic.com→ Anthropic 原生 Messages APIbase_url含xiaomimimo.com→ MiMo API(api-key 头)- 其他 → OpenAI 兼容格式(Bearer token)
环境变量(优先级更高):
export OPENAI_API_KEY="sk-..."
export OPENAI_BASE_URL="https://..."
export OPENAI_MODEL="gpt-4o-mini"CLI (cli.js) → HTTP/WS → Bridge Server (:19422) → 油猴脚本 → 页面 fetch → 抖音 API
签名安全:油猴脚本在页面上下文执行,使用页面原生 fetch,自动携带真实 Cookie 和签名。
核心模块:
lib/reply-engine/— ReplyEngine 评论生成引擎(5 模块)lib/risk-control.js— 请求节奏守卫(写操作硬强制,单一间隔源)lib/jitter.js— 节奏与拟人化延迟工具库lib/personas.js— 7 种人格模板池lib/llm.js— LLM 客户端(OpenAI + Anthropic 双 Provider,A-F 策略,Token 追踪)lib/commands/browse.js— 模拟浏览行为lib/commands/campaign.js— P4 推广引擎
语义边界:这是 rate-limit pacing(请求节奏化)+ content humanization(内容拟人化), 服务于用户自有账号的代管运营,避免触发接口频控、维护账号健康。 它不是"逃避平台内容审核"——内容真实性与反刷量由 内容禁令 + corpus 去重 + factcheck 保证。
| 维度 | 对策 |
|---|---|
| 固定时间间隔 | 写操作 40-55s 硬强制(risk-control 守卫,读 config.json:intervals) |
| AI 内容特征 | 7 种人格轮换 + A-F 六类回复策略 + AI 特征词黑名单 |
| 只发不看 | 每发 ~5 条穿插 browse 浏览+点赞 |
| 静态请求指纹 | browser_version 动态获取、paste_edit_method / enter_from 随机化 |
| 重复内容 | reply_corpus UNIQUE 去重 + LLM 重写 |
| 回复质量 | 禁止单字/单表情回复,最少 8 字,ReplyEngine 上下文隔离 |
| 高频失败 | 10 分钟窗口断路器(非累计值) |
douyin-cli/
├── cli.js # CLI 入口(命令路由 + help)
├── server.js # Bridge Server(WebSocket + HTTP /api/status)
├── config.example.json # 配置模板(bridge + llm + vision)
├── CONTRIBUTING.md # 贡献指南
├── SECURITY.md # 安全策略
├── DISCLAIMER.md # 免责声明
├── lib/
│ ├── commands/ # 命令模块(32 个命令,注册在 index.js)
│ │ ├── get/post/like/delete-comment.js # 核心 CRUD
│ │ ├── search/my/user/replies/download.js # 读取类
│ │ ├── analyze/suggest.js # LLM 分析与回复
│ │ ├── getReply.js # ReplyEngine 评论/回复生成
│ │ ├── draft.js # 草稿管理
│ │ ├── comment.js # 单条评论查询
│ │ ├── validatePrompts.js # 提示词模板校验
│ │ ├── browse.js # 模拟浏览行为
│ │ ├── campaign.js # P4 推广引擎
│ │ ├── preflight/repo-info/factcheck.js # 节奏与事实守卫
│ │ ├── whois/note/events/log/profile.js # 记忆层查询
│ │ ├── corpus/failures/dedup/replied.js # 语料 / 失败 / 查重
│ │ └── dashboard/dm/cleanup.js
│ ├── reply-engine/ # ReplyEngine 评论生成引擎(v4 新增)
│ │ ├── index.js # 主类(generateComment/generateReply/generateReplies)
│ │ ├── persona-binder.js # 人格绑定 + microAdjust
│ │ ├── context-scope.js # 三层上下文隔离(L1/L2/L3)
│ │ ├── prompt-builder.js # 5 种 Prompt 模式组装器
│ │ └── video-context.js # 视频上下文加载(含 ffmpeg 截图)
│ ├── memory/ # SQLite 持久化记忆层
│ │ ├── db.js # 单例 + WAL + schema 迁移(v8)
│ │ ├── events/users/comments/videos.js
│ │ ├── corpus/failures/campaigns.js
│ │ ├── drafts.js # 草稿管理(v4 新增)
│ │ └── llm-usage.js # LLM Token 用量追踪(v4 新增)
│ ├── shared/ # 共享工具
│ │ ├── serialize.js / parseResponse.js / protocol.js
│ │ └── caseConvert.js # camelCase → snake_case(v4 新增)
│ ├── client/ # Bridge 客户端
│ ├── server/ # WS Hub + Router + Registry
│ ├── risk-control.js # 请求节奏守卫 + 自适应风控
│ ├── llm.js # LLM 客户端(OpenAI + Anthropic + Token 追踪)
│ ├── personas.js # 7 种人格模板池
│ ├── jitter.js # 节奏与拟人化延迟
│ ├── audit.js # 审计日志(SQLite 双写)
│ └── dashboard.js # HTML 仪表盘
├── prompts/ # LLM Prompt 模板(用户可编辑,v4 新增)
│ ├── analyze.md # 评论分析 Prompt
│ ├── suggest.md # 回复建议 Prompt
│ ├── comment.md # 顶级评论生成 Prompt
│ ├── reply.md # 单条回复 Prompt
│ └── replies-batch.md # 批量回复 Prompt
├── scripts/
│ ├── douyin.user.js # 油猴脚本(页面 fetch + 参数随机化)
│ ├── _template.user.js # 新站点油猴模板
│ └── bridge.sh # Bridge Server 生命周期管理
├── tests/ # vitest(182 用例,15 文件)
│ ├── reply-engine/ # ReplyEngine 测试(v4 新增)
│ ├── drafts.test.js # 草稿测试(v4 新增)
│ └── caseConvert.test.js # caseConvert 测试(v4 新增)
├── storage/ # SQLite DB(gitignore)
└── logs/ # 审计日志 + 结果文件(gitignore)
- Node.js 18+
ws— WebSocketbetter-sqlite3— SQLite- Chrome + Tampermonkey + 油猴脚本
- LLM API key(OpenAI 兼容或 Anthropic 原生)
现象:node cli.js my 报错 Bridge Server 未启动 或 Request timeout,但 Bridge Server 确实在运行,且 Firefox 浏览器连接正常。
原因:Chrome 的 Private Network Access(PNA)安全策略会阻止公网站点(douyin.com)访问本地地址(127.0.0.1)。油猴脚本通过 GM_xmlhttpRequest 绕过此限制,但需要 Tampermonkey 扩展获得相应权限。
解决步骤:
-
在 Chrome 中打开 Tampermonkey 扩展,确保 "允许访问文件网址" 已开启:
- 打开
chrome://extensions/ - 找到 Tampermonkey → 点击 详情
- 开启 ✅ 允许访问文件网址(Allow access to file URLs)
- 打开
-
确保油猴脚本的
@connect权限已授权:- 打开 Tampermonkey 管理面板 → 找到 "Bridge: Douyin" 脚本
- 切换到 设置 标签 → 用户连接(User connections)
- 确认
127.0.0.1和localhost均为 允许(Allow)
-
刷新
douyin.com页面,打开 F12 → Console,确认看到:[Bridge] ✓ Registered with Bridge Server -
验证连接:
node cli.js my
| 现象 | 可能原因 | 解决 |
|---|---|---|
Unauthorized |
token 不匹配 | 检查 config.json 和油猴脚本中的 token 是否一致 |
抖音返回了 HTML 页面 |
登录态失效 | 刷新 douyin.com 并重新登录 |
Request timeout |
浏览器未打开 douyin.com | 确保已打开并登录抖音 |
| 写操作频繁失败 | 触发风控 | 等待 30 分钟后再试,检查 preflight 状态 |
- 贡献指南、开发环境、代码约定见
CONTRIBUTING.md - 安全策略、漏洞报告、密钥安全、授权边界见
SECURITY.md - 免责声明见
DISCLAIMER.md
MIT