前言¶
在 DeepSeek Harness(dsh)里接飞书,常见做法是 SSH 进机器跑向导,或依赖 dsh 自带的 web 界面完成应用创建与凭据配置。步骤分散在终端和多个界面里,换绑、多机器人并行时还要自己管 env 文件和 systemd 单元。
dsh-feishu-bind 由社区维护者 smallwhitelin 发布,归类为联网工具。插件在本地起一个极小的 HTTP 服务:浏览器打开即出二维码,飞书 App 扫码授权后,凭据写入指定 env 并可选自动重启桥;不依赖 dsh web 表面的 profile 也能跑。下面介绍它的定位、能力与安装用法。
这是什么¶
浏览器扫码绑定飞书机器人 —— 给 dsh 用的小插件。插件自带 node:http 服务(默认 127.0.0.1:3001),inject: [],零 web 依赖。
整体流程可以概括为:
浏览器 ──GET /──► 插件自带 HTTP 服务(默认 127.0.0.1:3001)
│
├─ registerApp ──► 飞书授权页(扫码 → 新建应用 / 更新既有应用)
│
└─ 授权成功 → 写 env 文件 → 重启桥 → 页面绿勾(已接线)
维护仓库:https://github.com/smallwhitelin/dsh-feishu-bind
社区目录页:https://www.skillhub.cn/plugins/smallwhitelin/dsh-feishu-bind
许可证:MIT(README 与 package.json 一致)。当前资料中 package 版本为 0.4.1,运行要求 Node.js >= 24。
核心功能¶
以下能力均来自仓库 README,按使用场景归纳。
网页扫码与状态¶
| 能力 | 说明 |
|---|---|
| 网页扫码 | 打开页面即出二维码,手机或电脑浏览器均可 |
| 绿勾状态 | 扫完后写凭据并重启桥;仅当日志里出现比绑定更新的 long connection ready 才显示绿勾 |
| 刷新换码 | 每次刷新页面开启新一轮授权,旧二维码作废 |
| 点绿勾换码 | 绑定后点击绿勾同样生成新码,扫码即改绑定 |
应用与权限¶
- 复用既有应用:env 或配置里已有
FEISHU_APP_ID时走「更新该应用并重新授权」,机器人身份不变;没有则新建。forceCreate: true可强制每次新建。 - 预置权限:授权页已勾选
im:message、im:message:send_as_bot、im:resource,以及im.message.receive_v1事件、card.action.trigger回调。 - 零重依赖:飞书设备码流程在
lib/register-app.js自实现,不拉@larksuiteoapi/node-sdk,避免 pnpm 构建脚本拦截。
多机器人并行(独立实例)¶
「新建应用」可派生一套完全隔离的实例:独立 DSH_HOME、凭据、systemd 用户服务;插件树、模型配置、记忆、技能各持副本,与现有机器人并行。绑定页只在主实例运行(派生实例 DSH_BIND_ENABLED=0)。页面上可用「用新应用绑定」并指定实例名(默认 feishu2、feishu3 等)。
健壮性¶
缺依赖、端口占用、写文件失败时仅记日志并在页面报错,不会 throw 到插件树。纯逻辑与外部副作用可注入,npm test 无需网络与真实 SDK。
安装与启用¶
安装前请自行审阅仓库源码与 MIT 许可证;插件以当前 dsh 进程权限运行,绑定页能新建飞书应用并把凭据写入本机,等价于本地开通入口。
从 GitHub 安装(推荐)¶
README 给出的直接安装方式:
dsh plugin --profile <你的 profile> add github:smallwhitelin/dsh-feishu-bind
systemctl --user restart dsh-<你的桥>.service # 或你启动 dsh 的其它方式
本地打包安装¶
若需从源码目录安装,README 说明需先 npm pack(会跑测试),再添加生成的 tgz:
cd dsh-feishu-bind
npm pack
dsh plugin --profile <你的 profile> add ./dsh-feishu-bind-<版本>.tgz
systemctl --user restart dsh-<你的桥>.service
启动后,dsh 日志中应出现类似一行:
[feishu-bind] 绑定页已就绪:http://127.0.0.1:3001/
配置¶
默认值可直接用;覆盖项写在 profile 的 cordis.patch.yml 里,按插件 id feishu-bind patch,不要改插件自带的 patch 文件。
- id: feishu-bind
config:
host: '127.0.0.1'
port: 3001
token: 'feishu888' # 务必改成自己的;空串=不需要口令
envFile: '~/.config/dsh-feishu.env'
stateFile: '~/.dsh/feishu-bind-state.json'
serviceUnit: 'dsh-feishu.service'
logFile: ''
appId: ''
appName: 'DSH Agent'
appDesc: 'DeepSeek Harness 飞书机器人'
autoRestart: true
forceCreate: false
要点:
- host / port:默认只监听本机
127.0.0.1:3001。 - token:默认
feishu888,生产环境请改为足够长的随机串;''则关闭口令(页面会警告:任何能访问该 URL 的人都能尝试扫码绑定)。 - envFile:按行更新
FEISHU_APP_ID/FEISHU_APP_SECRET/FEISHU_TENANT,其它键与注释保留,权限600。留空则凭据仅显示在页面上供手动配置。 - serviceUnit:绑定成功后重启的 systemd user 单元;留空不自动重启。
- independentInstances(README 配置表):默认
true,新建应用时派生独立实例;false则覆盖当前实例凭据。
从其它设备访问需自行做端口转发或反向代理;若地址可能被他人访问,必须设置 token,可用 ?k=<token> 打开页面。
典型用法¶
经过上面的安装与重启,按 README 使用流程操作:
- 浏览器打开
http://127.0.0.1:3001/→ 输入访问口令(默认feishu888)→ 页面出现二维码。 - 飞书 App 扫码 → 首次确认应用名并授权;已有应用会提示更新并重新授权。
- 页面显示「已授权,正在写入凭据并重启桥…」,随后变为 ✓ 已绑定,桥已接线。
- 在飞书私聊机器人,消息进入 dsh。
- 换绑:刷新页面或点绿勾 → 新二维码 → 再扫一次。
HTTP 接口(自动化或排查时可参考):
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / |
绑定页 |
| GET | /api/state |
状态 JSON |
| POST | /api/qr |
新开一轮扫码 |
| POST | /api/apply |
手动重写凭据并重启桥 |
| POST | /api/login |
提交口令 |
| GET | /healthz |
存活探针 |
phase 流转:idle → waiting → authorized → applying → bound / error。
适用场景与注意¶
适合谁
- 已在用 dsh + 飞书桥,希望用浏览器完成建应用、写 env、重启,少碰终端向导。
- 需要刷新或点绿勾快速换绑,且希望「已接线」以日志里更新的
long connection ready为准,而不是页面假成功。 - 同一台机器上要多个飞书机器人并行,且接受独立实例下插件树、记忆、技能各一份副本(改配置可能要改多份)。
安全
- 默认仅本机监听;暴露到局域网或公网时必须改
token。 - 未设口令时,扫码者需是其飞书租户管理员,但绑定的应用归其租户控制。
排查(常见现象)
| 现象 | 处理 |
|---|---|
| 页面打不开 | 查 dsh 日志 [feishu-bind];ss -ltnp \| grep <port> 看端口占用 |
| 一直等待扫码 | 二维码约 10 分钟过期,点换码;确认机器能访问飞书 |
| 一直等待桥重启接线 | systemctl --user status <serviceUnit>;日志需有 long connection ready |
Windows 无 systemd 时,仓库 windows/ 目录提供计划任务版流程与隔离审计工具 node windows/verify-iso.js <实例名>,语义与 Linux 侧独立实例一致。
DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。选用插件前请自行核对源码与权限需求。
结尾¶
dsh-feishu-bind 把飞书机器人的绑定收成「打开本机页 → 扫码 → 写 env → 可选重启桥」一条线,并支持换码重绑与多实例隔离。若你的 workflow 以 systemd 用户服务跑 dsh 飞书桥,可按 README 安装并在 cordis.patch.yml 里收紧 token 与路径。