dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
让子代理在谷时刷抖音、读评论并汇报;附带发作品/回评论的 dy_* 工具(评论从已登录页面带签名直发,不依赖 IM ticket)、每日配额定时,以及设置页「刷抖音」里的控制面板(总开关、自动模式、谷时窗口、每天轮数、报告详细度)。偏 Windows;搜索与评论依赖另装的 douyin-mcp 可执行文件(yunsur/douyin-mcp 的 Release,路径经 dy_config 的 mcpExe 设置)及 Edge/Chromium 登录;回评论需要开了 CDP 端口的已登录浏览器;发作品还需多数账号没有的额外凭据。
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 | 中文
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
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.
prompts/duty.md (overridable at $DSH_HOME/douyin-duty/duty.md): verify login, search 2–3 keywordvariants, read details and comments, pick at most N, "better nothing than junk", never guess.
$DSH_HOME/douyin-duty/out/.md.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
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:
"version": "1.0.0" ininitialize 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).
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.
dsh plugin --profile <your-profile> add github:WU079/dsh-douyin-subagentThen restart DSH (or reload the profile) — the dy_* tools show up.
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)
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 nicknameBecause the browser is a dedicated profile, it keeps its login: next time you can just dy_login { "action": "save" } to refresh the cookie file.
dy_scan { "direction": "本地语音克隆 踩坑", "n": 1 }
dy_search { "keyword": "..." }
dy_video { "aweme_id": "..." }
dy_comments { "aweme_id": "...", "count": 30 }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
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 itAn empty inbox is reported with the three likely reasons (nobody has messaged yet / stale cookie / rate limit 409) instead of a silent "nothing here".
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?127.0.0.1.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.
get_my_profile returning status_code === 0(dy_status does this for you).
dy_login { action: "save" } while the controlled browser is still logged in.people's privacy. Read other people's comments, don't mass-harvest them.
MIT — see LICENSE.
给 DSH 的「刷抖音」插件,照着 dsh-bili-subagent 做的。
谷时到点派子代理去抖音:搜视频、看详情、翻评论、挑出值得看的,回来汇报。
能力来自 yunsur/douyin-mcp(133 个工具,纯 HTTP)。
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
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 下载 ·