本文档引用的文件
本项目展示了如何在 Cloudflare Workers 环境中使用 grammY 框架的插件系统,特别是 conversations 插件与 @grammyjs/storage-cloudflare 的集成。该系统实现了完整的摄影活动预约机器人功能,包括用户认证、活动浏览、时间槽选择、优惠券管理和定时通知等特性。
项目采用模块化架构,通过插件机制扩展 Bot 功能,支持对话式交互和状态持久化存储。所有插件都经过精心设计以确保最佳性能和用户体验。
项目采用清晰的分层架构,每个目录都有明确的职责分工:
graph TB
subgraph "应用入口"
A[src/index.ts] --> B[Cloudflare Worker 入口]
A --> C[Webhook 处理]
end
subgraph "命令处理层"
D[src/command/index.ts] --> E[插件安装]
D --> F[命令路由]
D --> G[对话管理]
end
subgraph "处理器模块"
H[src/command/handlers/] --> I[登录处理器]
H --> J[事件处理器]
H --> K[预订处理器]
H --> L[历史处理器]
end
subgraph "业务逻辑层"
M[src/client/cosmoe.ts] --> N[Cosmoe API 客户端]
M --> O[数据模型定义]
end
subgraph "调度服务"
P[src/scheduler/index.ts] --> Q[定时任务]
P --> R[新活动通知]
end
subgraph "配置文件"
S[wrangler.jsonc] --> T[Cloudflare 配置]
U[package.json] --> V[依赖管理]
end
图表来源
章节来源
Bot 实例是整个系统的核心,负责处理 Telegram 消息和事件。项目中使用了泛型类型 ConversationFlavor<Context> 来增强上下文对象,使其支持对话功能。
conversations 插件提供了强大的对话式交互能力,允许开发者创建多步骤的交互流程。项目中将其与 Cloudflare KV 存储集成,实现状态持久化。
专门为 Cloudflare Workers 环境设计的存储适配器,提供了 KV 命名空间的读写接口,确保对话状态在分布式环境中的一致性和可靠性。
章节来源
系统采用插件化的微架构设计,各个组件通过清晰的接口进行交互:
sequenceDiagram
participant User as 用户
participant Bot as grammY Bot
participant Conv as conversations 插件
participant Storage as Cloudflare KV
participant API as Cosmoe API
User->>Bot : 发送 /login 命令
Bot->>Conv : 进入登录对话
Conv->>Storage : 读取用户状态
Conv->>User : 请求用户名
User->>Conv : 输入用户名
Conv->>User : 请求密码
User->>Conv : 输入密码
Conv->>API : 验证凭据
API-->>Conv : 返回验证结果
Conv->>Storage : 存储用户凭据
Conv-->>User : 显示登录结果
图表来源
flowchart TD
A[Telegram 消息] --> B[Bot 处理器]
B --> C{消息类型判断}
C --> |命令消息| D[命令处理器]
C --> |文本消息| E[文本处理器]
C --> |回调查询| F[回调处理器]
D --> G[conversations 插件]
E --> H[业务逻辑处理器]
F --> I[状态更新处理器]
G --> J[KV 存储适配器]
H --> K[Cosmoe API 客户端]
I --> J
J --> L[Cloudflare KV]
K --> M[Cosmoe 服务器]
图表来源
项目实现了自定义的 KV 存储适配器,将 @grammyjs/storage-cloudflare 的功能封装为更易用的接口:
classDiagram
class ConversationStorage {
+read(key : string) Promise~any~
+write(key : string, value : any) Promise~void~
+delete(key : string) Promise~void~
}
class KvAdapter {
+read(key : string) Promise~string|undefined~
+write(key : string, value : string) Promise~void~
+delete(key : string) Promise~void~
}
class ConversationFlavor {
+conversation Conversation
}
ConversationStorage --> KvAdapter : 使用
ConversationFlavor --> ConversationStorage : 提供
图表来源
项目创建了一个专门的登录对话,展示了如何使用 createConversation 函数:
章节来源
事件处理模块展示了如何结合 conversations 插件和 API 调用来实现复杂的业务逻辑:
sequenceDiagram
participant User as 用户
participant Bot as Bot
participant Handler as 事件处理器
participant API as Cosmoe API
participant KV as KV 存储
User->>Bot : /events
Bot->>Handler : handleEventsCommand
Handler->>API : 获取活动列表
API-->>Handler : 返回活动数据
Handler->>Handler : 格式化消息
Handler-->>User : 发送活动列表
User->>Bot : /event_123
Bot->>Handler : handleEventDetails
Handler->>API : 获取活动详情
API-->>Handler : 返回活动详情
Handler->>Handler : 生成预订键盘
Handler-->>User : 发送活动详情和预订选项
图表来源
章节来源
项目实现了基于 Cloudflare Cron 触发器的定时任务,用于向注册用户推送新活动通知:
flowchart TD
A[Cron 触发器] --> B[定时任务执行]
B --> C[获取最新活动ID]
C --> D[调用 Cosmoe API]
D --> E[过滤新活动]
E --> F{有新活动?}
F --> |否| G[结束任务]
F --> |是| H[遍历注册用户]
H --> I[发送通知消息]
I --> J[更新最新活动ID]
J --> G
图表来源
章节来源
项目实现了完整的 Cosmoe API 客户端,封装了所有必要的业务操作:
classDiagram
class CosmoeClient {
-baseUrl : string
-userId : number
-token : string
+getToken(username, password) Promise~ApiResponse~
+getEvents() Promise~ApiResponse~
+getEventDetail(eventId) Promise~ApiResponse~
+getProfile() Promise~ApiResponse~
+getMyBookings() Promise~ApiResponse~
+bookEvent(request) Promise~ApiResponse~
+setCredentials(userId, token) void
+getCredentials() Object|null
+isAuthenticated() boolean
}
class ApiResponse {
+code : number
+msg : string
+data : any
}
class Event {
+id : string
+name : string
+description : string
+event_date : string
+slots : TimeSlot[]
}
CosmoeClient --> ApiResponse : 返回
CosmoeClient --> Event : 处理
图表来源
章节来源
项目使用了以下关键依赖:
graph TB
subgraph "运行时依赖"
A[grammy ^1.39.3] --> B[核心框架]
C[@grammyjs/conversations ^2.1.1] --> D[对话插件]
E[@grammyjs/storage-cloudflare ^2.4.2] --> F[KV 存储适配器]
end
subgraph "开发依赖"
G[typescript ^5.5.2] --> H[类型支持]
I[vitest ~3.2.0] --> J[测试框架]
K[wrangler ^4.59.2] --> L[Cloudflare CLI]
end
subgraph "项目特定"
M[Cosmoe API 客户端] --> N[业务逻辑]
O[Cloudflare KV] --> P[状态存储]
end
A --> C
A --> E
C --> E
M --> N
O --> P
图表来源
项目确保了所有依赖的版本兼容性:
章节来源
项目采用异步处理模式,确保高并发场景下的稳定性:
flowchart TD
A[操作开始] --> B{检查输入参数}
B --> |无效| C[返回错误响应]
B --> |有效| D[执行主要逻辑]
D --> E{操作成功?}
E --> |是| F[返回成功响应]
E --> |否| G{是否可恢复?}
G --> |是| H[重试操作]
G --> |否| I[记录错误并返回]
H --> E
对话状态丢失
对话超时
认证失败
数据格式错误
章节来源
启用详细日志记录
使用 Cloudflare Workers 开发工具
本项目展示了如何在 Cloudflare Workers 环境中有效使用 grammY 框架的插件系统。通过 conversations 插件与 @grammyjs/storage-cloudflare 的完美集成,实现了功能完整、性能优异的聊天机器人解决方案。
该系统为构建企业级聊天机器人提供了坚实的基础,可以作为其他项目的参考模板。