本文档引用的文件
本项目是一个基于 grammY 框架构建的 Telegram 机器人,专门用于摄影活动的预约管理系统。该系统实现了完整的命令路由机制、对话状态管理、用户认证流程以及与外部 Cosmoe API 的集成。
系统的核心功能包括:
项目采用模块化的文件组织方式,主要分为以下几个层次:
graph TB
subgraph "应用入口层"
A[src/index.ts]
B[src/command/index.ts]
end
subgraph "命令处理器层"
C[src/command/handlers/]
C1[start.ts]
C2[login.ts]
C3[logout.ts]
C4[events.ts]
C5[eventDetails.ts]
C6[bookEvent.ts]
C7[history.ts]
C8[cancel.ts]
end
subgraph "服务客户端层"
D[src/client/cosmoe.ts]
end
subgraph "依赖管理"
E[package.json]
end
A --> B
B --> C
C --> D
E --> A
E --> B
图表来源
章节来源
应用入口负责创建 Bot 实例、配置命令路由和设置 Webhook 回调。主要职责包括:
命令路由系统采用 grammY 的命令匹配机制,支持多种路由模式:
bot.command("command_name")bot.hears(/pattern/)bot.callbackQuery(/pattern/)系统使用 @grammyjs/conversations 插件实现复杂的多步骤交互流程,包括:
章节来源
系统采用分层架构设计,确保关注点分离和代码可维护性:
graph TB
subgraph "Telegram 层"
T[Telegram API]
U[用户交互]
end
subgraph "Bot 层"
B[grammY Bot]
R[命令路由]
C[对话管理]
end
subgraph "业务逻辑层"
H[命令处理器]
V[验证器]
M[消息格式化]
end
subgraph "数据访问层"
K[Cloudflare KV 存储]
S[会话存储]
end
subgraph "外部服务层"
P[Cosmoe API]
A[摄影活动服务]
end
T --> B
B --> R
R --> C
C --> H
H --> K
H --> S
H --> P
P --> A
U -.-> T
图表来源
/start 命令提供基础的欢迎信息和帮助菜单,是用户交互的入口点。
sequenceDiagram
participant U as 用户
participant B as Bot
participant H as start处理器
participant C as CosmoeClient
U->>B : /start
B->>H : handleStartCommand(ctx)
H->>C : 创建 CosmoeClient 实例
H->>U : 发送欢迎消息
Note over U,H : 显示可用命令列表
图表来源
章节来源
认证系统包含完整的登录和登出流程,采用对话状态管理实现多步骤交互。
sequenceDiagram
participant U as 用户
participant B as Bot
participant L as 登录处理器
participant C as CosmoeClient
participant K as KV存储
U->>B : /login
B->>L : 进入登录对话
L->>U : 请求用户名
U->>L : 输入用户名
L->>U : 请求密码
U->>L : 输入密码
L->>C : 调用getToken()
C-->>L : 返回认证结果
alt 认证成功
L->>K : 存储凭证
L->>U : 发送成功消息
else 认证失败
L->>U : 发送失败消息
end
图表来源
登出功能负责清理用户存储的认证信息,确保安全性。
章节来源
活动浏览和详情展示功能提供了完整的摄影活动信息查询和展示能力。
flowchart TD
A[收到 /events 命令] --> B[创建 CosmoeClient 实例]
B --> C[调用 getEvents()]
C --> D{响应状态检查}
D --> |成功| E[获取最新10个活动]
D --> |失败| F[发送错误消息]
E --> G[构建活动列表消息]
G --> H[发送 Markdown 格式消息]
F --> I[结束]
H --> I[结束]
图表来源
活动详情页面包含时间槽信息、价格显示和预约链接生成。
章节来源
预约系统是最复杂的功能模块,包含多个子流程和状态管理。
flowchart TD
A[收到 /book_{event_id}_{slot_index}] --> B[解析参数]
B --> C{验证用户登录}
C --> |未登录| D[提示先登录]
C --> |已登录| E[获取用户凭证]
E --> F[调用 getEventDetail]
F --> G{验证时间槽有效性}
G --> |无效| H[发送无效消息]
G --> |有效| I[检查优惠券]
I --> J{有多张优惠券?}
J --> |是| K[显示优惠券选择键盘]
J --> |否| L[直接预订]
K --> M[等待用户选择]
M --> N[处理选择结果]
N --> O[执行预订]
L --> O
H --> P[结束]
D --> P
O --> Q[发送预订结果]
Q --> P
图表来源
系统支持动态优惠券选择,提供用户友好的交互体验。
章节来源
sequenceDiagram
participant U as 用户
participant B as Bot
participant H as history处理器
participant C as CosmoeClient
participant K as KV存储
U->>B : /history
B->>H : handleHistoryCommand(ctx, env)
H->>K : 获取用户凭证
K-->>H : 返回凭证数据
H->>C : 设置凭证并验证
C->>C : 调用 getMyBookings()
C-->>H : 返回预订历史
H->>H : 格式化历史消息
H->>U : 发送历史记录
图表来源
取消预约采用双重确认机制,确保用户意图明确。
章节来源
系统依赖关系清晰,遵循单一职责原则:
graph TB
subgraph "grammY 生态系统"
G[grammy@1.39.3]
GC[@grammyjs/conversations@2.1.1]
GS[@grammyjs/storage-cloudflare@2.4.2]
end
subgraph "应用层"
A[src/index.ts]
B[src/command/index.ts]
C[src/command/handlers/]
D[src/client/cosmoe.ts]
end
subgraph "Cloudflare 平台"
CK[KV 存储]
CW[Webhook]
CS[Scheduled 任务]
end
G --> A
GC --> B
GS --> B
A --> B
B --> C
C --> D
D --> CK
A --> CW
A --> CS
图表来源
章节来源
系统采用 Cloudflare KV 存储实现高可用性和低延迟的数据访问:
问题症状:用户无法登录或登录后立即失效 可能原因:
解决方案:
问题症状:预约失败或状态不更新 可能原因:
解决方案:
问题症状:用户看到过期的活动信息 可能原因:
解决方案:
章节来源
本命令处理器系统展现了现代聊天机器人开发的最佳实践:
| 命令 | 功能描述 | 触发条件 |
|---|---|---|
| /start | 欢迎界面和帮助菜单 | 用户首次使用或手动触发 |
| /login | 用户登录认证 | 未认证用户 |
| /logout | 用户登出并清除信息 | 已认证用户 |
| /events | 查看最新摄影活动 | 任意时间 |
| /event_{id} | 查看活动详情 | 匹配活动链接 |
| /book_{eventid}{slot_index} | 预约指定时间槽 | 活动详情页面 |
| /history | 查看预约历史 | 已认证用户 |
| /cancel_{booking_id} | 取消指定预约 | 历史记录页面 |
src/command/handlers/ 下创建新文件src/command/index.ts 中注册新命令