WU079/dsh-douyin-subagent

dsh-douyin-subagent

让子代理在谷时刷抖音、读评论并汇报;附带发作品/回评论的 dy_* 工具(评论从已登录页面带签名直发,不依赖 IM ticket)、每日配额定时,以及设置页「刷抖音」里的控制面板(总开关、自动模式、谷时窗口、每天轮数、报告详细度)。偏 Windows;搜索与评论依赖另装的 douyin-mcp 可执行文件(yunsur/douyin-mcp 的 Release,路径经 dy_config 的 mcpExe 设置)及 Edge/Chromium 登录;回评论需要开了 CDP 端口的已登录浏览器;发作品还需多数账号没有的额外凭据。

Uncategorizeddeepseek-harnessdouyindsh

dsh-douyin-subagent

A "scroll Douyin" plugin for DSH — modeled on
dsh-bili-subagent. At valley hours it sends a subagent to browse
Douyin: search videos, read details, go through the comments, pick what is worth watching, and report back.
The hard part (Douyin APIs, signing, login state) is provided by
yunsur/douyin-mcp — 133 tools over plain HTTP.

English | 中文

What you get

  • 15 tools: 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

  • Valley-time timer: 13:00–15:00 and 19:00–10:00 (next day), weekends count as valley all day.

At the appointed time it hands a trigger to the target session; the agent then runs dy_scan itself. perDay rounds per day, at least gapMin minutes apart.

  • Charter prompts/duty.md (overridable at $DSH_HOME/douyin-duty/duty.md): verify login, search 2–3 keyword

variants, read details and comments, pick at most N, "better nothing than junk", never guess.

  • Reports at $DSH_HOME/douyin-duty/out/.md.

Requirements

piece · what DSH · a profile that can install plugins (this is a bundle plugin, dsh.bundle declared) douyin-mcp-windows-amd64.exe · prebuilt binary from yunsur/douyin-mcp releases — pinned to `v0.1.0`, see Version pinning. The plugin spawns it on :18080; you point mcpExe at it a Chromium-based browser (Edge/Chrome) · only for login + publishing; the plugin drives it over CDP on port 9222 with a dedicated --user-data-dir a Douyin account · log in once through the browser, export cookies, done

Version pinning

The plugin treats douyin-mcp as an external binary, so an upstream change would otherwise break it silently — with an error that looks like anything but "wrong version". It is therefore pinned to the exact build that has been tested:

item · value release · yunsur/douyin-mcp v0.1.0 (2026-10-07) asset · douyin-mcp-windows-amd64.exe size · 38575616 bytes SHA-256 · 0795584ff1343ff3d6c963a23ec2098b96cc9cea7bfd73eac4c33149b9963134 download ·

Before spawning the server (and again after initialize, where serverInfo is available) the plugin hashes the binary and compares it with this table. A mismatch is reported, not swallowed — dy_* tools return:

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 reports the same verdict as mcp.version: {level: ok|warn|error|off, tested, detected, message}.

Two things worth knowing:

  • `serverInfo.version` is not a release number. The upstream binary hardcodes "version": "1.0.0" in

initialize regardless of the tag it was built from, so the real lock is the SHA-256; the version string is only a secondary signal (a changed serverInfo usually means the interface moved too).

  • Only the Windows asset is hashed. On other platforms the check falls back to comparing

serverInfo.version and reports level: "warn" ("unverifiable") rather than claiming a match.

Override with mcpVersionCheck:

value · behaviour strict (default) · different binary ⇒ error; dy_* refuse to run warn · different binary ⇒ logged and shown in dy_status; tools still run off · no check at all (a mismatch will then fail wherever upstream changed)

Re-testing a newer upstream release is a deliberate step: bump TESTED_MCP in lib/mcpVersion.mjs, run a dy_scan + dy_comments round, then update this table.

Install

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

Then restart DSH (or reload the profile) — the dy_* tools show up.

First run

  1. Put douyin-mcp-windows-amd64.exe anywhere and tell the plugin where:
dy_config { "patch": { "mcpExe": "D:/tools/douyin-mcp-windows-amd64.exe" } }

(or set DOUYIN_MCP_EXE in the host environment)

  1. Log in:
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

Because the browser is a dedicated profile, it keeps its login: next time you can just dy_login { "action": "save" } to refresh the cookie file.

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

Config

dy_config reads/writes $DSH_HOME/douyin-duty/config.json.

key · default · meaning enabled · true · plugin on/off autoMode · valley · manual / valley / always noon / night · true · which windows are active perDay / gapMin · 2 / 180 · auto rounds per day / minutes between rounds direction · "" · what to look for keywords · [] · fallback directions perScan · 1 · how many items each round mcpExe · "" · path to douyin-mcp-windows-amd64.exe mcpPort · 18080 · MCP HTTP port mcpToken · generated · bearer token for the local MCP server; random on first run if empty mcpVersionCheck · strict · douyin-mcp version gate: strict / warn / off (see Version pinning) browserPort · 9222 · CDP port of the controlled browser browserProfile · /browser · --user-data-dir of that browser cookieFile · /cookies.txt · where the exported cookie lives targetSession · "" · session to deliver the trigger to; empty = most recent triggerPrompt · built-in · text handed to the session reportLevel · full · full / brief / off

Direct messages

dy_inbox / dy_messages / dy_dm handle the "Messages" tab. They are wrappers, because the upstream MCP is awkward here — all three symptoms verified against v0.1.0:

symptom · cause · what the plugin does conversation list shows no names · list_conversations puts the participant protobuf bytes in name · extracts the sec_uids and resolves nicknames via get_im_user_info get_im_messages returns [] although the chat has messages · broken in v0.1.0 (same with start_im_listen running) · reads through get_conversation_history instead get_conversation_list fails with missing ["to_user_id"] · it is not a list tool, it queries one conversation by uid · never used

// 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

An empty inbox is reported with the three likely reasons (nobody has messaged yet / stale cookie / rate limit 409) instead of a silent "nothing here".

Notifications & @ mentions (0.2.4+)

Plenty of accounts simply have no inbox — no "Messages" tab, nowhere for @ or comment reminders to show up. The notifications API is still there, so dy_notices reads it directly:

group · what you get all (default) · everything comment · comments on your works mention · @ mentions digg · likes follow · new followers danmaku · danmaku

Every item is flattened to *who / what / when / which work / comment_id*, and comment_id can be fed straight back into dy_comment.reply_id to answer in the thread. An empty result is stated as such — an empty mention group says "nobody @'d you recently" instead of looking like a broken tool.

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

Notes & boundaries

  • The MCP server is local-only. The plugin spawns it with a random per-install bearer token bound to 127.0.0.1.
  • Publishing through the MCP tools needs extra TICKET/TS_SIGN/PRIVATE_KEY material that most accounts cannot

mint; in practice publishing goes through the creator web UI (the CDP helpers live in vendor/douyin-tools/). Two gotchas: ① the top of the page only has the tabs (video / image / panorama / article) and "上传视频"/"上传图文" buttons — before any material is uploaded there simply is no "发布" button in the DOM (verified: it is absent from querySelectorAll('button')), so looking for it first finds nothing; ② the drop zones are plain input[type=file] elements (accept=video/* for video, accept=image/... for images), so DOM.setFileInputFiles is far more reliable than synthesising clicks.

  • `check_login_status` lies. Judge login state by get_my_profile returning status_code === 0

(dy_status does this for you).

  • Cookies expire; refresh with dy_login { action: "save" } while the controlled browser is still logged in.
  • Young accounts are rate-limited. Comment/publish in small amounts and spaced out.
  • Nothing here is affiliated with Douyin/ByteDance. Use it for personal browsing; respect their terms and other

people's privacy. Read other people's comments, don't mass-harvest them.

License

MIT — see 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,周末整天算谷时;到点往目标会话递一句话,

agent 自己用 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 下载 ·