最近 dot 的对话额度比较宽松,我也想把它更多地用进日常工作流(多白嫖点token),就想着把它装进飞书和QQ里(之前用openclaw感觉这俩的机器人是最好用的了)。
DotBridge 负责收消息、保存消息和发送回复;理解与回答由 dot 完成。部署时沿用原 dot 的能力和上下文,服务器负责把消息链路接起来。
桥接服务可以放在 VPS,也可以放在一台一直开机的电脑上。我这次先在 Windows 本机完成独立安装和测试,再让本机 Agent 通过 SSH 部署到 Linux VPS。服务交给 VPS 托管后,本地电脑就只负责安装和管理。
飞书和 QQ 可以分别安装。只接飞书,下载飞书桥接项目即可;只接 QQ,就用 QQ 桥接项目。公共部分由 core 提供,所需的包已经包含在各自仓库中。
下面以 Linux VPS 接入本人飞书私聊为例,保留完整的安装、Tunnel 配置和订阅流程,也把可以交给 Agent 的工作、需要人工参与的步骤分别列出来。QQ 的差异放在后面。
消息是怎么走的
MCP 是 dot 连接外部工具和事件的协议。运行主机上需要三个程序:飞书后端负责和飞书收发消息,MCP 路由器把 dot 的工具请求交给后端,官方 Tunnel 客户端负责把这台主机接到 OpenAI。
可以把一条消息分成两件事来看:dot 怎么知道有新消息,以及它怎么读取和回复。
读取和回复走 Tunnel。 dot 调用读取、回复等工具时,请求通过官方 Tunnel 到达运行主机,再由路由器交给飞书后端。连接由主机主动向 OpenAI 发起,MCP 端口只需监听 127.0.0.1。
新消息通知走 HTTPS 回调。 飞书后端收到私聊后,先保存消息,再通知 dot“有新消息了”。通知发往 dot 在订阅时提供的回调地址,并带签名供接收方校验。dot 收到通知后,再通过 Tunnel 读取和回复。
因此,安装完成后还要建立一次消息订阅:告诉后端把新消息通知给哪个 dot。后面的验收也会沿着这条链路逐层检查。
放在哪里运行
VPS 是一种方便的选择。如果已经有一台长期在线的电脑,也可以先用起来。
| 环境 | 部署时需要关注的地方 |
|---|---|
| Linux VPS | 持久磁盘、出网条件、systemd 服务和开机启动 |
| 常开的 Linux 电脑或小主机 | 使用同样的部署思路,设置好电源、休眠和网络 |
| Windows 电脑 | Node、Python、本地 NTFS、私有文件 ACL 和后台服务管理 |
| macOS | 尚未做部署验证,欢迎试用并反馈适配问题 |
跑桥的那台机器得一直在线。装在 VPS 上,管理用的笔记本随便关;装在自己电脑上,那这台电脑就别想睡了。
我也试过直接部署到 dot 自带的云电脑——本地关机它还能跑,最初看起来简直是这层桥的完美归宿。可惜那个环境的网络访问和运行方式受限,完整链路怎么都跑不稳,最后还是回到了自己管理的 VPS。
本机这边主要用了 Windows。独立安装和测试过程中,需要留意 Node 版本、Python、OpenSSL,以及私有文件所在的本地 NTFS 目录。Windows 使用 ACL 保护凭据,Linux 使用文件属主和权限;两边各按自己的方式配置。
本机部署时还要把后台运行安排好:服务随系统启动,退出管理终端后继续运行,机器重启后能够恢复。使用代理的环境,则逐项检查 Git、npm、平台连接和 Tunnel 客户端的实际出网情况。
这次最终选择 VPS,是为了把桥接服务从日常使用的电脑上独立出来。本机 Agent 负责安装和排查,长期运行交给服务器。
开始前准备什么
需要准备四样东西:
- 原来的 dot。 继续使用它所在的 ChatGPT 工作区,并确认你有添加、使用私有 MCP 连接的权限。
- 飞书应用。 启用机器人、消息长连接和基础私聊权限,完成应用发布及本人私聊配对。
- 一台长期在线的机器。 可以是 VPS,也可以是自己的电脑;需要持久存储和可用的出网连接。
- 官方 Secure MCP Tunnel。 在 OpenAI Platform 中管理,关联 dot 所在的 ChatGPT 工作区,并准备客户端使用的 runtime key。
这次先接本人的飞书文字私聊。群聊、图片、文件和回复卡片可以在基础连接跑通后逐项开启。
交给 Agent,整个过程怎么安排
我这次用的是本机 Agent:它读代码、跑检查、通过 SSH 到 VPS 装服务;我负责的部分是账号登录、扫码、权限确认,以及在原聊天里确认结果。
整个流程可以这样安排:
| 阶段 | Agent 的主要工作 | 需要交接的事情 |
|---|---|---|
| 检查环境 | 检查系统、架构、端口、网络和已有服务 | 确认目标机器与安装范围 |
| 安装代码 | 读取文档、固定版本、安装依赖、运行测试 | 普通安装和检查可继续执行 |
| 准备应用 | 核对应用、生成授权和配对流程 | 本人登录、扫码、确认应用 |
| 配置凭据 | 准备私有路径和配置,核对权限 | 批准长期凭据的保存和使用 |
| 配置 Tunnel | 安装客户端,生成 profile,运行诊断 | 确认工作区、Tunnel 和权限 |
| 安装服务 | 生成后台服务,配置启动顺序和恢复 | 确认旧消费者已停止 |
| 连接原 dot | 检查工具、准备订阅说明 | 在原 dot 中建立事件任务 |
| 实际验收 | 核对消息状态、去重和重启恢复 | 在原私聊发送消息、查看回复 |
部署 Agent 和原 dot 各负责一段:Agent 安装和维护桥接服务,原 dot 建立自己的订阅并处理消息。到了需要原 dot 配合的时候,把已经检查好的结果和下一步操作一次交接过去。
可以先把下面这段提示词交给部署 Agent,再补上自己的运行机器和管理入口。密钥通过私有文件或安全输入流程提供。
请帮我部署 DotBridge,将我的 [飞书 / QQ] 本人私聊
接到已经在使用的同一个 ChatGPT dot,并回复原私聊。
运行位置:[Linux VPS / 本机 Linux / 本机 Windows]
管理入口:[已配置的 SSH Host Alias / 本机目录]
本次部署:[首次安装 / 迁移已有部署]
本次启用:[lark / qq]
项目:
https://github.com/Arcueid77/dot-lark-bridge
https://github.com/Arcueid77/dot-qq-bridge
先读取所选仓库的 AGENTS.md、README、部署、配置和排错文档,
使用仓库自带的固定 core 包,只安装本次需要的渠道。
请持续推进以下工作:
1. 检查系统、架构、磁盘、Node、OpenSSL、端口、已有服务和出网。
保留无关服务和已有工作区改动。
2. 核对源码,固定完整提交 SHA,按锁文件安装依赖。
运行检查和测试,分别报告通过、失败、跳过及未运行项目。
3. 列出需要的私有文件、用途和目标路径。
凭据保存在最终运行用户的私有目录中,报告只展示路径和核验结果。
新建或迁移长期凭据、修改权限前,说明具体变更并取得所需确认。
4. 使用官方 Secure MCP Tunnel,连接原 dot。
后端和路由器使用独立 service key,runtime key 单独保存。
所有 MCP 端口只监听 loopback。
官方客户端按实际版本和帮助配置。
5. 配置长期运行服务。
Linux 使用专用非 root 用户、绝对路径、持久数据目录、
失败重启、启动顺序和优雅停止。
Windows 使用对应的私有 ACL 和后台服务方式。
6. 如果是迁移,确认旧消费者停止后再启用新实例。
保留原存储密钥、数据库、队列、去重和 uncertain 状态,
使用一致性备份或停机完整备份。
7. 服务器检查完成后,给出原 dot 的连接和订阅步骤。
callback 从真实订阅流程取得,按精确主机名配置白名单。
8. 优先使用文件、CLI、SSH、API 和专用工具。
需要 Computer Use 时,说明页面、目的和操作范围,
取得明确授权后再操作;也可以给步骤让我自行完成。
登录、验证码和扫码交给我处理。
9. 安排真实消息、连续消息、服务重启和 SSH 断开后的验收。
测试只在本人原私聊进行,整机重启另行确认。
核对每条消息的实际回复和重复情况。
完成后提供:
提交 SHA、服务名、配置路径、启停与脱敏状态命令、
备份和回滚方法、订阅续期情况、验收结果及剩余事项。
已授权的安装、检查和可逆操作继续推进。
需要我处理的事项集中列出;遇到阻塞,说明具体原因,
并继续完成不依赖该事项的准备工作。
哪些步骤需要人工,哪些会用到 Computer Use
真正需要本人参与的,主要是登录、扫码、身份确认和授权决定。网页上的普通配置,可以自己操作,也可以在授权后交给具备 Computer Use 能力的 Agent。
| 操作 | 一般由谁完成 |
|---|---|
| 安装依赖、运行测试、编辑配置、管理服务 | Agent 通过命令行或 SSH 完成 |
| 登录 OpenAI、飞书或 QQ,输入验证码、扫码 | 本人完成 |
| 确认选择了哪个应用、工作区和原 dot | 本人确认,Agent 协助核对 |
| 批准长期 key、凭据保存位置及权限范围 | 本人决定,Agent 准备具体配置 |
| 飞书控制台启用能力、配置 Tunnel、在 ChatGPT 添加连接 | 有专用工具就使用工具;需要页面操作时,可授权 Computer Use |
| 把订阅任务交给原 dot | 手动发送,或授权 Agent 在对应界面操作 |
| 本人私聊配对与最终回复确认 | 本人参与;具备已授权的聊天界面操作能力时,Agent 可协助 |
Computer Use 的授权可以限定为“本次接入所需的飞书控制台、OpenAI Platform 和原 dot 管理页面”。登录和扫码完成后,把控制权交回 Agent,它就可以继续填写配置、检查状态。
原私聊里发一条普通消息,就能配合最后的收发检查。配对阶段则按脚本给出的短期口令完成。
在 VPS 上安装飞书桥
先确认 CPU 架构(如 x86_64、arm64)、磁盘空间、已有服务、端口占用和出网连通性。下文使用的示例端口是飞书后端 8788、路由器 8789、Tunnel 管理端口 8790;如果已有程序占用,需要把相应配置一起调整。
安装 Node 24.15 或更新的 24.x 版本,以及 Git、OpenSSL。Node 版本要低于 25;项目使用 Node 自带的 SQLite 支持。按服务器架构从 Node 官方下载目录选择安装包。
下面的命令在 VPS 上执行,需要管理员权限,以 Debian/Ubuntu 为例。其他发行版先确认 nologin 的实际路径。先创建专门运行服务的 dot-bridge 账号;如果已经存在,跳过 useradd 那一行。
sudo useradd --system --user-group --create-home \
--home-dir /var/lib/dot-bridge \
--shell /usr/sbin/nologin dot-bridge
sudo install -d -m 0755 -o dot-bridge -g dot-bridge /opt/dot-bridge
sudo install -d -m 0700 -o dot-bridge -g dot-bridge \
/var/lib/dot-bridge \
/var/lib/dot-bridge/private \
/var/lib/dot-bridge/private/lark \
/var/lib/dot-bridge/private/tunnel \
/var/lib/dot-bridge/lark \
/var/lib/dot-bridge/locks
sudo -u dot-bridge git clone \
https://github.com/Arcueid77/dot-lark-bridge.git \
/opt/dot-bridge/dot-lark-bridge
cd /opt/dot-bridge/dot-lark-bridge
sudo -u dot-bridge git checkout --detach REVIEWED_COMMIT_SHA
sudo -u dot-bridge node --version
sudo -u dot-bridge npm ci --omit=dev --ignore-scripts --no-audit --no-fund
sudo -u dot-bridge npm run check
sudo -u dot-bridge npm test
sudo -u dot-bridge npm run simulate
将 REVIEWED_COMMIT_SHA 替换为检查过的完整提交 SHA,并记录下来,后续更新和回滚都用得上。
Node 和 npm 要安装在服务账号也能访问的位置,例如系统的 /usr/local/bin。保留仓库里的 vendor/ 目录和锁文件,安装命令会使用配套的共享组件。
应用绑定和私有文件
优先复用已有的飞书应用和已配对文件。在飞书控制台启用机器人、im.message.receive_v1 长连接并发布应用。基础私聊需要 im:message.p2p_msg:readonly 和 im:message:send_as_bot 权限。
第一次安装时,按飞书部署指南中的配对步骤完成官方授权,并从本人私聊完成绑定,得到 credentials.json。它会记录应用、接收消息的主人和回复的原私聊。
已有应用的 enroll-existing.js 注册流程目前需要获批且可用的 HTTPS 代理。让 Agent 在扫码前检查这个条件;如需在另一环境完成授权,再安排受批准的私有文件交接。
凭据和数据放在程序目录之外,例如:
/var/lib/dot-bridge/
private/
lark/credentials.json
lark/service-key
lark/storage-key
tunnel/aggregate-service-key
tunnel/runtime-api-key
tunnel/profile.yaml
lark.env
router.env
lark/bridge.sqlite
locks/
私有目录和文件都归运行服务的 dot-bridge 用户所有。目录设为 0700,文件设为 0600,直接保存为普通文件。Agent 核对属主、权限和链接情况后再启动服务。
这些 key 各有自己的用途:
| 文件 | 用途 |
|---|---|
runtime-api-key | 官方客户端连接 OpenAI Tunnel |
aggregate-service-key | 客户端访问本机路由器 |
lark/service-key | 路由器访问飞书后端 |
lark/storage-key | 加密持久数据,迁移原库时须保留原 key |
lark/credentials.json | 飞书应用凭据与本人私聊绑定 |
配对文件来自飞书官方授权流程;runtime key 从 OpenAI 的账户流程取得。两个 .env 和 profile.yaml 按后文保存,数据库由程序创建。
首次安装可以生成三份独立的本地密钥。下面的命令以私有权限创建文件,已有同名文件时停止:
首次安装:生成本地密钥
在 VPS 上执行:
sudo -u dot-bridge node --input-type=module <<'NODE'
import { randomBytes } from 'node:crypto';
import { writeFileSync } from 'node:fs';
for (const file of [
'/var/lib/dot-bridge/private/lark/service-key',
'/var/lib/dot-bridge/private/lark/storage-key',
'/var/lib/dot-bridge/private/tunnel/aggregate-service-key',
]) {
writeFileSync(file, randomBytes(32).toString('base64url'), {
mode: 0o600,
flag: 'wx',
});
}
NODE
每份密钥为 32 字节随机值的 base64url 编码,即 43 个字符,不带换行。runtime key 使用 OpenAI 提供的原值。
密钥只保存在私有文件中。交接报告展示文件路径和核验结果,方便以后维护。
如果从旧机器迁移,先停旧消费者,保留原存储密钥和完整数据库。数据库使用一致性备份,或在停机后连同配套文件一起备份;队列、订阅和去重状态也随数据库保留。
后端和路由器分别配置
飞书后端的 /var/lib/dot-bridge/private/lark.env:
AUTH_MODE=tunnel-service
BRIDGE_MODE=tunnel
TUNNEL_SERVICE_OPERATION=live
TUNNEL_SERVICE_OWNER_ID=tunnel-owner:dot-bridge
HOST=127.0.0.1
PORT=8788
TUNNEL_SERVICE_KEY_FILE=/var/lib/dot-bridge/private/lark/service-key
LARK_TRANSPORT=long-connection
LARK_EXPECTED_APP_ID=YOUR_FEISHU_APP_ID
LARK_CREDENTIALS_FILE=/var/lib/dot-bridge/private/lark/credentials.json
STORAGE_KEY_FILE=/var/lib/dot-bridge/private/lark/storage-key
DATABASE_PATH=/var/lib/dot-bridge/lark/bridge.sqlite
BRIDGE_LOCK_DIRECTORY=/var/lib/dot-bridge/locks
CALLBACK_TRANSPORT_MODE=standard
MCP_CALLBACK_ALLOWED_HOSTS=
将 YOUR_FEISHU_APP_ID 换成自己的应用 ID。回调白名单暂时留空,稍后从原 dot 的订阅流程取得实际主机名。
路由器的 /var/lib/dot-bridge/private/router.env:
AUTH_MODE=tunnel-service
BRIDGE_MODE=tunnel
TUNNEL_SERVICE_OPERATION=live
TUNNEL_SERVICE_OWNER_ID=tunnel-owner:dot-bridge
TUNNEL_CHANNELS=lark
TUNNEL_LIVE_CHANNELS=lark
HOST=127.0.0.1
PORT=8789
TUNNEL_SERVICE_KEY_FILE=/var/lib/dot-bridge/private/tunnel/aggregate-service-key
LARK_SERVICE_KEY_FILE=/var/lib/dot-bridge/private/lark/service-key
LARK_MCP_PORT=8788
这里启用 lark,路由器只连接飞书后端。
服务器可以直接访问外网时,使用 CALLBACK_TRANSPORT_MODE=standard。回调会检查 HTTPS、公网域名和 IP、TLS 证书,并拒绝重定向。必须通过代理出网的机器,按目标环境和项目支持的方式配置。
Secure MCP Tunnel 怎么配置
这一步会用到两个网页和一个服务器文件:在 OpenAI Platform 管理 Tunnel,在 VPS 保存客户端配置,最后在 ChatGPT 中选择这个 Tunnel。三处使用同一个 Tunnel。
选对组织和工作区
打开 Platform 的 Tunnels 管理页,切到正确的组织,检查已有 Tunnel。首次使用时才需要创建;已有部署继续使用原来的 tunnel_id。
权限分两种:
- 创建或修改 Tunnel,需要 Tunnels Read + Manage。
- 运行客户端,以及在 ChatGPT 中选择和使用 Tunnel,需要 Read + Use。
把 Tunnel 关联到原 dot 所在的 ChatGPT 工作区。列表里找不到时,先检查关联和权限。具体入口见 OpenAI 的 Tunnel 文档。
在 VPS 安装官方客户端
从控制台下载入口或官方最新发行页下载对应架构的客户端。以下使用的命令名是 tunnel-client,实际安装后先查看帮助:
tunnel-client help quickstart
按官方 Tunnel 准备说明准备受限 runtime key,使用目标 Tunnel 的 Read + Use 权限。
将原值安全保存到:
/var/lib/dot-bridge/private/tunnel/runtime-api-key
文件归 dot-bridge 用户所有,权限设为 0600。已有权限合适的 key,可以在确认持续使用范围后复用。
profile 指向路由器
把下面内容保存到 /var/lib/dot-bridge/private/tunnel/profile.yaml,将 REPLACE_WITH_YOUR_TUNNEL_ID 换成控制台里的 Tunnel ID。
file: 表示从指定私有文件读取密钥:
config_version: 1
control_plane:
base_url: https://api.openai.com
tunnel_id: REPLACE_WITH_YOUR_TUNNEL_ID
api_key: file:/var/lib/dot-bridge/private/tunnel/runtime-api-key
poll_channels: [main]
mcp:
server_urls:
- channel: main
url: http://127.0.0.1:8789/mcp
extra_headers:
X-Dot-Bridge-Service-Key: file:/var/lib/dot-bridge/private/tunnel/aggregate-service-key
log:
level: info
format: json
health:
listen_addr: 127.0.0.1:8790
admin_ui:
open_browser: false
X-Dot-Bridge-Service-Key 引用的是路由器密钥文件 aggregate-service-key。
运行一个客户端、一个 main 目标,地址指向本机的 8789/mcp 路由器。已有配置中的必要代理和证书设置继续保留;其他字段见官方配置说明。
交给 systemd 长期运行
配置文件准备好后,用 Linux 的 systemd 管理这三个程序:开机自动启动,进程意外退出后自动重启。顺序是飞书后端、路由器,再到官方 Tunnel 客户端。
下面三个文件保存到 /etc/systemd/system/。将 /ABSOLUTE/NODE 和 /ABSOLUTE/TUNNEL_CLIENT 换成实际路径,用 command -v node、command -v tunnel-client 查询,并确认 dot-bridge 用户能够访问。
展开三个 systemd 服务配置
dot-bridge-lark.service:
[Unit]
Description=DotBridge Feishu backend
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=dot-bridge
Group=dot-bridge
WorkingDirectory=/opt/dot-bridge/dot-lark-bridge
ExecStart=/ABSOLUTE/NODE \
--env-file=/var/lib/dot-bridge/private/lark.env \
/opt/dot-bridge/dot-lark-bridge/scripts/run-tunnel-live.js \
--confirm-live-owner-bridge
Environment=HOME=/var/lib/dot-bridge
StandardInput=null
UMask=0077
Restart=on-failure
RestartSec=5
TimeoutStopSec=180
KillSignal=SIGTERM
KillMode=control-group
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
dot-bridge-router.service:
[Unit]
Description=DotBridge loopback router
Wants=network-online.target dot-bridge-lark.service
After=network-online.target dot-bridge-lark.service
[Service]
Type=simple
User=dot-bridge
Group=dot-bridge
WorkingDirectory=/opt/dot-bridge/dot-lark-bridge
ExecStart=/ABSOLUTE/NODE \
--env-file=/var/lib/dot-bridge/private/router.env \
/opt/dot-bridge/dot-lark-bridge/scripts/run-tunnel-router.js \
--confirm-live
Environment=HOME=/var/lib/dot-bridge
StandardInput=null
UMask=0077
Restart=on-failure
RestartSec=5
TimeoutStopSec=180
KillSignal=SIGTERM
KillMode=control-group
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
dot-bridge-tunnel.service:
[Unit]
Description=DotBridge official MCP Tunnel
Wants=network-online.target dot-bridge-router.service
After=network-online.target dot-bridge-router.service
[Service]
Type=simple
User=dot-bridge
Group=dot-bridge
WorkingDirectory=/var/lib/dot-bridge
ExecStart=/ABSOLUTE/TUNNEL_CLIENT run \
--config /var/lib/dot-bridge/private/tunnel/profile.yaml
Environment=HOME=/var/lib/dot-bridge
StandardInput=null
UMask=0077
Restart=on-failure
RestartSec=5
TimeoutStopSec=180
KillSignal=SIGTERM
KillMode=control-group
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
普通 systemd 服务让 DOT_BRIDGE_SUPERVISED 保持未设置,生命周期由 systemd 管理。
先启动飞书后端和路由器:
sudo systemctl daemon-reload
sudo systemctl enable --now \
dot-bridge-lark.service \
dot-bridge-router.service
两个服务运行后,用 dot-bridge 账号检查 Tunnel 配置:
sudo -u dot-bridge /ABSOLUTE/TUNNEL_CLIENT doctor \
--config /var/lib/dot-bridge/private/tunnel/profile.yaml \
--explain
检查通过,确认只有这一套 Tunnel 客户端实例,然后启动 Tunnel 服务:
sudo systemctl enable --now dot-bridge-tunnel.service
systemctl is-active \
dot-bridge-lark.service \
dot-bridge-router.service \
dot-bridge-tunnel.service
三个服务都显示 active 后,再到 ChatGPT 添加连接。
客户端管理界面位于本机的 http://127.0.0.1:8790/ui。需要从管理电脑查看时,通过 SSH 端口转发访问。
在 ChatGPT 中连接原 dot
已有 DotBridge 插件时,在原 dot 所在工作区刷新原连接。首次接入的操作路径是:
ChatGPT Plugins → + → Add custom MCP server → Connection: Tunnel → 选择同一个 Tunnel。
连接使用前面配置的 tunnel-service 模式,官方客户端会替请求加上访问路由器的密钥。
这个部署先服务本人私聊,Tunnel 的使用权限也限定为本人。
接入后,让 dot 查看插件工具和事件目录。应能看到飞书工具、lark.message.created 事件,也可以让它调用 check_lark_readiness 查看配置。
让原 dot 接收飞书消息
现在工具已经能调用,接下来让原 dot 订阅飞书新消息。事件名是 lark.message.created,参数为 {"conversation":"owner"},表示接收本人的私聊。
回调地址和签名资料由真实订阅流程提供。
先把下面这段任务发给原 dot,再按它的返回结果处理:
请在当前这个 dot 中使用已有的 DotBridge Tunnel 插件,
接收并回复我本人的飞书私聊。
订阅 lark.message.created,参数为 conversation=owner,
保留一个有效订阅。
callback 和签名资料使用真实订阅流程提供的内容。
需要设置白名单时,只告诉我需要添加的精确主机名。
订阅成功后,告诉我可以开始发消息,以及订阅的到期时间。
按平台的订阅刷新流程续订原订阅,并检查续订结果。
收到消息后,使用 get_lark_message 读取,
再用 reply_to_lark 回复原私聊。
每条 message_id 分别检查处理状态;
一次任务收到多条事件时,逐条处理。
已完成的回复保持原状态。
发送结果不明时,先核对原会话再决定后续处理。
需要付款、删除、扩大权限或向其他人发送信息时,
按适用规则向我确认。
初次接入时,按这个顺序处理:
- 原 dot 发起订阅。白名单为空时,会得到
callback_policy_required和需要配置的精确主机名。 - 确认它来自这次真实订阅后,在 VPS 上将该主机名填入
lark.env的MCP_CALLBACK_ALLOWED_HOSTS,然后运行sudo systemctl restart dot-bridge-lark.service。 - 回到原 dot,再次发起订阅。后端向回调地址发送校验内容(challenge),接收方自动回显后保存订阅。
- 有效订阅建立后,飞书后端连接网关,开始接收本人私聊。
白名单填写精确主机名。完整 callback 和签名资料留在私有订阅状态中。
接通以后怎么使用
从本人的飞书原私聊发一条普通消息,看看原 dot 是否在同一会话回复。再连续聊几句,然后断开部署 SSH,发送一条新消息。
这次部署我们也顺手验了连续消息和服务重启后的回复:后台核对发送状态,原聊天里确认每条消息各收到一次回答。让部署 Agent 把这两部分结果一起记下来——后面排查时你会感谢这个决定。
订阅默认有效期为 24 小时。ChatGPT 的事件订阅流程会在 refreshBefore 之前刷新订阅;实际部署时检查新的有效期是否已经保存。官方订阅刷新说明
常见问题可以从这几个地方看:
| 现象 | 先看哪里 |
|---|---|
| Tunnel 列表中找不到入口 | Platform 组织、ChatGPT 工作区关联和 Read + Use 权限 |
| 插件看不到飞书工具 | profile 的本机目标、TUNNEL_CHANNELS=lark 和原插件连接 |
| 工具能调用但没新消息 | 原 dot 的订阅、回调白名单和飞书长连接 |
| 消息已进入队列但没回复 | 原 dot 的任务、回复工具调用和原私聊里的实际结果 |
出现 uncertain | 核对原会话和持久发送状态,暂缓重发 |
排查时先看三个服务的状态,再检查本机 /healthz、工具目录、订阅和网关。路由器的 /readyz 按实现固定返回 503,健康检查要结合对应状态一起看。
更新程序前,备份私有配置和完整数据库,记录当前 SHA,再停服务更新。回退时核对旧版本与当前数据库的兼容性,保留更新期间已经收到的消息。
消息正文和回答默认七天后从应用中清除。数据库旧页、WAL、备份和系统日志分别设置保留时间与容量。
让 Agent 最后留下这些内容:
- 实际运行的提交 SHA、服务名和配置路径。
- 启动、停止、重启和查看脱敏状态的命令。
- 数据备份、更新和回滚步骤。
- 订阅有效期及续订检查方式。
- 已完成的消息测试和还需要补验的功能。
换成 QQ 时改什么
QQ 使用相同的 Tunnel 连接方式,应用授权、本人绑定和后端入口按 QQ 项目配置。下载 dot-qq-bridge 后,按它自己的部署指南完成官方授权。
| 配置 | 飞书 | |
|---|---|---|
| 渠道 | lark | qq |
| 后端端口示例 | 8788 | 8787 |
| transport | LARK_TRANSPORT=long-connection | QQ_TRANSPORT=gateway |
| 消息事件 | lark.message.created | qq.message.created |
| 路由器上游 key | LARK_SERVICE_KEY_FILE | QQ_SERVICE_KEY_FILE |
| 路由器上游端口 | LARK_MCP_PORT | QQ_MCP_PORT |
QQ 授权时由本人扫码,选择已有机器人,再核对主人绑定。Agent 可以准备二维码、保存获批凭据并检查结果。
先进入 QQ 项目目录,再启动后端:
cd /opt/dot-bridge/dot-qq-bridge
node --env-file=/var/lib/dot-bridge/private/qq.env \
scripts/qq-service.js --run --confirm-persistent-service
单渠道路由器仍从所选 IM 仓库运行:
node --env-file=/var/lib/dot-bridge/private/router.env \
scripts/run-tunnel-router.js --confirm-live
QQ 路由器配置使用 TUNNEL_CHANNELS=qq 和 TUNNEL_LIVE_CHANNELS=qq。交给原 dot 的订阅任务也换成 qq.message.created,读取和回复工具分别使用 get_qq_message、reply_to_qq。
QQ 的被动回复有时间窗口,长任务要提前想好怎么回来看结果。接通后先验短回复和连续对话,再按应用能力逐项开输入提示、流式和 Markdown。
飞书基础私聊接通后,群聊规则、图片、文件和回复卡片可以按功能配置指南逐项开启。
项目与文档
目前的部署记录来自 Windows 本机安装验证和 Linux VPS 实际运行。macOS 还没验过——欢迎当第一个吃螃蟹的人,适配问题请反馈。
也欢迎分享其他常开电脑、小主机或不同网络环境下的使用情况。反馈时带上系统、架构、Node 版本、提交 SHA 和脱敏报错,方便定位具体环节。