快速开始
ChatHub 基于 Cloudflare 全栈原生架构,无需自建服务器。整个部署过程通过 CI/CD 流水线自动完成,从 Fork 到上线通常只需几分钟。
前提条件
- 一个 Cloudflare 账号(免费计划即可启动)
- 一个 Azure DevOps 或 GitHub 仓库用于 CI/CD
- (可选)AI 模型 API Key,用于 AI Agent 功能
部署步骤
Fork 代码仓库
将 ChatHub 仓库 Fork 到你的 GitHub 或 Azure DevOps,无需本地 Node.js 环境。
创建 Cloudflare 资源
在 Cloudflare Dashboard 中依次创建:D1 数据库、R2 存储桶、Workers & Pages 项目,记录各自的 ID。
配置 CI/CD 变量
在流水线的 Variable Groups 中填入 CLOUDFLARE_API_TOKEN、JWT_SECRET、ENCRYPTION_KEY 等密钥(详见下方环境变量表)。
触发首次部署
推送代码到 main 分支,流水线将自动执行:D1 数据库迁移 → Worker 部署 → Pages 构建发布,全程约 3 分钟。
注册第一个账号
访问部署好的 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 | 类型 | 说明 |
|---|---|---|
DB | D1 Database | 主数据库,binding name: qq-db |
CHAT_ROOM | Durable Object | ChatRoom DO,处理 WebSocket 实时消息 |
BRIDGE_HUB | Durable Object | BridgeHub DO,处理微信 Bridge 连接 |
AGENT_QUEUE | Queue | AI 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)
可邀请多名成员,支持管理员角色,无人数硬性上限。
好友系统
- 通过用户名搜索目标用户
- 发送好友申请,对方收到实时通知
- 双方接受后即可发起私聊或拉入群组
消息类型
| 类型 | 说明 |
|---|---|
text | 普通文本消息,支持 URL 链接自动预览 |
file | 文件/图片/视频附件,存储于 R2 |
poll | 投票消息,由 AI Agent 或用户发起 |
call | 音视频通话记录消息 |
实时通知
每个用户有独立的通知频道 notify:{userId},用于接收好友申请、系统消息等非房间级推送,断线后自动重连。
文件 & 媒体
文件上传存储于 Cloudflare R2,支持多种格式的在线预览,视频内容支持应用内嵌播放。
支持的预览格式
| 类型 | 格式 | 预览方式 |
|---|---|---|
| 图片 | JPG、PNG、GIF、WebP、SVG | 应用内全屏查看器 |
| 视频 | MP4、WebM | 内嵌播放器 |
| 文档 | iframe 内嵌预览 | |
| Office | DOCX、XLSX、PPTX | Microsoft 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 元数据,生成预览卡片,包含标题、描述、封面图。特殊平台有专属解析:
- 小红书:多图轮播 + 视频 + 评论展示
- 微信文章:正文全文解析,支持图文混排
- 汽水音乐:品牌卡片 + 应用内嵌播放器
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 提案接受率。
平台集成
ChatHub 支持飞书、钉钉、企业微信、Slack 四大平台的消息双向同步,外部消息自动映射到 ChatHub 房间。
通用配置流程
在平台创建应用
登录对应平台的开发者后台,创建自定义应用,获取 App ID 和 App Secret。
配置 Webhook
在 ChatHub 集成管理页面添加集成,填入 App ID 和 App Secret,复制生成的 Webhook URL。
填入平台应用
将 Webhook URL 填入对应平台的事件订阅设置,配置需要订阅的消息事件。
绑定房间
在 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 配置
Google Cloud Console
创建项目 → 启用 Gmail API → 配置 OAuth 2.0 凭据,重定向 URI 填写:
https://your-worker.workers.dev/api/email/google/callback
配置 Worker Secrets
将 GOOGLE_CLIENT_ID 和 GOOGLE_CLIENT_SECRET 添加到 Worker 密钥。
授权绑定
在 ChatHub 邮件面板点击「添加 Gmail 账号」,完成 OAuth 授权后即可使用。
Outlook 配置
Azure App Registrations
注册应用 → 添加 Microsoft Graph 权限(Mail.Read、Mail.Send、Mail.ReadWrite)→ 配置重定向 URI:
https://your-worker.workers.dev/api/email/microsoft/callback
配置 Worker Secrets
将 MICROSOFT_CLIENT_ID 和 MICROSOFT_CLIENT_SECRET 添加到 Worker 密钥。
授权绑定
在 ChatHub 邮件面板点击「添加 Outlook 账号」完成授权。
功能说明
- 多文件夹:收件箱 / 已发送 / 草稿箱自由切换
- 写信:填写收件人、主题、正文后一键发送
- 附件预览:图片、PDF 等文件支持应用内预览,复用 FilePreviewModal
- 删除邮件:详情页内联二次确认,删除后自动跳转上一封或下一封
- Token 自动刷新:access_token 过期前 5 分钟自动静默刷新,无需重新授权
- 安全存储:access_token 和 refresh_token 经 AES-GCM 加密存储
微信 Bridge
通过手机端配对,将微信消息桥接到 ChatHub,实现微信消息的统一管理和存档。
工作原理
Bridge 功能由 BridgeHub Durable Object 驱动。手机端 App 扫码配对后,与 BridgeHub 建立持久 WebSocket 连接,微信消息实时转发到对应的 ChatHub 房间。
配对步骤
安装 Bridge App
在 iPhone 上安装 ChatHub Bridge App(packages/bridge-app)。
扫码配对
在 ChatHub Web 设置页面找到「微信 Bridge」,点击生成配对码,使用 Bridge App 扫码完成配对。
绑定房间
为微信联系人或群组绑定对应的 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 无缝打通。
安装
加载扩展
打开 Chrome → 扩展程序 → 开发者模式 → 加载已解压的扩展程序 → 选择 packages/extension 目录。
登录账号
点击扩展图标,输入 ChatHub 地址和账号密码完成登录。
功能
- 一键收藏:点击扩展图标,将当前页面 URL 和标题保存到 ChatHub 书签
- 批量同步:将 Chrome 浏览器书签批量导入 ChatHub,每批 100 条,上限 2000 条/次
Apple 快捷指令
通过 iOS 快捷指令,在任意 App 的分享菜单中一键将链接保存到 ChatHub 书签,全程约 1 秒。
快捷指令说明
ChatHub 初始化
首次使用必须运行一次。将用户名和密码安全写入 iOS 钥匙串,供「保存到 ChatHub」自动读取。
保存到 ChatHub
添加到分享菜单后,在抖音、微信、Safari 等 App 分享时调用,自动提取链接并保存。
安装步骤
下载「ChatHub 初始化」快捷指令
前往官网快捷指令区下载,安装后打开「快捷指令」App 运行一次,输入用户名和密码。
下载「保存到 ChatHub」快捷指令
安装后在「快捷指令」App 中长按该快捷指令 → 「添加到分享菜单」。
开始使用
在任意 App 点击「分享」→ 找到「保存到 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:send | content, msgType, fileId? | 发送消息,msgType 为 text / file / poll |
user:typing | — | 通知他人正在输入 |
presence:ping | — | 心跳保活,每 20 秒发送一次 |
call:offer | targetUserId, sdp | 发起音视频通话邀请 |
call:answer | targetUserId, sdp | 接受通话,回传 SDP Answer |
call:ice | targetUserId, candidate | 传递 ICE candidate |
call:end | targetUserId | 挂断通话 |
服务器 → 客户端
| 消息类型 | 字段 | 说明 |
|---|---|---|
message:new | message: Message | 新消息推送 |
user:typing | userId, username | 某用户正在输入 |
presence:join | userId, username | 用户进入房间 |
presence:leave | userId, username | 用户离开房间 |
message:read | messageId, userId | 消息已读回执 |
contact:request | fromUserId, fromUsername | 收到好友申请(通知频道) |
agent:action | action: AgentAction | AI 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 |
▶ 调用示例
{
"email": "alice@example.com",
"username": "alice",
"password": "MyP@ssw0rd"
}
{ "ok": true, "userId": "usr_01abc" }
{
"email": "alice@example.com",
"password": "MyP@ssw0rd"
}
{
"token": "eyJhbGciOiJIUzI1NiJ9...",
"user": {
"id": "usr_01abc",
"username": "alice",
"email": "alice@example.com"
}
}
用户 /api/users
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /api/users/search?q= | JWT | 按用户名搜索用户 |
GET | /api/users/:id | JWT | 获取指定用户的公开信息 |
PATCH | /api/users/me | JWT | 更新当前用户名 / 头像 |
PATCH | /api/users/me/password | JWT | 修改密码,旧 token 立即失效(tokenVersion +1) |
▶ 调用示例
Authorization: Bearer <token>
{
"users": [
{ "id": "usr_01abc", "username": "alice", "avatarUrl": null }
]
}
Authorization: Bearer <token>
{ "username": "alice_new" }
{ "ok": true }
Authorization: Bearer <token>
{ "oldPassword": "OldP@ss", "newPassword": "NewP@ss" }
{ "ok": true }
// 注意:当前 token 立即失效,需使用新密码重新登录
联系人 /api/contacts
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /api/contacts | JWT | 获取已接受的联系人列表 |
GET | /api/contacts/pending | JWT | 获取待处理的好友申请 |
POST | /api/contacts | JWT | 发送好友申请,对方实时收到通知 |
PATCH | /api/contacts/:friendId/accept | JWT | 接受好友申请 |
DELETE | /api/contacts/:friendId | JWT | 删除联系人 |
▶ 调用示例
Authorization: Bearer <token>
{ "friendId": "usr_02xyz" }
{ "ok": true }
// 对方通过通知频道实时收到 { type: "contact:request", fromUserId, fromUsername }
Authorization: Bearer <token>
{ "ok": true }
// 双方 contacts 表各自写入一条 accepted 记录
Authorization: Bearer <token>
{
"contacts": [
{ "id": "usr_02xyz", "username": "bob", "avatarUrl": null }
]
}
房间 /api/rooms
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /api/rooms | JWT | 获取当前用户的会话列表 |
POST | /api/rooms | JWT | 创建群组(name + memberIds[]) |
POST | /api/rooms/direct | JWT | 创建私聊,目标必须是已接受的联系人 |
PATCH | /api/rooms/:id | JWT 管理员 | 更新房间名称 / 头像 |
DELETE | /api/rooms/:id | JWT 管理员 | 解散房间 |
GET | /api/rooms/:id/members | JWT | 获取房间成员列表 |
POST | /api/rooms/:id/members | JWT 管理员 | 邀请成员加入房间 |
DELETE | /api/rooms/:id/members/:userId | JWT 管理员 | 移除成员 |
▶ 调用示例
Authorization: Bearer <token>
{ "name": "产品团队", "memberIds": ["usr_02xyz", "usr_03def"] }
{ "room": { "id": "room_abc", "name": "产品团队", "type": "group" } }
Authorization: Bearer <token>
{ "targetUserId": "usr_02xyz" }
{ "room": { "id": "room_xyz", "type": "direct" } }
Authorization: Bearer <token>
{
"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/edit | JWT 发送者 | 编辑消息内容 |
PATCH | /api/messages/:messageId/recall | JWT 发送者 | 撤回消息 |
PATCH | /api/messages/:messageId/preview | JWT | 更新消息的链接预览数据(OGP) |
POST | /api/messages/:messageId/feedback | JWT | 消息反馈(👍 / 👎),用于 Agent 学习 |
▶ 调用示例
Authorization: Bearer <token>
{
"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 表示已到最早
}
Authorization: Bearer <token>
{ "content": "部署完成 ✅(已验证)" }
{ "ok": true }
// 房间内所有在线成员通过 WS 收到 { type: "message:edit", messageId, content }
Authorization: Bearer <token>
{ "ok": true }
// WS 广播 { type: "message:recall", messageId }
文件 /api/files
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
POST | /api/files/upload | JWT | 上传文件,multipart/form-data,返回 fileId |
GET | /api/files/:key | — | 获取文件内容(R2 代理) |
▶ 调用示例
Authorization: Bearer <token>
Content-Type: multipart/form-data
file=@/path/to/photo.jpg
{
"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/integrations | JWT | 获取当前用户的集成列表 |
POST | /api/integrations | JWT | 创建集成(platform + appId + appSecret) |
GET | /api/integrations/:id | JWT | 获取集成详情 |
PUT | /api/integrations/:id | JWT | 更新集成配置 |
DELETE | /api/integrations/:id | JWT | 删除集成 |
GET | /api/integrations/:id/channels | JWT | 获取集成绑定的渠道(房间映射)列表 |
POST | /api/integrations/:id/file-server | JWT | 为集成配置飞书文件服务器 |
DELETE | /api/integrations/:id/file-server | JWT | 移除飞书文件服务器配置 |
▶ 调用示例
Authorization: Bearer <token>
{
"platform": "feishu",
"name": "我的飞书机器人",
"appId": "cli_xxxxxxxxxx",
"appSecret": "xxxxxxxxxxxxxxxx"
}
{
"integration": {
"id": "int_001",
"platform": "feishu",
"name": "我的飞书机器人",
"webhookUrl": "https://worker.dev/webhook/feishu?integrationId=int_001"
}
}
// 将 webhookUrl 填入飞书应用的「事件订阅」请求地址
Webhooks /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/:messageId | JWT | 获取投票详情及当前结果 |
POST | /api/polls/:messageId/vote | JWT | 提交投票(optionIndex),每人每条投票只能投一次 |
▶ 调用示例
Authorization: Bearer <token>
{
"poll": {
"question": "本周发版时间?",
"options": ["周三", "周四", "周五"],
"votes": [3, 1, 2],
"myVote": 0 // 当前用户已选索引,null 表示未投
}
}
Authorization: Bearer <token>
{ "optionIndex": 0 }
{ "ok": true }
// WS 广播最新票数给房间所有成员
AI Agent /api/agent-actions
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /api/agent-actions/tasks | JWT | 获取房间任务列表(?roomId=) |
PATCH | /api/agent-actions/tasks/:taskId | JWT | 更新任务状态(todo → done) |
POST | /api/agent-actions/:actionId/feedback | JWT | 接受或拒绝 Agent 提案(status: accepted | rejected) |
▶ 调用示例
Authorization: Bearer <token>
{
"tasks": [
{ "id": "task_001", "title": "抖音下载生产环境验证", "status": "todo", "createdAt": "..." },
{ "id": "task_002", "title": "邮件 Tab 上线验收", "status": "done", "createdAt": "..." }
]
}
Authorization: Bearer <token>
{ "status": "done" }
{ "ok": true }
Authorization: Bearer <token>
{ "status": "accepted" } // 或 "rejected"
{ "ok": true }
// accepted 时 Agent 会继续执行被提案的操作(如发送消息/创建任务)
消息书签 /api/bookmarks
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /api/bookmarks | JWT | 获取已收藏的消息列表(含消息原文) |
GET | /api/bookmarks/ids | JWT | 获取已收藏消息的 ID 集合(用于前端高亮) |
POST | /api/bookmarks/:messageId | JWT | 收藏消息,幂等操作,重复收藏不报错 |
DELETE | /api/bookmarks/:messageId | JWT | 取消收藏 |
▶ 调用示例
Authorization: Bearer <token>
{ "ok": true, "bookmarkId": "bm_xyz" }
Authorization: Bearer <token>
{ "ids": ["msg_001", "msg_005", "msg_012"] }
// 前端用此列表在消息气泡上显示收藏标记
URL 书签 /api/url-bookmarks
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /api/url-bookmarks | JWT | 获取 URL 书签列表(支持分页和搜索) |
POST | /api/url-bookmarks | JWT | 新增单条 URL 书签 |
POST | /api/url-bookmarks/batch | JWT | 批量导入书签,每批 100 条,最多 2000 条 |
POST | /api/url-bookmarks/:id/refresh | JWT | 重新抓取 OGP 元数据(标题 / 描述 / 封面图) |
PATCH | /api/url-bookmarks/:id/meta | JWT | 手动修改书签标题 / 描述 |
POST | /api/url-bookmarks/:id/forward | JWT | 将书签链接转发到指定会话 |
DELETE | /api/url-bookmarks/:id | JWT | 删除书签 |
▶ 调用示例
Authorization: Bearer <token>
{ "url": "https://mp.weixin.qq.com/s/xxxxx" }
{
"bookmark": {
"id": "ubm_001",
"url": "https://mp.weixin.qq.com/s/xxxxx",
"title": null, // OGP 异步抓取,稍后填充
"image": null
}
}
Authorization: Bearer <token>
{
"urls": [
"https://example.com/article-1",
"https://example.com/article-2"
]
}
{ "inserted": 2, "skipped": 0 }
// skipped 为已存在的重复 URL 数量
Authorization: Bearer <token>
{ "roomId": "room_abc" }
{ "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 降级策略) |
▶ 调用示例
Authorization: Bearer <token>
{
"title": "示例文章标题",
"description": "这是文章的描述摘要...",
"image": "https://example.com/og-image.jpg",
"favicon": "https://example.com/favicon.ico",
"siteName": "Example"
}
Authorization: Bearer <token>
{
"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/:provider | JWT | 获取 OAuth 授权链接(provider: google | microsoft) |
GET | /api/email/auth/:provider/callback | — | OAuth 授权回调,写入 token 后重定向前端 |
GET | /api/email/accounts | JWT | 获取已绑定的邮件账号列表 |
DELETE | /api/email/accounts/:id | JWT | 解绑邮件账号 |
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/read | JWT | 标记邮件为已读 |
POST | /api/email/messages/send | JWT | 发送邮件(to / subject / body / accountId) |
POST | /api/email/messages/:id/reply | JWT | 回复邮件 |
DELETE | /api/email/messages/:id?accountId= | JWT | 删除邮件(移入回收站) |
GET | /api/email/messages/:id/attachment/:attId | JWT | 下载 / 预览附件 |
▶ 调用示例
Authorization: Bearer <token>
{ "url": "https://accounts.google.com/o/oauth2/v2/auth?client_id=...&state=..." }
// 前端跳转此 URL,用户授权后回调写入 token
Authorization: Bearer <token>
{
"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 表示最后一页
}
Authorization: Bearer <token>
{
"accountId": "eacc_001",
"to": "colleague@example.com",
"subject": "会议纪要",
"body": "<p>附上本次会议纪要,请查阅。</p>"
}
{ "ok": true }
Authorization: Bearer <token>
{
"accountId": "eacc_001",
"body": "<p>收到,准时参加。</p>"
}
{ "ok": true }
微信 Bridge /api/bridge
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
POST | /api/bridge/pair | JWT | 生成配对码,Bridge App 扫码后完成设备绑定 |
GET | /api/bridge/status | JWT | 查询 Bridge 设备在线状态 |
GET | /api/bridge/rooms | JWT | 获取 Bridge 房间映射列表 |
POST | /api/bridge/forward | JWT | 通过 Bridge 向微信转发消息 |
▶ 调用示例
Authorization: Bearer <token>
{
"pairCode": "AB12CD", // Bridge App 扫描此码完成配对
"expiresIn": 300 // 有效期(秒)
}
Authorization: Bearer <token>
{
"online": true,
"deviceName": "Alice 的 iPhone",
"lastSeen": "2026-05-03T09:55:00Z"
}
飞书 OAuth /auth/feishu
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /auth/feishu/url | JWT | 获取飞书 OAuth 授权跳转链接 |
GET | /auth/feishu/callback | — | 飞书 OAuth 回调,写入用户 token |
GET | /auth/feishu/status | JWT | 查询当前飞书授权状态 |
DELETE | /auth/feishu/revoke | JWT | 撤销飞书授权并删除本地 token |
抖音 OAuth /auth/douyin
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /auth/douyin/url | JWT | 获取抖音 OAuth 授权链接 |
GET | /auth/douyin/callback | — | 抖音 OAuth 回调 |
GET | /auth/douyin/whitelist-callback | — | 测试白名单授权回调 |
GET | /auth/douyin/status | JWT | 查询当前抖音授权状态 |
DELETE | /auth/douyin/revoke | JWT | 撤销抖音授权 |
抖音数据 /api/douyin
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET | /api/douyin/account | JWT | 获取绑定的抖音账号信息 |
PATCH | /api/douyin/account | JWT | 更新抖音账号设置 |
GET | /api/douyin/videos | JWT | 获取账号视频列表(含统计数据) |
POST | /api/douyin/sync | JWT | 主动触发抖音数据同步 |
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/agents | Agent 列表 |
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 模型列表 |
▶ 调用示例
{ "secret": "your-admin-secret" }
{ "token": "eyJhbGci..." }
// 后续管理端请求携带 Authorization: Bearer <token>
Authorization: Bearer <admin-token>
{
"users": 42,
"messages": 18350,
"rooms": 28,
"integrations": 6
}
Authorization: Bearer <admin-token>
{ "value": "https://www.icloud.com/shortcuts/xxxxx" }
{ "ok": true }
// 官网快捷指令按钮将动态读取此值并覆盖默认链接
Authorization: Bearer <admin-token>
{ "ok": true }
// Agent 以普通成员身份加入,收到消息后异步进入 Workers Queue 处理
常见问题
部署后 WebSocket 无法连接?
检查 CORS_ORIGIN 是否包含前端域名,以及 Cloudflare Dashboard 中 Durable Objects 绑定是否正确配置。
AI Agent 没有响应?
确认 AI_API_KEY 已设置,且 AI_BASE_URL 指向正确的 OpenAI 兼容接口。可在管理后台的系统配置中临时修改模型地址测试。
修改密码后所有设备被退出登录?
这是安全机制的预期行为。修改密码时 tokenVersion 自增,所有旧 token 立即失效,需重新登录。
飞书集成显示「验证失败」?
检查飞书应用的 Encrypt Key 和 Verification Token 是否与 ChatHub 集成配置中填写的一致,以及 Webhook URL 是否已在飞书后台正确填写。
Gmail OAuth 授权后显示「no_email」错误?
在 Google Cloud Console 中确认已申请 userinfo.email 权限,或在授权页面勾选「查看您的电子邮件地址」。
书签面板无法加载链接预览图?
OGP 封面图由客户端按需抓取,若目标站点设置了防盗链,图片可能无法加载。这不影响书签的正常使用,仅影响封面图展示。
移动端安装报「不受信任的开发者」?
iOS 个人证书(Personal)构建需要在设置 → 通用 → VPN 与设备管理 中信任对应的开发者证书。