🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

抖音巡览子代理 WU079/dsh-douyin-subagent

DeepSeek Harness
WU0799 天前有提交已提供中文文档扫描:含敏感能力

给 DSH 用的「刷抖音」插件,参照

31.4/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add WU079/dsh-douyin-subagent
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · tool
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 38 条)
  • 写入本地文件
    index.js:100
    mkdirSync(toolsDir, { recursive: true })
  • 写入本地文件
    index.js:101
    mkdirSync(outDir, { recursive: true })
  • 写入本地文件
    index.js:104
    try { appendFileSync(logFile, `[${new Date().toISOString()}] ${m}\n`, 'utf8') } catch { }
  • 读取本地文件
    index.js:116
    if (!existsSync(from)) return
  • 读取本地文件
    index.js:117
    if (existsSync(to) && readFileSync(from, 'utf8') === readFileSync(to, 'utf8')) return
  • 读取本地文件
    index.js:117
    if (existsSync(to) && readFileSync(from, 'utf8') === readFileSync(to, 'utf8')) return
  • 写入本地文件
    index.js:118
    copyFileSync(from, to)
  • 读取本地文件
    index.js:124
    for (const f of readdirSync(src)) copyInto(join(src, f), join(toolsDir, f))
  • 读取本地文件
    index.js:126
    if (!existsSync(dutyHome)) copyInto(join(pluginDir, 'prompts', 'duty.md'), dutyHome)
  • 读取本地文件
    index.js:175
    if (runtime.exe && existsSync(runtime.exe)) {
  • 写入本地文件
    index.js:618
    appendFileSync(file, `\n\n---\n# ${dayKey(now())} · ${dir}(${perScan} 条)\n\n${output}\n`, 'utf8')
  • 发起网络请求
    client.js:25
    const jget = async (p) => asJson(await fetch(API + p, { credentials: 'same-origin' }))
  • 发起网络请求
    client.js:26
    const jpost = async (p, body) => asJson(await fetch(API + p, {
  • 读取本地文件
    lib/hostdeps.mjs:40
    for (const n of readdirSync(join(npm, '@deepseek-ai'))) {
  • 读取本地文件
    lib/hostdeps.mjs:53
    for (const p of readdirSync(join(dshHome, 'profiles'))) {
  • 读取本地文件
    lib/hostdeps.mjs:68
    if (!existsSync(pkgFile)) return null
  • 读取本地文件
    lib/hostdeps.mjs:69
    const pkg = JSON.parse(readFileSync(pkgFile, 'utf8'))
  • 读取本地文件
    lib/hostdeps.mjs:76
    return existsSync(file) ? pathToFileURL(file).href : null
  • 发起网络请求
    lib/mcpHttp.mjs:33
    const res = await fetch(this.url, { method: 'POST', headers: this.#headers(), body: JSON.stringify(body) })
  • 发起网络请求
    lib/mcpHttp.mjs:72
    const res = await fetch(this.url, {
  • 发起网络请求
    lib/webComment.mjs:24
    const res = await fetch(`http://127.0.0.1:${port}/json/list`, { signal: ctl.signal })
  • 写入本地文件
    lib/state.mjs:31
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    lib/state.mjs:36
    try { return JSON.parse(readFileSync(file, 'utf8')) } catch { return fallback }
  • 写入本地文件
    lib/state.mjs:40
    writeFileSync(file, JSON.stringify(value, null, 2), 'utf8')
  • 写入本地文件
    lib/douyin.mjs:23
    mkdirSync(dirname(logFile), { recursive: true })
  • 执行外部命令来自配置/变量
    lib/douyin.mjs:25
    const child = spawn(command, args, {
  • 发起网络请求
    lib/douyin.mjs:41
    const res = await fetch(url, { signal: ac.signal })
  • 读取本地文件
    lib/douyin.mjs:72
    if (!existsSync(exe)) return { ok: false, started: false, error: '找不到 douyin-mcp 可执行文件:' + exe }
  • 写入本地文件
    lib/douyin.mjs:75
    mkdirSync(stateDir, { recursive: true })
  • 读取本地文件
    lib/douyin.mjs:94
    ].find((p) => existsSync(p))
  • 写入本地文件
    lib/douyin.mjs:96
    mkdirSync(profileDir, { recursive: true })
  • 读取本地文件
    lib/douyin.mjs:114
    if (!existsSync(script)) return { ok: false, error: '缺工具脚本:' + script }
  • 执行外部命令来自配置/变量
    lib/douyin.mjs:117
    const child = spawn(process.execPath, [script, port], { windowsHide: true })
  • 写入本地文件
    lib/douyin.mjs:125
    mkdirSync(dirname(cookieFile), { recursive: true })
  • 写入本地文件
    lib/douyin.mjs:126
    writeFileSync(cookieFile, line, 'utf8')
  • 读取本地文件
    lib/mcpVersion.mjs:53
    try { st = statSync(file) } catch { return null }
  • 读取本地文件
    lib/mcpVersion.mjs:59
    const s = createReadStream(file)
  • 读取本地文件
    lib/mcpVersion.mjs:148
    try { stat = statSync(exe) } catch { }
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 的抖音刷屏器:一个摸鱼时段的子代理,刷抖音、看评论、回来汇报,外加 dy_* 工具和摸鱼计时器。

README

由 DeepSeek 最新模型翻译生成
dsh-douyin-subagent 给 DSH 用的「刷抖音」插件,参照 dsh-bili-subagent 做的。到了低谷时段,它会派一个子代理去逛抖音:搜视频、看详情、翻评论,挑出值得看的,再回来汇报。 难啃的部分(抖音 API、签名、登录态)交给 yunsur/douyin-mcp —— 133 个工具,走纯 HTTP。 你能得到什么 - 15 个工具:dy_status / dy_config / dy_login / dy_search / dy_video / dy_comments / dy_comment / dy_publish / dy_notices / dy_inbox / dy_messages / dy_dm / dy_scan / dy_tools / dy_mcp - 低谷时段定时器:13:00–15:00 和 19:00–10:00(次日),周末全天算低谷。 到点后它给目标会话递一个触发信号,智能体自己跑 dy_scan。 perDay 是每天轮数,两轮之间至少隔 gapMin 分钟。 - 职责书 prompts/duty.md(可在 $DSH_HOME/douyin-duty/duty.md 覆盖):先确认登录,再搜 2–3 个关键词变体,看详情和评论,最多挑 N 条,「宁缺毋滥」,绝不瞎猜。
展开完整文档(README 剩余 1 节)
dsh-douyin-subagent

给 DSH 用的「刷抖音」插件,参照 dsh-bili-subagent 做的。到了低谷时段,它会派一个子代理去逛抖音:搜视频、看详情、翻评论,挑出值得看的,再回来汇报。
难啃的部分(抖音 API、签名、登录态)交给 yunsur/douyin-mcp —— 133 个工具,走纯 HTTP。

你能得到什么

- 15 个工具:dy_status / dy_config / dy_login / dy_search / dy_video / dy_comments / dy_comment / dy_publish / dy_notices / dy_inbox / dy_messages / dy_dm / dy_scan / dy_tools / dy_mcp
- 低谷时段定时器:13:00–15:00 和 19:00–10:00(次日),周末全天算低谷。
到点后它给目标会话递一个触发信号,智能体自己跑 dy_scan。
perDay 是每天轮数,两轮之间至少隔 gapMin 分钟。
- 职责书 prompts/duty.md(可在 $DSH_HOME/douyin-duty/duty.md 覆盖):先确认登录,再搜 2–3 个关键词变体,看详情和评论,最多挑 N 条,「宁缺毋滥」,绝不瞎猜。
- 报告写在 $DSH_HOME/douyin-duty/out/<date>.md。

环境要求

| 部件 | 说明 |
| DSH | 一个能装插件的配置档(这是 bundle 插件,已声明 dsh.bundle) |
| douyin-mcp-windows-amd64.exe | 从 yunsur/douyin-mcp releases 下的预编译二进制 —— 锁定 v0.1.0,见版本锁定。插件会在 :18080 上把它拉起来;你把 mcpExe 指向它 |
| 基于 Chromium 的浏览器(Edge/Chrome) | 只用于登录和发布;插件通过 CDP 在 9222 端口驱动它,用独立的 --user-data-dir |
| 抖音账号 | 在浏览器里登录一次,导出 cookie,搞定 |

版本锁定

插件把 douyin-mcp 当外部二进制用,上游一改就可能悄悄把它弄坏 —— 报出来的错看起来跟「版本不对」毫无关系。
所以它锁死在测过的那个构建上:

| 项 | 值 |
| release | yunsur/douyin-mcp v0.1.0(2026-10-07) |
| asset | douyin-mcp-windows-amd64.exe |
| 大小 | 38575616 字节 |
| SHA-256 | 0795584ff1343ff3d6c963a23ec2098b96cc9cea7bfd73eac4c33149b9963134 |
| 下载 | <https://github.com/yunsur/douyin-mcp/releases/download/v0.1.0/douyin-mcp-windows-amd64.exe> |

拉起服务之前(以及 initialize 之后、能拿到 serverInfo 时再算一次),插件会对二进制做哈希,跟这张表比对。
对不上就报出来,不吞掉 —— dy_ 工具会返回:

douyin-mcp 不是测试过的那个构建:测试过的是 yunsur/douyin-mcp v0.1.0(douyin-mcp-windows-amd64.exe, sha256 0795584ff134…,38575616 字节);你这个是 sha256 22e3dbef2237…、17156096 字节,
serverInfo.version=1.0.0(…\douyin-login-windows-amd64.exe)。版本号碰巧一样,但二进制不同。
改法:从 https://github.com/yunsur/douyin-mcp/releases/download/v0.1.0/douyin-mcp-windows-amd64.exe 下回测试过的那个 exe;或者把 mcpVersionCheck 设成 "warn"(只警告、照常用)/"off"(完全不检查)。

dy_status 报告的结论和 mcp.version 一样:{level: ok|warn|error|off, tested, detected, message}。

有两点值得知道:

- serverInfo.version 不是发布版本号。 上游二进制在 initialize 里硬编码了 "version": "1.0.0",不管它是从哪个 tag 构建的,所以真正的锁定依据是 SHA-256;版本字符串只是次要信号(serverInfo 变了,通常意味着接口也变了)。
- 只有 Windows 资产做了哈希。 其他平台上,检查会退回到比较 serverInfo.version,报告 level: "warn"(「无法验证」),而不是声称匹配。

用 mcpVersionCheck 覆盖:

| 值 | 行为 |
| strict(默认) | 二进制不同 ⇒ 报错;dy_ 拒绝运行 |
| warn | 二进制不同 ⇒ 记日志并在 dy_status 里显示;工具照常运行 |
| off | 完全不检查(这样一来,上游改过的地方就会失败) |

重新测试更新的上游版本是有意为之的一步:改 lib/mcpVersion.mjs 里的 TESTED_MCP,跑一轮 dy_scan + dy_comments,然后更新这张表。

安装

dsh plugin --profile <your-profile> add github:WU079/dsh-douyin-subagent

然后重启 DSH(或重新加载配置档)——dy_ 工具就出现了。

首次运行

1. 把 douyin-mcp-windows-amd64.exe 放到任意位置,告诉插件它在哪:

dy_config { "patch": { "mcpExe": "D:/tools/douyin-mcp-windows-amd64.exe" } }

(或在宿主环境里设 DOUYIN_MCP_EXE)

2. 登录:

dy_login { "action": "open" } # opens a controlled Edge window at douyin.com
scan the official QR code with the Douyin app
dy_login { "action": "save" } # exports cookies from the browser over CDP
dy_status # should now show your nickname

因为浏览器用的是专用配置档,登录状态会保留:下次直接
dy_login { "action": "save" } 刷新 cookie 文件就行。

3. 用起来:

dy_scan { "direction": "本地语音克隆 踩坑", "n": 1 }
dy_search { "keyword": "..." }
dy_video { "aweme_id": "..." }
dy_comments { "aweme_id": "...", "count": 30 }

配置

dy_config 读写 $DSH_HOME/douyin-duty/config.json。

| 键 | 默认值 | 含义 |
| enabled | true | 插件开/关 |
| autoMode | valley | manual / valley / always |
| noon / night | true | 哪些时段生效 |
| perDay / gapMin | 2 / 180 | 每天自动轮数 / 轮与轮之间的分钟数 |
| direction | "" | 找什么 |
| keywords | [] | 备选方向 |
| perScan | 1 | 每轮几条 |
| mcpExe | "" | douyin-mcp-windows-amd64.exe 的路径 |
| mcpPort | 18080 | MCP HTTP 端口 |
| mcpToken | 自动生成 | 本地 MCP 服务器的 bearer token;留空时首次运行随机生成 |
| mcpVersionCheck | strict | douyin-mcp 版本校验:strict / warn / off(见版本锁定) |
| browserPort | 9222 | 受控浏览器的 CDP 端口 |
| browserProfile | <home>/browser | 该浏览器的 --user-data-dir |
| cookieFile | <home>/cookies.txt | 导出的 cookie 存放位置 |
| targetSession | "" | 接收触发信号的会话;留空 = 最近一个 |
| triggerPrompt | 内置 | 交给会话的文本 |
| reportLevel | full | full / brief / off |

私信

dy_inbox / dy_messages / dy_dm 负责「消息」标签页。它们都是包装层,因为上游 MCP 在这里不太好用——以下三个症状都已在 v0.1.0 上验证:

| 症状 | 原因 | 插件怎么处理 |
| 会话列表不显示名字 | list_conversations 把参与者的 protobuf 字节塞进了 name | 提取 sec_uid,再用 get_im_user_info 解析昵称 |
| 聊天明明有消息,get_im_messages 却返回 [] | v0.1.0 的 bug(开着 start_im_listen 也一样) | 改从 get_conversation_history 读取 |
| get_conversation_list 报 missing ["to_user_id"] | 它不是列表工具,而是按 uid 查询单个会话 | 从不使用 |

// who wrote last, when, private or group
{ "type": 0, "limit": 20 } // dy_inbox
// by id (0:1:a:b) or by nickname fragment
{ "conversation": "some nickname", "count": 30 } // dy_messages
{ "to": "some nickname", "content": "..." } // dy_dm — a write; only when you mean it

收件箱为空时,会列出三种可能原因(还没人给你发消息 / cookie 过期 / 触发限流 409),而不是默默回一句「这里什么都没有」。

通知与 @ 提及(0.2.4+)

很多账号根本没有收件箱——没有「消息」标签页,@ 和评论提醒无处显示。通知 API 仍然可用,所以 dy_notices 直接读它:

| group | 拿到什么 |
| all(默认) | 全部 |
| comment | 你作品下的评论 |
| mention | @ 提及 |
| digg | 点赞 |
| follow | 新粉丝 |
| danmaku | 弹幕 |

每条都摊平成谁 / 说了什么 / 什么时候 / 哪条作品 / comment_id,comment_id 可以直接回填到 dy_comment.reply_id,在原帖里回复。结果为空会明确说明——mention 组为空时提示「最近没人 @ 你」,而不是看起来像工具坏了。

{ "group": "comment", "limit": 20 } // dy_notices: new comments
{ "group": "mention", "unread_only": true } // did anyone @ me?

说明与边界

- MCP 服务器只在本机运行。 插件启动它时,会生成一个随机 bearer token,每次安装都不同,并绑定到 127.0.0.1。
- 发布通过 MCP 工具进行时,需要额外的 TICKET/TS_SIGN/PRIVATE_KEY 材料,多数账号无法 mint;实际发布走创作者网页端 <https://creator.douyin.com/creator-micro/content/upload>(CDP 辅助脚本在 vendor/douyin-tools/)。
两个坑:① 页面顶部只有标签页(视频 / 图文 / 全景 / 文章)和「上传视频」「上传图文」按钮 —— 上传任何素材之前,DOM 里根本没有「发布」按钮
(已验证:querySelectorAll('button') 里找不到它),所以一上来就找它只会扑空;② 拖拽区就是普通的
input[type=file] 元素
(视频用 accept=video/,图片用 accept=image/...),所以 DOM.setFileInputFiles 比模拟点击可靠得多。
- check_login_status 会骗你。 判断登录状态要看 get_my_profile 是否返回 status_code === 0 (dy_status 已经帮你做了这件事)。
- Cookie 会过期;趁受控浏览器还处于登录状态,用 dy_login { action: "save" } 刷新。
- 新账号有频率限制。 评论和发布都要少量、间隔着来。
- 本项目与抖音 / 字节跳动没有任何关联。请用于个人浏览;遵守对方条款,尊重他人隐私。可以看别人的评论,别批量抓取。

许可证

MIT —— 见 LICENSE。

给 DSH 的「刷抖音」插件,照着 dsh-bili-subagent 做的。
谷时到点派子代理去抖音:搜视频、看详情、翻评论、挑出值得看的,回来汇报。
能力来自 yunsur/douyin-mcp(133 个工具,纯 HTTP)。

有什么

- 15 个工具:dy_status / dy_config / dy_login / dy_search / dy_video / dy_comments / dy_comment / dy_publish / dy_notices / dy_inbox / dy_messages / dy_dm / dy_scan / dy_tools / dy_mcp
- 谷时定时器:中午 13:00–15:00、夜里 19:00–次日 10:00,周末整天算谷时;到点往目标会话递一句话,智能体自己用 dy_scan 刷。每天 perDay 轮,两轮至少隔 gapMin 分钟。
- 值班章程:prompts/duty.md(家里 $DSH_HOME/douyin-duty/duty.md 优先,可自己改)。
- 报告:$DSH_HOME/douyin-duty/out/<日期>.md。

依赖

| 件 | 说明 |
| DSH | 能装插件(本插件声明了 dsh.bundle) |
| douyin-mcp-windows-amd64.exe | yunsur/douyin-mcp releases 的预编译版,锁在 v0.1.0(见下面「版本锁定」);插件会在 :18080 拉起它,路径用 mcpExe 配 |
| Chromium 系浏览器(Edge/Chrome) | 只用来登录和发布;插件用独立的 --user-data-dir 通过 CDP 驱动它 |
| 抖音账号 | 在受控浏览器里扫一次码,导出 cookie 即可 |

版本锁定

douyin-mcp 是外部可执行文件,上游一改接口,这边就会坏 —— 而且报出来的错看着像别的问题。
所以插件把它锁死在实际测过的那个构建上:

| 项 | 值 |
| release | yunsur/douyin-mcp v0.1.0(2026-10-07) |
| 资产 | douyin-mcp-windows-amd64.exe |
| 大小 | 38575616 字节 |
| SHA-256 | 0795584ff1343ff3d6c963a23ec2098b96cc9cea7bfd73eac4c33149b9963134 |
| 下载 | <https://github.com/yunsur/douyin-mcp/releases/download/v0.1.0/douyin-mcp-windows-amd64.exe> |

起了服务之前先算一遍 exe 的哈希对上表;连上之后再用 serverInfo 复核一遍。对不上就明确报错(dy_ 工具直接把这段话抛出来):

douyin-mcp 不是测试过的那个构建:测试过的是 yunsur/douyin-mcp v0.1.0(douyin-mcp-windows-amd64.exe, sha256 0795584ff134…,38575616 字节);你手上这个是 sha256 22e3dbef2237…、17156096 字节,
serverInfo.version=1.0.0(…\douyin-login-windows-amd64.exe)。版本号碰巧一样,但二进制不同。
改法:从 https://github.com/yunsur/douyin-mcp/releases/download/v0.1.0/douyin-mcp-windows-amd64.exe 下回测试过的那个 exe;或者把 mcpVersionCheck 设成 "warn"(只警告、照常用)/"off"(完全不检查)。

dy_status 的 mcp.version 里能看到同一份结论:{level: ok|warn|error|off, tested, detected, message}。

两个容易踩的点:

- serverInfo.version 不是版本号:上游二进制在 initialize 里把 "version" 写死成 "1.0.0",跟它从哪个 tag 编出来无关 —— 所以真正的锁是 SHA-256,版本号只是辅助信号(接口变了它通常会跟着变)。
- 只锁 Windows 资产的哈希。其它平台上退化成只比 serverInfo.version,结论给 level: "warn"(「没法核实」),不会假装对上。

想放行用 mcpVersionCheck:

| 值 | 行为 |
| strict(默认) | 二进制对不上就报错,dy_ 不干活 |
| warn | 对不上只记日志 + 在 dy_status 里显示,工具照常用 |
| off | 完全不检查(那就只能等上游改动时自己面对报错) |

真要升级到新版:改 lib/mcpVersion.mjs 里的 TESTED_MCP,跑一轮 dy_scan + dy_comments 验一遍,再更新这张表。

安装

dsh plugin --profile <你的 profile> add github:WU079/dsh-douyin-subagent

重启 DSH,工具里就会出现 dy_。

第一次用

1. 把 douyin-mcp-windows-amd64.exe 放好,告诉插件位置:

dy_config { "patch": { "mcpExe": "D:/tools/douyin-mcp-windows-amd64.exe" } }

(或在宿主环境变量里设 DOUYIN_MCP_EXE)

2. 登录:

dy_login { "action": "open" } # 起一个受控 Edge 打开 douyin.com
用手机抖音扫官方二维码登录
dy_login { "action": "save" } # 通过 CDP 把 cookie 导出来
dy_status # 这时应该能看到昵称

3. 用起来:

dy_scan { "direction": "本地语音克隆 踩坑", "n": 1 }
dy_search { "keyword": "..." }
dy_video { "aweme_id": "..." }
dy_comments { "aweme_id": "...", "count": 30 }

配置

dy_config 读写 $DSH_HOME/douyin-duty/config.json,字段见上方英文表格(同一张表)。
其中 mcpVersionCheck 管 douyin-mcp 的版本闸(strict / warn / off,默认 strict,见「版本锁定」)。

私信(0.2.3 起)

dy_inbox / dy_messages / dy_dm 管「消息」tab。之所以要包一层,是因为底层 MCP 在私信这块很别扭(下面三条都是对着 v0.1.0 实测的):

| 症状 | 原因 | 插件怎么绕 |
| 会话列表里连名字都没有 | list_conversations 的 name 字段放的是参与者 protobuf 原始字节(JSON 里就是乱码) | 从字节里抠出 sec_uid,再用 get_im_user_info 换昵称 |
| 会话里明明有消息,get_im_messages 却返回 [] | v0.1.0 上就是坏的(开着 start_im_listen 也一样) | 改走 get_conversation_history |
| get_conversation_list 报 missing ["to_user_id"] | 它不是「列表」工具,是按 uid 查单个会话 | 不用它 |

{ "type": 0, "limit": 20 } // dy_inbox:最后一条谁说的、时间、私聊/群聊 { "conversation": "某个昵称", "count": 30 } // dy_messages:会话 id(0:1:a:b)或昵称片段都行 { "to": "某个昵称", "content": "..." } // dy_dm:写操作,只在明确要发的时候用

会话列表为空时不会糊一句「没有」,而是把三种常见原因写出来:还没人私信过 / cookie 过期 / 被限流(409)。

通知 / @(0.2.4 起)

很多号压根没有收件箱 —— 网页版没有「消息」tab,@ 和评论提醒没地方露头。但通知接口是在的, dy_notices 直接读:

| group | 读到什么 |
| all(默认) | 全部 |
| comment | 作品下的新评论 |
| mention | @我的 |
| digg | 点赞 |
| follow | 新粉丝 |
| danmaku | 弹幕 |

每条都拍平成「谁 / 说了什么 / 什么时候 / 哪个作品 / comment_id」,comment_id 可以直接当 dy_comment 的 reply_id 用来回楼中楼。空结果会明说 —— mention 空的时候直接告诉你「最近没人 @ 你」,不会看着像个坏掉的工具。

{ "group": "comment", "limit": 20 } // dy_notices:有没有新评论 { "group": "mention", "unread_only": true } // 有没有人 @ 我

注意与边界

- MCP 只监听本机:插件启动它时用每次安装随机生成的 Bearer token,绑在 127.0.0.1。
- 发布:MCP 的发布工具需要 TICKET/TS_SIGN/PRIVATE_KEY 这类材料,多数账号拿不到;实际发布走创作者中心网页 <https://creator.douyin.com/creator-micro/content/upload>,vendor/douyin-tools/ 里有配套的 CDP 脚本。
两个容易踩的点:① 页面顶部只有「发布视频 / 发布图文 / 发布全景视频 / 发布文章」四个 tab 和「上传视频 / 上传图文」按钮,素材上传之前整页根本没有「发布」按钮(实测 querySelectorAll('button') 里就没有它,只有最外层导航里的「作品发布」),选文件之前去找它当然找不到;② 素材框是
input[type=file](视频框 accept=video/、图文框 accept=image/...),用 DOM 的
setFileInputFiles 塞文件比模拟点击可靠。

- check_login_status 会误报:判断登录看 get_my_profile 的 status_code === 0(dy_status 已经替你处理)。
- cookie 会过期:受控浏览器还登着的时候,dy_login { action: "save" } 重新导一次。
- 新号风控严:评论、发布小量、隔开。
- 与抖音/字节跳动无关;个人使用,遵守对方条款、尊重别人隐私。看评论可以,别批量抓。

许可

MIT,见 LICENSE。

设置里的控制面板(0.1.1 起)

装好之后,进 设置 → 刷抖音,可以改:

- 总开关(关掉后定时器不动,dy_ 工具和手动 /刷 还能用)
- 自动模式:只手动 / 只在谷时 / 全天;中午、晚上两个谷时开关
- 每天最多刷几轮、两轮之间至少隔多少分钟、每轮挑几条
- 方向、关键词候选、报告里对你的称呼、报告详细程度
- 底部一行状态:今天第几轮、MCP 在不在线、登录态、上次刷的时间、最近一份报告

面板走插件自己挂的 /api/douyin-duty/ 路由读写 $DSH_HOME/douyin-duty/config.json,和 dy_config 工具改的是同一份。浏览器半端 client.js 的约定抄自 dsh-bili-subagent(window.__ModuleLoader__.load + slots.inject('settings.section'))。

评论/回复:页面签名直发(0.2.0 起)

MCP 的 post_video_comment 要 ticket/ts_sign(IM 会话签名),纯 cookie 登录拿不到,所以 dy_comment 会先走一条更简单的路:

1. 你有一个已登录 douyin.com 的 Chromium/Edge,开着远程调试端口(cdpPort,默认 9333): "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9333 ^ --user-data-dir=F:\douyin-browser https://www.douyin.com/

(用着刷视频的窗口也行,只要带 --remote-debugging-port)
2. 插件连上 CDP,在页面上下文里调 window.byted_acrawler.frontierSign 生成 X-Bogus,再用页面自己的 fetch 发 POST /aweme/v1/web/comment/publish。cookie、指纹、签名都是真的,等同网页自己发评论。
3. 实测:连续 5 条回复(含楼中楼 reply_id)全部 HTTP 200、返回 cid,没有触发滑块/短信验证;
dy_comment { "aweme_id": "...", "content": "...", "reply_id": "..." } 的返回里 via 会是 page。
4. 页面不在(CDP 连不上)时自动退回 MCP——那条路通常仍会失败,但不会让工具直接崩。

只用最小参数(device_platform / aid / aweme_id / reply_id + X-Bogus)即可,不需要 msToken、verifyFp 那些模板参数;真遇到风控(返回非 200 或需要验证),工具会把响应片段抛出来,这会儿应该停下来人工处理,别硬重试。
预览分享卡片长什么样 ↓WU079/dsh-douyin-subagent
分享 · DeepSeek Harness Hub
WU079/dsh-douyin-subagent

给 DSH 用的「刷抖音」插件,参照

这是你的仓库?认领条目

回到顶部