文档

快速开始

ChatHub 基于 Cloudflare 全栈原生架构,无需自建服务器。整个部署过程通过 CI/CD 流水线自动完成,从 Fork 到上线通常只需几分钟。

前提条件

  • 一个 Cloudflare 账号(免费计划即可启动)
  • 一个 Azure DevOpsGitHub 仓库用于 CI/CD
  • (可选)AI 模型 API Key,用于 AI Agent 功能

部署步骤

1

Fork 代码仓库

将 ChatHub 仓库 Fork 到你的 GitHub 或 Azure DevOps,无需本地 Node.js 环境。

2

创建 Cloudflare 资源

在 Cloudflare Dashboard 中依次创建:D1 数据库R2 存储桶Workers & Pages 项目,记录各自的 ID。

3

配置 CI/CD 变量

在流水线的 Variable Groups 中填入 CLOUDFLARE_API_TOKENJWT_SECRETENCRYPTION_KEY 等密钥(详见下方环境变量表)。

4

触发首次部署

推送代码到 main 分支,流水线将自动执行:D1 数据库迁移 → Worker 部署 → Pages 构建发布,全程约 3 分钟。

5

注册第一个账号

访问部署好的 Pages URL,注册账号即可开始使用。建议第一个账号在管理后台中设置为管理员。

首次部署后,所有后续推送均会触发自动更新,包括数据库迁移,无需手动操作。

环境变量

以下变量需要在 CI/CD 流水线或 Cloudflare Dashboard 的 Worker Secrets 中配置。

必填密钥(Worker Secrets)

变量名说明示例 / 生成方式
JWT_SECRET 必填 JWT 签名密钥,用于用户 token 签发与验证 openssl rand -base64 32
ENCRYPTION_KEY 必填 AES-GCM 加密密钥,用于加密平台 app_secret 及邮件 OAuth token openssl rand -base64 32
ADMIN_SECRET 必填 管理后台登录密钥 自定义强密码
AI_API_KEY 可选 AI 模型 API Key,支持 NVIDIA / OpenRouter / Groq 等 OpenAI 兼容接口 从对应平台获取
GOOGLE_CLIENT_ID 可选 Gmail OAuth 客户端 ID Google Cloud Console
GOOGLE_CLIENT_SECRET 可选 Gmail OAuth 客户端密钥 Google Cloud Console
MICROSOFT_CLIENT_ID 可选 Outlook OAuth 客户端 ID Azure App Registrations
MICROSOFT_CLIENT_SECRET 可选 Outlook OAuth 客户端密钥 Azure App Registrations
FRONTEND_URL 可选 OAuth 回调后重定向的前端地址(生产 Pages URL) https://your-app.pages.dev
BILIBILI_PROXY_URL 可选 B 站 API 中转代理,解决 Cloudflare 边缘节点被拦截问题 Power Automate / 自建代理 URL

wrangler.toml 配置项

变量名默认值说明
CORS_ORIGIN "*" CORS 允许的来源,生产环境建议设为 Pages URL
AI_BASE_URL NVIDIA API 地址 AI 接口基础地址,兼容所有 OpenAI 格式 API
AI_MODEL gemma-4-31b-it 默认 AI 模型名称,可在管理后台覆盖

Cloudflare Bindings

Binding类型说明
DBD1 Database主数据库,binding name: qq-db
CHAT_ROOMDurable ObjectChatRoom DO,处理 WebSocket 实时消息
BRIDGE_HUBDurable ObjectBridgeHub DO,处理微信 Bridge 连接
AGENT_QUEUEQueueAI Agent 异步任务队列

管理后台

管理后台位于独立的 packages/admin 包,使用 ADMIN_SECRET 进行访问控制,不与普通用户共享认证系统。

访问

管理后台部署在独立域名,通过以下路径访问:

https://your-admin.pages.dev

主要功能

  • 系统配置:AI 模型地址、默认模型名、快捷指令下载链接等 KV 配置
  • 用户管理:查看用户列表、重置密码
  • 集成监控:查看已接入的平台集成状态
  • 公共配置接口GET /api/public/config 无需鉴权,供官网前端动态读取配置
⚠️
安全提示:请设置复杂的 ADMIN_SECRET,管理后台具有全部系统权限。

即时通讯

ChatHub 的核心功能,基于 Cloudflare Durable Objects 实现房间级有状态 WebSocket,支持私聊与群组。

会话类型

👤

私聊(Direct)

仅限已成为好友(accepted 联系人)的用户之间创建。

👥

群组(Group)

可邀请多名成员,支持管理员角色,无人数硬性上限。

好友系统

  1. 通过用户名搜索目标用户
  2. 发送好友申请,对方收到实时通知
  3. 双方接受后即可发起私聊或拉入群组

消息类型

类型说明
text普通文本消息,支持 URL 链接自动预览
file文件/图片/视频附件,存储于 R2
poll投票消息,由 AI Agent 或用户发起
call音视频通话记录消息

实时通知

每个用户有独立的通知频道 notify:{userId},用于接收好友申请、系统消息等非房间级推送,断线后自动重连。

文件 & 媒体

文件上传存储于 Cloudflare R2,支持多种格式的在线预览,视频内容支持应用内嵌播放。

支持的预览格式

类型格式预览方式
图片JPG、PNG、GIF、WebP、SVG应用内全屏查看器
视频MP4、WebM内嵌播放器
文档PDFiframe 内嵌预览
OfficeDOCX、XLSX、PPTXMicrosoft Office Online 预览
代码JS、TS、Python、等带语法高亮的代码查看器

外部内容

  • 抖音视频:支持无水印下载(多 API 降级策略:web detail → iteminfo → amemv),短链自动展开
  • 抖音直播:解析直播间信息,支持 HLS 实时播放
  • TikTok:支持链接预览与 iframe 播放,VPS 代理直链,失败自动降级
  • B 站视频:通过 BILIBILI_PROXY_URL 中转解析
  • 小红书:图文/视频解析,支持评论查看
ℹ️
飞书集成启用后,文件会优先上传到飞书文件服务器(file_server 模式),否则默认上传到 R2。

书签 & 链接预览

ChatHub 提供两种书签形式:消息收藏和 URL 书签,配合链接预览卡片,将碎片化信息集中管理。

消息收藏

点击任意消息右侧的收藏按钮,即可将其添加到收藏夹。收藏操作幂等,重复收藏不报错。在书签面板的「消息收藏」Tab 中查看和取消收藏。

URL 书签

支持三种方式添加 URL 书签:

  • 浏览器扩展:一键保存当前页面
  • Apple 快捷指令:从 iOS 分享菜单保存任意链接
  • 批量导入:通过扩展同步浏览器书签,上限 2000 条/次

链接预览

发送包含 URL 的消息后,系统自动异步抓取 OGP 元数据,生成预览卡片,包含标题、描述、封面图。特殊平台有专属解析:

  • 小红书:多图轮播 + 视频 + 评论展示
  • 微信文章:正文全文解析,支持图文混排
  • 汽水音乐:品牌卡片 + 应用内嵌播放器
OGP 封面图由客户端按需抓取,绕过了 Cloudflare 边缘节点的 fetch 限制,确保图片正常显示。

AI Agent

每个群组可配置独立的 AI Agent,拥有多种工具调用能力,支持主流 OpenAI 兼容模型接口。

配置 Agent

在群组详情面板中点击「Agent 配置」,可设置:

  • 系统提示词:定义 Agent 的角色、语气和行为规则
  • 模型选择:指定使用的 AI 模型(覆盖全局默认)
  • 响应超时:设置最长等待时间(秒)

可用工具

工具名功能
queryMessages搜索和检索房间历史消息
searchMembers搜索房间成员信息
sendMessage向当前或指定房间发送消息
createTask创建任务并展示在任务面板
listTasks列出房间内的所有任务
createPoll发起投票,自动生成投票消息
createReminder设置定时提醒,到期推送消息
proposeAction向用户提案,等待确认后再执行

定时任务

Worker 配置了 3 条 Cron,无需额外配置即自动运行:

Cron北京时间说明
0 1 * * *每天 09:00晨间提醒,触发各房间 Agent 推送今日安排
0 13 * * *每天 21:00晚间汇总,自动总结当日消息要点
*/5 * * * *每 5 分钟检查即将到期的提醒并推送

行为学习

每次用户接受或拒绝 Agent 的 proposeAction 提案,系统都会记录到 teamModels 表,供后续分析 Agent 提案接受率。

ℹ️
Agent 任务通过 Workers Queue 异步处理,不会阻塞消息流,即使 AI 响应较慢也不影响正常聊天。

平台集成

ChatHub 支持飞书、钉钉、企业微信、Slack 四大平台的消息双向同步,外部消息自动映射到 ChatHub 房间。

通用配置流程

1

在平台创建应用

登录对应平台的开发者后台,创建自定义应用,获取 App IDApp Secret

2

配置 Webhook

在 ChatHub 集成管理页面添加集成,填入 App ID 和 App Secret,复制生成的 Webhook URL。

3

填入平台应用

将 Webhook URL 填入对应平台的事件订阅设置,配置需要订阅的消息事件。

4

绑定房间

在 ChatHub 中创建或选择目标群组,将平台渠道与该房间绑定,后续消息自动同步。

各平台特性

🐦

飞书

支持 OAuth 登录、v1/v2 事件解析、文件自动转存。用户可使用飞书账号直接登录 ChatHub。

📌

钉钉

Webhook 接入,群消息实时同步,支持机器人消息格式,HMAC 签名验证。

💼

企业微信

应用消息推送,外部联系人消息聚合,支持加密消息解密。

💬

Slack

Events API 接入,频道消息双向同步,支持 Slash Commands。

⚠️
安全提醒:各平台的 App Secret 在存入数据库前会经过 AES-GCM 加密,ENCRYPTION_KEY 不可丢失。

邮件集成

通过 OAuth 2.0 接入 Gmail 和 Outlook,在 ChatHub 中统一管理多个邮箱,支持收信、写信、多文件夹和附件预览。

Gmail 配置

1

Google Cloud Console

创建项目 → 启用 Gmail API → 配置 OAuth 2.0 凭据,重定向 URI 填写:

https://your-worker.workers.dev/api/email/google/callback
2

配置 Worker Secrets

GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRET 添加到 Worker 密钥。

3

授权绑定

在 ChatHub 邮件面板点击「添加 Gmail 账号」,完成 OAuth 授权后即可使用。

Outlook 配置

1

Azure App Registrations

注册应用 → 添加 Microsoft Graph 权限(Mail.Read、Mail.Send、Mail.ReadWrite)→ 配置重定向 URI:

https://your-worker.workers.dev/api/email/microsoft/callback
2

配置 Worker Secrets

MICROSOFT_CLIENT_IDMICROSOFT_CLIENT_SECRET 添加到 Worker 密钥。

3

授权绑定

在 ChatHub 邮件面板点击「添加 Outlook 账号」完成授权。

功能说明

  • 多文件夹:收件箱 / 已发送 / 草稿箱自由切换
  • 写信:填写收件人、主题、正文后一键发送
  • 附件预览:图片、PDF 等文件支持应用内预览,复用 FilePreviewModal
  • 删除邮件:详情页内联二次确认,删除后自动跳转上一封或下一封
  • Token 自动刷新:access_token 过期前 5 分钟自动静默刷新,无需重新授权
  • 安全存储:access_token 和 refresh_token 经 AES-GCM 加密存储

微信 Bridge

通过手机端配对,将微信消息桥接到 ChatHub,实现微信消息的统一管理和存档。

工作原理

Bridge 功能由 BridgeHub Durable Object 驱动。手机端 App 扫码配对后,与 BridgeHub 建立持久 WebSocket 连接,微信消息实时转发到对应的 ChatHub 房间。

配对步骤

1

安装 Bridge App

在 iPhone 上安装 ChatHub Bridge App(packages/bridge-app)。

2

扫码配对

在 ChatHub Web 设置页面找到「微信 Bridge」,点击生成配对码,使用 Bridge App 扫码完成配对。

3

绑定房间

为微信联系人或群组绑定对应的 ChatHub 房间,后续消息自动同步。

微信文章收藏

在微信中分享文章到 Bridge App 或使用 Apple 快捷指令,文章链接和正文会自动保存到 ChatHub URL 书签。


Web / PWA

ChatHub Web 端基于 React 18 + Vite 构建,部署到 Cloudflare Pages,支持 PWA 离线安装。

PWA 安装

在 Chrome / Edge / Safari 中访问 ChatHub,点击地址栏的「安装」图标(或浏览器菜单中的「添加到主屏幕」),即可将 ChatHub 安装为桌面/手机 App。

  • 安装后支持离线访问缓存内容
  • 新版本发布后自动静默刷新,无需手动更新
  • 支持桌面通知和角标未读数

UI 个性化

在设置页面可自定义以下外观选项,设置持久化到 localStorage:

  • 气泡颜色:靛蓝 / 天蓝 / 紫罗兰 / 翡翠 / 玫瑰 / 暖橙 六套主题
  • 字体大小:小 / 标准 / 大 三档
  • 消息密度:紧凑 / 标准 / 宽松

键盘快捷键

快捷键功能
Enter发送消息
Shift + Enter消息内换行
@触发成员 mention 提示
Esc关闭弹窗 / 取消编辑

iOS / Android

ChatHub 移动端基于 Expo SDK 52,通过 EAS Build 云端打包,iOS 和 Android 双端体验与 Web 端保持一致。

安装方式

  • iOS:通过 EAS Build 生成的 IPA 文件,使用 AltStore / TestFlight 安装
  • Android:通过 EAS Build 生成 APK,直接安装

自行构建

首次构建需在本地执行:

# 进入移动端目录
cd packages/mobile

# 配置 Apple 账号证书(iOS)
eas credentials

# 注册测试设备 UDID(iOS Personal 证书)
eas device:create

# 手动触发构建
eas build --platform android --profile personal --no-wait
eas build --platform ios --profile personal --no-wait

后续构建由 azure-pipelines-mobile.yml 自动触发,无需手动操作。

主要特性

  • 原生推送:Expo Notifications 接入,新消息即时推送
  • 安全存储:Token 使用 iOS Keychain / Android Keystore,不使用 AsyncStorage
  • 音视频通话:react-native-webrtc 驱动,支持摄像头翻转
  • 断线重连:监听 AppState,前台时自动重建 WebSocket 连接
  • Liquid Glass 主题:适配 iOS 动态背景模糊效果,支持亮/暗模式切换

浏览器扩展

Chrome 扩展(packages/extension)提供一键收藏和书签批量同步功能,将浏览器与 ChatHub 无缝打通。

安装

1

加载扩展

打开 Chrome → 扩展程序 → 开发者模式 → 加载已解压的扩展程序 → 选择 packages/extension 目录。

2

登录账号

点击扩展图标,输入 ChatHub 地址和账号密码完成登录。

功能

  • 一键收藏:点击扩展图标,将当前页面 URL 和标题保存到 ChatHub 书签
  • 批量同步:将 Chrome 浏览器书签批量导入 ChatHub,每批 100 条,上限 2000 条/次

Apple 快捷指令

通过 iOS 快捷指令,在任意 App 的分享菜单中一键将链接保存到 ChatHub 书签,全程约 1 秒。

快捷指令说明

⚙️

ChatHub 初始化

首次使用必须运行一次。将用户名和密码安全写入 iOS 钥匙串,供「保存到 ChatHub」自动读取。

🔖

保存到 ChatHub

添加到分享菜单后,在抖音、微信、Safari 等 App 分享时调用,自动提取链接并保存。

安装步骤

1

下载「ChatHub 初始化」快捷指令

前往官网快捷指令区下载,安装后打开「快捷指令」App 运行一次,输入用户名和密码。

2

下载「保存到 ChatHub」快捷指令

安装后在「快捷指令」App 中长按该快捷指令 → 「添加到分享菜单」。

3

开始使用

在任意 App 点击「分享」→ 找到「保存到 ChatHub」,链接将自动保存,完成后弹出系统通知。

ℹ️
需要 iOS 16 / macOS 13 及以上。密码存储在系统钥匙串中,ChatHub 不会在服务器端留存明文密码。

WebSocket 协议

ChatHub 使用两条独立的 WebSocket 连接:房间级实时消息 和 用户级通知推送。

连接地址

# 房间级连接(进入聊天室时建立)
wss://your-worker.workers.dev/ws/room/{roomId}?token={jwt}

# 用户级通知(登录后持续保持)
wss://your-worker.workers.dev/ws/room/notify:{userId}?token={jwt}

客户端 → 服务器

消息类型字段说明
message:sendcontent, msgType, fileId?发送消息,msgType 为 text / file / poll
user:typing通知他人正在输入
presence:ping心跳保活,每 20 秒发送一次
call:offertargetUserId, sdp发起音视频通话邀请
call:answertargetUserId, sdp接受通话,回传 SDP Answer
call:icetargetUserId, candidate传递 ICE candidate
call:endtargetUserId挂断通话

服务器 → 客户端

消息类型字段说明
message:newmessage: Message新消息推送
user:typinguserId, username某用户正在输入
presence:joinuserId, username用户进入房间
presence:leaveuserId, username用户离开房间
message:readmessageId, userId消息已读回执
contact:requestfromUserId, fromUsername收到好友申请(通知频道)
agent:actionaction: AgentActionAI Agent 提案,需用户确认

API 端点

Worker 以 Hono 框架构建,绝大多数端点以 /api 为前缀。受保护端点需在请求头中携带 JWT:

Authorization: Bearer <token>

响应格式

成功
{ "ok": true }
{ "rooms": [...] }
{ "user": { ... } }
错误
{ "error": "Missing field" }   // 400
{ "error": "Unauthorized" }    // 401
{ "error": "Forbidden" }       // 403
{ "error": "Not found" }       // 404

认证 /api/auth

方法路径鉴权说明
POST/api/auth/register注册新用户(email + username + password)
POST/api/auth/login登录,返回 JWT token
调用示例
POST/api/auth/register
{
  "email":    "alice@example.com",
  "username": "alice",
  "password": "MyP@ssw0rd"
}
Response 201
{ "ok": true, "userId": "usr_01abc" }
POST/api/auth/login
{
  "email":    "alice@example.com",
  "password": "MyP@ssw0rd"
}
Response 200
{
  "token": "eyJhbGciOiJIUzI1NiJ9...",
  "user": {
    "id": "usr_01abc",
    "username": "alice",
    "email": "alice@example.com"
  }
}

用户 /api/users

方法路径鉴权说明
GET/api/users/search?q=JWT按用户名搜索用户
GET/api/users/:idJWT获取指定用户的公开信息
PATCH/api/users/meJWT更新当前用户名 / 头像
PATCH/api/users/me/passwordJWT修改密码,旧 token 立即失效(tokenVersion +1)
调用示例
GET/api/users/search?q=alice
Authorization: Bearer <token>
Response 200
{
  "users": [
    { "id": "usr_01abc", "username": "alice", "avatarUrl": null }
  ]
}
PATCH/api/users/me
Authorization: Bearer <token>

{ "username": "alice_new" }
Response 200
{ "ok": true }
PATCH/api/users/me/password
Authorization: Bearer <token>

{ "oldPassword": "OldP@ss", "newPassword": "NewP@ss" }
Response 200
{ "ok": true }
// 注意:当前 token 立即失效,需使用新密码重新登录

联系人 /api/contacts

方法路径鉴权说明
GET/api/contactsJWT获取已接受的联系人列表
GET/api/contacts/pendingJWT获取待处理的好友申请
POST/api/contactsJWT发送好友申请,对方实时收到通知
PATCH/api/contacts/:friendId/acceptJWT接受好友申请
DELETE/api/contacts/:friendIdJWT删除联系人
调用示例
POST/api/contacts — 发送好友申请
Authorization: Bearer <token>

{ "friendId": "usr_02xyz" }
Response 201
{ "ok": true }
// 对方通过通知频道实时收到 { type: "contact:request", fromUserId, fromUsername }
PATCH/api/contacts/usr_02xyz/accept
Authorization: Bearer <token>
Response 200
{ "ok": true }
// 双方 contacts 表各自写入一条 accepted 记录
GET/api/contacts
Authorization: Bearer <token>
Response 200
{
  "contacts": [
    { "id": "usr_02xyz", "username": "bob", "avatarUrl": null }
  ]
}

房间 /api/rooms

方法路径鉴权说明
GET/api/roomsJWT获取当前用户的会话列表
POST/api/roomsJWT创建群组(name + memberIds[])
POST/api/rooms/directJWT创建私聊,目标必须是已接受的联系人
PATCH/api/rooms/:idJWT 管理员更新房间名称 / 头像
DELETE/api/rooms/:idJWT 管理员解散房间
GET/api/rooms/:id/membersJWT获取房间成员列表
POST/api/rooms/:id/membersJWT 管理员邀请成员加入房间
DELETE/api/rooms/:id/members/:userIdJWT 管理员移除成员
调用示例
POST/api/rooms — 创建群组
Authorization: Bearer <token>

{ "name": "产品团队", "memberIds": ["usr_02xyz", "usr_03def"] }
Response 201
{ "room": { "id": "room_abc", "name": "产品团队", "type": "group" } }
POST/api/rooms/direct — 创建私聊
Authorization: Bearer <token>

{ "targetUserId": "usr_02xyz" }
Response 200(已存在则直接返回,201 为新建)
{ "room": { "id": "room_xyz", "type": "direct" } }
GET/api/rooms
Authorization: Bearer <token>
Response 200
{
  "rooms": [
    {
      "id": "room_abc", "name": "产品团队", "type": "group",
      "lastMessage": { "content": "部署完成 ✅", "createdAt": "2026-05-03T10:00:00Z" },
      "unreadCount": 3
    }
  ]
}

消息 /api/messages

方法路径鉴权说明
GET/api/messages/:roomId?cursor=&limit=JWT获取消息历史,游标分页,默认 limit=50
GET/api/messages/search?q=&roomId=JWT全文搜索消息
PATCH/api/messages/:messageId/editJWT 发送者编辑消息内容
PATCH/api/messages/:messageId/recallJWT 发送者撤回消息
PATCH/api/messages/:messageId/previewJWT更新消息的链接预览数据(OGP)
POST/api/messages/:messageId/feedbackJWT消息反馈(👍 / 👎),用于 Agent 学习
调用示例
GET/api/messages/room_abc?limit=20
Authorization: Bearer <token>
Response 200
{
  "messages": [
    {
      "id": "msg_001", "roomId": "room_abc",
      "senderId": "usr_01abc", "senderUsername": "alice",
      "content": "部署完成 ✅", "type": "text",
      "createdAt": "2026-05-03T10:00:00Z"
    }
  ],
  "nextCursor": "msg_000"   // 传给下一次请求的 ?cursor= 参数,null 表示已到最早
}
PATCH/api/messages/msg_001/edit
Authorization: Bearer <token>

{ "content": "部署完成 ✅(已验证)" }
Response 200
{ "ok": true }
// 房间内所有在线成员通过 WS 收到 { type: "message:edit", messageId, content }
PATCH/api/messages/msg_001/recall
Authorization: Bearer <token>
Response 200
{ "ok": true }
// WS 广播 { type: "message:recall", messageId }

文件 /api/files

方法路径鉴权说明
POST/api/files/uploadJWT上传文件,multipart/form-data,返回 fileId
GET/api/files/:key获取文件内容(R2 代理)
调用示例
POST/api/files/upload
Authorization: Bearer <token>
Content-Type: multipart/form-data

file=@/path/to/photo.jpg
Response 201
{
  "file": {
    "id":       "file_xyz",
    "key":      "uploads/2026/05/photo_abc123.jpg",
    "filename": "photo.jpg",
    "mimeType": "image/jpeg",
    "size":     204800
  }
}
// 发消息时在 WS 携带 fileId: "file_xyz", msgType: "file"

平台集成 /api/integrations

方法路径鉴权说明
GET/api/integrationsJWT获取当前用户的集成列表
POST/api/integrationsJWT创建集成(platform + appId + appSecret)
GET/api/integrations/:idJWT获取集成详情
PUT/api/integrations/:idJWT更新集成配置
DELETE/api/integrations/:idJWT删除集成
GET/api/integrations/:id/channelsJWT获取集成绑定的渠道(房间映射)列表
POST/api/integrations/:id/file-serverJWT为集成配置飞书文件服务器
DELETE/api/integrations/:id/file-serverJWT移除飞书文件服务器配置
调用示例
POST/api/integrations — 创建飞书集成
Authorization: Bearer <token>

{
  "platform":  "feishu",
  "name":      "我的飞书机器人",
  "appId":     "cli_xxxxxxxxxx",
  "appSecret": "xxxxxxxxxxxxxxxx"
}
Response 201
{
  "integration": {
    "id":          "int_001",
    "platform":    "feishu",
    "name":        "我的飞书机器人",
    "webhookUrl":  "https://worker.dev/webhook/feishu?integrationId=int_001"
  }
}
// 将 webhookUrl 填入飞书应用的「事件订阅」请求地址

Webhooks /webhook

ℹ️
Webhook 端点不挂载在 /api 下,地址中需携带 integrationId 查询参数以路由到对应集成。
方法路径鉴权说明
POST/webhook/feishu?integrationId=签名接收飞书消息事件(v1 / v2)
POST/webhook/dingtalk?integrationId=HMAC接收钉钉消息事件
GET/webhook/wecom?integrationId=签名企业微信服务器验证
POST/webhook/wecom?integrationId=签名接收企业微信消息事件
POST/webhook/slack?integrationId=签名接收 Slack Events API 事件

投票 /api/polls

方法路径鉴权说明
GET/api/polls/:messageIdJWT获取投票详情及当前结果
POST/api/polls/:messageId/voteJWT提交投票(optionIndex),每人每条投票只能投一次
调用示例
GET/api/polls/msg_poll_001
Authorization: Bearer <token>
Response 200
{
  "poll": {
    "question": "本周发版时间?",
    "options":  ["周三", "周四", "周五"],
    "votes":    [3, 1, 2],
    "myVote":   0          // 当前用户已选索引,null 表示未投
  }
}
POST/api/polls/msg_poll_001/vote
Authorization: Bearer <token>

{ "optionIndex": 0 }
Response 200
{ "ok": true }
// WS 广播最新票数给房间所有成员

AI Agent /api/agent-actions

方法路径鉴权说明
GET/api/agent-actions/tasksJWT获取房间任务列表(?roomId=)
PATCH/api/agent-actions/tasks/:taskIdJWT更新任务状态(todo → done)
POST/api/agent-actions/:actionId/feedbackJWT接受或拒绝 Agent 提案(status: accepted | rejected)
调用示例
GET/api/agent-actions/tasks?roomId=room_abc
Authorization: Bearer <token>
Response 200
{
  "tasks": [
    { "id": "task_001", "title": "抖音下载生产环境验证", "status": "todo", "createdAt": "..." },
    { "id": "task_002", "title": "邮件 Tab 上线验收",    "status": "done", "createdAt": "..." }
  ]
}
PATCH/api/agent-actions/tasks/task_001
Authorization: Bearer <token>

{ "status": "done" }
Response 200
{ "ok": true }
POST/api/agent-actions/act_001/feedback — 接受 Agent 提案
Authorization: Bearer <token>

{ "status": "accepted" }   // 或 "rejected"
Response 200
{ "ok": true }
// accepted 时 Agent 会继续执行被提案的操作(如发送消息/创建任务)

消息书签 /api/bookmarks

方法路径鉴权说明
GET/api/bookmarksJWT获取已收藏的消息列表(含消息原文)
GET/api/bookmarks/idsJWT获取已收藏消息的 ID 集合(用于前端高亮)
POST/api/bookmarks/:messageIdJWT收藏消息,幂等操作,重复收藏不报错
DELETE/api/bookmarks/:messageIdJWT取消收藏
调用示例
POST/api/bookmarks/msg_001
Authorization: Bearer <token>
Response 201(已收藏则返回 200)
{ "ok": true, "bookmarkId": "bm_xyz" }
GET/api/bookmarks/ids
Authorization: Bearer <token>
Response 200
{ "ids": ["msg_001", "msg_005", "msg_012"] }
// 前端用此列表在消息气泡上显示收藏标记

URL 书签 /api/url-bookmarks

方法路径鉴权说明
GET/api/url-bookmarksJWT获取 URL 书签列表(支持分页和搜索)
POST/api/url-bookmarksJWT新增单条 URL 书签
POST/api/url-bookmarks/batchJWT批量导入书签,每批 100 条,最多 2000 条
POST/api/url-bookmarks/:id/refreshJWT重新抓取 OGP 元数据(标题 / 描述 / 封面图)
PATCH/api/url-bookmarks/:id/metaJWT手动修改书签标题 / 描述
POST/api/url-bookmarks/:id/forwardJWT将书签链接转发到指定会话
DELETE/api/url-bookmarks/:idJWT删除书签
调用示例
POST/api/url-bookmarks — 保存单条链接
Authorization: Bearer <token>

{ "url": "https://mp.weixin.qq.com/s/xxxxx" }
Response 201
{
  "bookmark": {
    "id":    "ubm_001",
    "url":   "https://mp.weixin.qq.com/s/xxxxx",
    "title": null,   // OGP 异步抓取,稍后填充
    "image": null
  }
}
POST/api/url-bookmarks/batch — 批量导入
Authorization: Bearer <token>

{
  "urls": [
    "https://example.com/article-1",
    "https://example.com/article-2"
  ]
}
Response 200
{ "inserted": 2, "skipped": 0 }
// skipped 为已存在的重复 URL 数量
POST/api/url-bookmarks/ubm_001/forward
Authorization: Bearer <token>

{ "roomId": "room_abc" }
Response 200
{ "ok": true }
// 书签 URL 以文本消息形式发送到指定房间

链接预览 /api/link-preview

方法路径鉴权说明
GET/api/link-preview?url=JWT通用 OGP 元数据抓取,含小红书 / 抖音专项解析
GET/api/link-preview/wechat-article?url=JWT微信文章正文解析(处理 JS 转义 / 图片提取)
GET/api/link-preview/douyin-download?url=JWT抖音视频信息解析,返回播放地址
GET/api/link-preview/douyin-nwm?aweme_id=JWT抖音无水印下载链接(多 API 降级策略)
调用示例
GET/api/link-preview?url=https://example.com/article
Authorization: Bearer <token>
Response 200
{
  "title":       "示例文章标题",
  "description": "这是文章的描述摘要...",
  "image":       "https://example.com/og-image.jpg",
  "favicon":     "https://example.com/favicon.ico",
  "siteName":    "Example"
}
GET/api/link-preview/douyin-nwm?aweme_id=7234567890123456789
Authorization: Bearer <token>
Response 200
{
  "downloadUrl": "https://aweme.snssdk.com/aweme/v1/play/?video_id=xxx&ratio=720p",
  "title":       "视频标题",
  "cover":       "https://p3.douyinpic.com/xxx.jpg"
}

邮件 /api/email

方法路径鉴权说明
GET/api/email/auth/:providerJWT获取 OAuth 授权链接(provider: google | microsoft
GET/api/email/auth/:provider/callbackOAuth 授权回调,写入 token 后重定向前端
GET/api/email/accountsJWT获取已绑定的邮件账号列表
DELETE/api/email/accounts/:idJWT解绑邮件账号
GET/api/email/messages?accountId=&folder=&pageToken=JWT获取邮件列表,folder 可选 inbox / sent / drafts
GET/api/email/messages/:id?accountId=JWT获取邮件详情(含 HTML 正文)
POST/api/email/messages/:id/readJWT标记邮件为已读
POST/api/email/messages/sendJWT发送邮件(to / subject / body / accountId)
POST/api/email/messages/:id/replyJWT回复邮件
DELETE/api/email/messages/:id?accountId=JWT删除邮件(移入回收站)
GET/api/email/messages/:id/attachment/:attIdJWT下载 / 预览附件
调用示例
GET/api/email/auth/google — 获取授权链接
Authorization: Bearer <token>
Response 200
{ "url": "https://accounts.google.com/o/oauth2/v2/auth?client_id=...&state=..." }
// 前端跳转此 URL,用户授权后回调写入 token
GET/api/email/messages?accountId=eacc_001&folder=inbox
Authorization: Bearer <token>
Response 200
{
  "messages": [
    {
      "id":      "gmail_msg_abc",
      "from":    "sender@example.com",
      "subject": "本周五 14:00 产品评审",
      "snippet": "请参加本周产品评审会议...",
      "date":    "2026-05-03T10:24:00Z",
      "unread":  true
    }
  ],
  "nextPageToken": "token_xyz"   // 传入下次请求的 pageToken,null 表示最后一页
}
POST/api/email/messages/send — 发送邮件
Authorization: Bearer <token>

{
  "accountId": "eacc_001",
  "to":        "colleague@example.com",
  "subject":   "会议纪要",
  "body":      "<p>附上本次会议纪要,请查阅。</p>"
}
Response 200
{ "ok": true }
POST/api/email/messages/gmail_msg_abc/reply
Authorization: Bearer <token>

{
  "accountId": "eacc_001",
  "body":      "<p>收到,准时参加。</p>"
}
Response 200
{ "ok": true }

微信 Bridge /api/bridge

方法路径鉴权说明
POST/api/bridge/pairJWT生成配对码,Bridge App 扫码后完成设备绑定
GET/api/bridge/statusJWT查询 Bridge 设备在线状态
GET/api/bridge/roomsJWT获取 Bridge 房间映射列表
POST/api/bridge/forwardJWT通过 Bridge 向微信转发消息
调用示例
POST/api/bridge/pair
Authorization: Bearer <token>
Response 200
{
  "pairCode": "AB12CD",   // Bridge App 扫描此码完成配对
  "expiresIn": 300        // 有效期(秒)
}
GET/api/bridge/status
Authorization: Bearer <token>
Response 200
{
  "online": true,
  "deviceName": "Alice 的 iPhone",
  "lastSeen":   "2026-05-03T09:55:00Z"
}

飞书 OAuth /auth/feishu

方法路径鉴权说明
GET/auth/feishu/urlJWT获取飞书 OAuth 授权跳转链接
GET/auth/feishu/callback飞书 OAuth 回调,写入用户 token
GET/auth/feishu/statusJWT查询当前飞书授权状态
DELETE/auth/feishu/revokeJWT撤销飞书授权并删除本地 token

抖音 OAuth /auth/douyin

方法路径鉴权说明
GET/auth/douyin/urlJWT获取抖音 OAuth 授权链接
GET/auth/douyin/callback抖音 OAuth 回调
GET/auth/douyin/whitelist-callback测试白名单授权回调
GET/auth/douyin/statusJWT查询当前抖音授权状态
DELETE/auth/douyin/revokeJWT撤销抖音授权

抖音数据 /api/douyin

方法路径鉴权说明
GET/api/douyin/accountJWT获取绑定的抖音账号信息
PATCH/api/douyin/accountJWT更新抖音账号设置
GET/api/douyin/videosJWT获取账号视频列表(含统计数据)
POST/api/douyin/syncJWT主动触发抖音数据同步
GET/api/douyin/config获取抖音集成公开配置

管理后台 /api/admin

⚠️
/api/admin/login 外,所有管理端点均需通过 POST /api/admin/login 获取管理员 token,并以 Authorization: Bearer <admin-token> 携带。
方法路径说明
POST/api/admin/login管理员登录(body: { secret }
GET/api/admin/stats系统概览统计(用户数 / 消息数 / 房间数 / 集成数)
GET/api/admin/config获取全部系统配置 KV
PUT/api/admin/config/:key更新指定系统配置项
GET/api/admin/users用户列表(含消息数 / 集成数统计)
DELETE/api/admin/users/:id删除用户
GET/api/admin/rooms全量房间列表
GET/api/admin/integrations全量集成列表
DELETE/api/admin/integrations/:id删除集成
GET/api/admin/messages/files消息中的文件列表
POST/api/admin/file-server/test测试飞书文件服务器连接
POST/api/admin/feishu/sync-avatars同步飞书平台用户头像到 R2
GET/api/admin/agentsAgent 列表
POST/api/admin/agents创建 Agent
PATCH/api/admin/agents/:agentId更新 Agent 配置(提示词 / 模型 / 超时)
GET/api/admin/agents/:agentId/rooms获取 Agent 关联的房间列表
POST/api/admin/agents/:agentId/rooms/:roomId将 Agent 加入指定房间
DELETE/api/admin/agents/:agentId/rooms/:roomId将 Agent 从房间移除
GET/api/admin/ai-models获取可用 AI 模型列表
调用示例
POST/api/admin/login
{ "secret": "your-admin-secret" }
Response 200
{ "token": "eyJhbGci..."  }
// 后续管理端请求携带 Authorization: Bearer <token>
GET/api/admin/stats
Authorization: Bearer <admin-token>
Response 200
{
  "users":        42,
  "messages":  18350,
  "rooms":        28,
  "integrations":  6
}
PUT/api/admin/config/shortcut_save_url
Authorization: Bearer <admin-token>

{ "value": "https://www.icloud.com/shortcuts/xxxxx" }
Response 200
{ "ok": true }
// 官网快捷指令按钮将动态读取此值并覆盖默认链接
POST/api/admin/agents/agt_001/rooms/room_abc — 将 Agent 加入房间
Authorization: Bearer <admin-token>
Response 200
{ "ok": true }
// Agent 以普通成员身份加入,收到消息后异步进入 Workers Queue 处理

常见问题

部署后 WebSocket 无法连接?

检查 CORS_ORIGIN 是否包含前端域名,以及 Cloudflare Dashboard 中 Durable Objects 绑定是否正确配置。

AI Agent 没有响应?

确认 AI_API_KEY 已设置,且 AI_BASE_URL 指向正确的 OpenAI 兼容接口。可在管理后台的系统配置中临时修改模型地址测试。

修改密码后所有设备被退出登录?

这是安全机制的预期行为。修改密码时 tokenVersion 自增,所有旧 token 立即失效,需重新登录。

飞书集成显示「验证失败」?

检查飞书应用的 Encrypt KeyVerification Token 是否与 ChatHub 集成配置中填写的一致,以及 Webhook URL 是否已在飞书后台正确填写。

Gmail OAuth 授权后显示「no_email」错误?

在 Google Cloud Console 中确认已申请 userinfo.email 权限,或在授权页面勾选「查看您的电子邮件地址」。

书签面板无法加载链接预览图?

OGP 封面图由客户端按需抓取,若目标站点设置了防盗链,图片可能无法加载。这不影响书签的正常使用,仅影响封面图展示。

移动端安装报「不受信任的开发者」?

iOS 个人证书(Personal)构建需要在设置 → 通用 → VPN 与设备管理 中信任对应的开发者证书。