前言¶
DeepSeek Harness(DSH)通常跑在本机。人离开电脑后,很难从手机直接给本地会话发指令,也很难把这一轮的结果收回到常用 IM。常见做法是公网回调或内网穿透,把 IM 事件打进本机服务,部署和维护成本都不低。
下面介绍社区插件 dsh-feishu-bridge(维护者 erty3244,分类:联网工具)。它走飞书自建应用的长连接,不需要公网 IP、内网穿透或回调地址;飞书消息进指定 DSH 会话,该轮最终回复自动回到同一条私聊或群。
这是什么¶
dsh-feishu-bridge 是 DSH 插件:在宿主进程里与飞书开放平台建立 WebSocket 长连接,实现「飞书 ↔ 本地 DSH 会话」的双向桥接。实现上零第三方 npm 依赖,仅用 Node 内置模块,自行完成飞书长连接的帧编解码。
自触发(自由时间 / 预约任务)已拆到独立项目 dsh-self-trigger;本仓库只做飞书桥接:入站投递与出站回帖。
核心功能¶
入站与出站¶
- 入站:飞书消息投递到配置的 DSH 会话;文字与图片一并带上,投递请求携带飞书
message_id。 - 出站:该会话这一轮的最终回复发回触发消息所在的私聊或群。
并发与去重¶
- 不串线:每一轮与触发它的消息用
rpcId配对,并发时不会把 A 的回答回给 B。 - 不重复:在
stateDir中记录message_id;重连后补送的旧消息不会执行两遍;延迟送达会标注「晚了 N 分钟」。
会话绑定¶
目标会话写在 bindingFile 里,只有一行;改完后下一轮生效,无需重启插件。也可在配置里写 sessionId,bindingFile 优先生效。
默认行为¶
自动回帖默认开启(仅当显式设置 autoReply: false 时关闭);回执文案 ackText 默认为「已收到」;dryRun 默认关闭。
安装与启用¶
本地目录安装(README 原文命令):
dsh plugin --profile desktop add ./dsh-feishu-bridge
也可以在 DSH 桌面端 设置 → 插件 中从社区目录安装。装完后重启一次宿主——插件在宿主进程里启动长连接。
社区目录页:https://www.skillhub.cn/plugins/erty3244/dsh-feishu-bridge
源码:https://github.com/erty3244/dsh-feishu-bridge
飞书侧准备(一次性)¶
- 打开 飞书开放平台,创建企业自建应用。
- 在「凭证与基础信息」获取 App ID / App Secret。
- 「添加应用能力」中启用机器人。
- 「权限管理」至少授予:
-im:message(读取用户发给机器人的消息)
-im:message:send_as_bot(以机器人身份发消息)
- 若需下载图片/文件,再加im:resource - 「事件与回调」→ 订阅方式选 使用长连接接收事件 → 添加事件
im.message.receive_v1。 - 「版本管理与发布」创建版本并发布(企业内自建应用通常可自行审核)。
- 将机器人拉入目标群,或直接私聊机器人。
配置¶
插件配置通过 profile 的 cordis.patch.yml 写入;凭据单独放在 JSON 文件中(不写入插件配置,避免随插件备份/导出泄露):
- insert:
- id: dsh-feishu-bridge
name: 'dsh-feishu-bridge'
config:
configPath: 'C:\Users\you\.dsh\feishu-config.json'
bindingFile: 'C:\Users\you\.dsh\feishu-target-session.txt'
stateDir: 'C:\Users\you\.dsh\feishu-bridge'
feishu-config.json 示例:
{
"appId": "cli_xxx",
"appSecret": "xxx",
"allowOpenIds": ["ou_xxx"],
"allowChatIds": ["oc_xxx"],
"note": "allowOpenIds / allowChatIds 是白名单;留空 = 谁都不放行"
}
要点:
bindingFile单行内容为要投递的目标会话 id(形如session-xxxx)。- 白名单留空表示谁都不放行,不是放行所有人。
- 可不写明文密钥:配置
appSecretRef,配合 DSH 凭证机制(ctx.credentials.resolve),配置文件中只保留引用名。
宿主权限与安全¶
插件声明的能力范围(市场审查口径)如下:
| 能力 | 用途 |
|---|---|
network |
仅连接 open.feishu.cn(长连接 WSS + 发消息/取资源 HTTPS) |
fs-read |
读 configPath、bindingFile |
fs-write |
仅写 stateDir 下的状态、日志、心跳 |
host-runtime |
sessionController.prompt 投递消息 |
credentials(可选) |
仅在配置 appSecretRef 时读取具名凭证 |
不做的事:不开子进程、不执行 shell、不扫描磁盘、不读凭据文件以外路径、不上报遥测。
兼容性与已知限制¶
- 测于 DSH
0.2.1-rc.2(desktop profile),Node ≥ 22。 - 依赖宿主接口:
ctx.sessionController.prompt、ctx.on('session/event')、ctx.credentials.resolve;DSH 内部接口可能变化,升级后先看stateDir下日志。 - 投递时目标会话必须在侧栏打开过一次(会话需「活着」),否则会报错。
- 若目标会话历史含损坏数据(例如模型接口直接 400),新轮次可能持续失败——换新会话并改
bindingFile即可。 - 群消息不做 @ 过滤:白名单内会话的每条消息都会触发一轮;成员多的群建议只把私聊
chat_id放进allowChatIds。
适用场景与安装前注意¶
适合需要在手机飞书里与本机 DSH 往返、且不想维护公网回调或穿透的场景。插件以当前 DSH 进程权限运行,安装前应阅读源码与 MIT 许可证,确认白名单与凭据路径符合你的安全要求。
结尾¶
经过上面的步骤,飞书可作为本地 DSH 的输入输出口:长连接入站、按轮次回帖、白名单与 rpcId 控制并发与权限。更多信息见社区目录 dsh-feishu-bridge 与 GitHub 仓库 erty3244/dsh-feishu-bridge。