本文档引用的文件
Cosmoe Bot 是一个基于 Cloudflare Workers 和 Grammy 框架构建的 Telegram 机器人应用。该系统为摄影活动管理提供了完整的解决方案,包括用户认证、活动浏览、在线预约、历史记录查询等功能。系统采用模块化设计,通过三个核心组件实现不同的功能职责:主入口模块负责系统协调和初始化,命令处理器系统提供插件化的对话式交互,调度器独立处理定时任务和事件通知。
项目采用按功能模块组织的结构,主要分为以下层次:
graph TB
subgraph "核心入口层"
Main[src/index.ts 主入口]
Scheduler[scheduler/index.ts 调度器]
end
subgraph "命令处理层"
CommandRoot[command/index.ts 核心]
Handlers[handlers/ 命令处理器]
end
subgraph "客户端层"
Client[client/cosmoe.ts API客户端]
end
subgraph "配置层"
Package[package.json 依赖]
Wrangler[wrangler.jsonc 配置]
end
Main --> CommandRoot
Main --> Scheduler
CommandRoot --> Handlers
CommandRoot --> Client
Scheduler --> Client
Handlers --> Client
Package --> Main
Wrangler --> Main
图表来源
章节来源
主入口模块是整个系统的协调者和控制中心,负责初始化 bot 实例、注册命令处理器、设置 webhook 回调以及处理定时任务。该模块实现了 Cloudflare Worker 的标准接口,支持 HTTP 请求和 Cron 触发的任务执行。
关键职责:
接口设计:
fetch() 方法处理 HTTP 请求scheduled() 方法处理 Cron 任务章节来源
命令处理器系统采用插件化设计,基于 Grammy 的 conversations 插件实现对话状态管理。该系统支持多种命令类型和交互模式,包括简单命令、正则表达式匹配、内联键盘回调等。
核心特性:
扩展点:
章节来源
调度器是一个独立运行的服务,专门处理定时任务和事件通知。它与主入口模块分离,确保定时任务不会影响主服务的响应性。
主要功能:
章节来源
系统采用分层架构设计,通过清晰的职责分离实现高内聚低耦合:
graph TB
subgraph "外部接口层"
Telegram[Telegram Bot API]
Cron[Cron 任务触发器]
end
subgraph "协调管理层"
MainEntry[主入口模块]
CommandSystem[命令处理器系统]
Scheduler[调度器]
end
subgraph "业务逻辑层"
LoginHandler[登录处理器]
EventsHandler[活动处理器]
BookingHandler[预约处理器]
HistoryHandler[历史处理器]
CancelHandler[取消处理器]
LogoutHandler[登出处理器]
end
subgraph "数据访问层"
CosmoeAPI[Cosmoe API]
KVStorage[KV 存储]
CredentialsKV[凭证存储]
end
Telegram --> MainEntry
Cron --> Scheduler
MainEntry --> CommandSystem
CommandSystem --> LoginHandler
CommandSystem --> EventsHandler
CommandSystem --> BookingHandler
CommandSystem --> HistoryHandler
CommandSystem --> CancelHandler
CommandSystem --> LogoutHandler
LoginHandler --> CosmoeAPI
EventsHandler --> CosmoeAPI
BookingHandler --> CosmoeAPI
HistoryHandler --> CosmoeAPI
CancelHandler --> CosmoeAPI
LoginHandler --> CredentialsKV
BookingHandler --> KVStorage
HistoryHandler --> KVStorage
Scheduler --> CosmoeAPI
Scheduler --> KVStorage
Scheduler --> CredentialsKV
图表来源
主入口模块实现了 Cloudflare Worker 的标准生命周期方法,提供完整的 Telegram 机器人服务:
sequenceDiagram
participant Telegram as Telegram Bot
participant Main as 主入口模块
participant Command as 命令系统
participant Scheduler as 调度器
Telegram->>Main : HTTP 请求
Main->>Main : 初始化 Bot 实例
Main->>Command : 注册命令处理器
Command-->>Main : 命令注册完成
Main->>Telegram : 设置命令菜单
Main->>Main : 创建 webhook 回调
Main-->>Telegram : 返回响应
Note over Scheduler : Cron 触发
Scheduler->>Main : 定时任务调用
Main->>Scheduler : 处理调度事件
Scheduler-->>Main : 任务完成
图表来源
实现特点:
章节来源
命令处理器系统采用模块化设计,每个命令都有独立的处理器文件:
classDiagram
class CommandSystem {
+setupCommands(bot, env)
+handleStartCommand(ctx)
+handleLoginCommand(ctx)
+handleEventsCommand(ctx)
+handleEventDetails(ctx)
+handleBookEvent(ctx, env)
+handleHistoryCommand(ctx, env)
+handleCancelCommand(ctx, env)
+handleLogoutCommand(ctx, env)
}
class LoginHandler {
+handleInteractiveLogin(conversation, ctx, env)
+validateCredentials(username, password)
+storeCredentials(userId, token)
}
class EventsHandler {
+handleEventsCommand(ctx)
+formatEventsList(events)
}
class BookingHandler {
+handleBookEvent(ctx, env)
+proceedWithBooking(ctx, client, event, slot, coupon)
+handleCouponSelection(ctx, env, action)
}
class HistoryHandler {
+handleHistoryCommand(ctx, env)
+formatBookingHistory(bookings)
}
class CancelHandler {
+handleCancelCommand(ctx, env)
+handleCancelConfirmation(ctx, env, action)
}
class LogoutHandler {
+handleLogoutCommand(ctx, env)
+clearUserCredentials(userId)
}
CommandSystem --> LoginHandler : "委托"
CommandSystem --> EventsHandler : "委托"
CommandSystem --> BookingHandler : "委托"
CommandSystem --> HistoryHandler : "委托"
CommandSystem --> CancelHandler : "委托"
CommandSystem --> LogoutHandler : "委托"
图表来源
对话状态管理机制:
flowchart TD
Start([用户输入 /login]) --> EnterConversation["进入登录对话"]
EnterConversation --> AskUsername["询问用户名"]
AskUsername --> WaitUsername["等待用户名输入"]
WaitUsername --> AskPassword["询问密码"]
AskPassword --> WaitPassword["等待密码输入"]
WaitPassword --> Authenticate["验证用户凭据"]
Authenticate --> AuthSuccess{"认证成功?"}
AuthSuccess --> |是| StoreCredentials["存储用户凭证"]
AuthSuccess --> |否| ShowError["显示认证失败消息"]
StoreCredentials --> Success["登录成功"]
ShowError --> End([结束])
Success --> End
图表来源
章节来源
调度器专注于处理定时任务,特别是新活动的通知功能:
sequenceDiagram
participant Cron as Cron 触发器
participant Scheduler as 调度器
participant CosmoeAPI as Cosmoe API
participant KVStorage as KV 存储
participant Users as 用户列表
participant Telegram as Telegram API
Cron->>Scheduler : 每分钟触发
Scheduler->>CosmoeAPI : 获取所有活动
CosmoeAPI-->>Scheduler : 返回活动列表
Scheduler->>KVStorage : 读取最新活动ID
KVStorage-->>Scheduler : 返回存储的ID
Scheduler->>Scheduler : 过滤新活动
Scheduler->>Users : 获取所有注册用户
loop 对于每个新活动
loop 对于每个用户
Scheduler->>Telegram : 发送通知消息
Telegram-->>Scheduler : 确认发送结果
end
end
Scheduler->>KVStorage : 更新最新活动ID
图表来源
核心算法流程:
flowchart TD
Start([定时任务启动]) --> LoadConfig["加载配置和凭据"]
LoadConfig --> FetchEvents["获取所有活动"]
FetchEvents --> CheckResult{"获取成功?"}
CheckResult --> |否| LogError["记录错误日志"]
CheckResult --> |是| LoadLastId["加载上次最新活动ID"]
LoadLastId --> FilterNewEvents["过滤新活动"]
FilterNewEvents --> HasNew{"有新活动?"}
HasNew --> |否| Complete["任务完成"]
HasNew --> |是| GetRegisteredUsers["获取注册用户列表"]
GetRegisteredUsers --> NotifyUsers["向用户发送通知"]
NotifyUsers --> UpdateLastId["更新最新活动ID"]
UpdateLastId --> Complete
LogError --> Complete
图表来源
章节来源
Cosmoe API 客户端提供了完整的 API 封装,支持用户认证、活动管理、预约处理等功能:
classDiagram
class CosmoeClient {
-baseUrl : string
-userId : number
-token : string
+getToken(username, password)
+setCredentials(userId, token)
+getCredentials()
+isAuthenticated()
+getEvents()
+getEventDetail(eventId)
+getProfile()
+getMyBookings()
+bookEvent(bookingRequest)
+getAvailableCoupons(eventId)
+cancelBooking(bookingId)
+updatePaymentOrder(bookingId, orderId)
+updateBookingNote(bookingId, note)
+selfReschedule(bookingId, newTimeSlot)
+selfTransfer(bookingId, recipientUsername)
+register(key, username, email, password, userIdentity)
}
class Event {
+id : string
+name : string
+description : string
+event_date : string
+cover_image_url : string
+description_brief : string
}
class EventDetail {
+id : number
+name : string
+description : string
+event_date : string
+time_slots_with_prices : string
+cover_image_url : string
+detail_image_urls : string
+slots : TimeSlot[]
}
class TimeSlot {
+range : string
+price : string
+capacity : number
+remaining : number
}
class Booking {
+id : number
+status : string
+booking_date : string
+time_slot : string
+final_price : string
+payment_order_id : string
+notes_by_user : string
}
CosmoeClient --> Event : "返回"
CosmoeClient --> EventDetail : "返回"
CosmoeClient --> TimeSlot : "包含"
CosmoeClient --> Booking : "返回"
图表来源
章节来源
系统依赖关系清晰明确,遵循单一职责原则:
graph TB
subgraph "外部依赖"
Grammy[grammy ^1.39.3]
Conversations[@grammyjs/conversations ^2.1.1]
StorageCloudflare[@grammyjs/storage-cloudflare ^2.4.2]
Wrangler[wrangler ^4.59.2]
end
subgraph "内部模块"
MainModule[src/index.ts]
CommandModule[src/command/index.ts]
SchedulerModule[src/scheduler/index.ts]
ClientModule[src/client/cosmoe.ts]
HandlerModules[src/command/handlers/*]
end
subgraph "Cloudflare 平台"
KVNamespace[KV Namespace]
CronTrigger[Cron Trigger]
Webhook[Webhook Callback]
end
MainModule --> CommandModule
MainModule --> SchedulerModule
CommandModule --> HandlerModules
CommandModule --> ClientModule
SchedulerModule --> ClientModule
HandlerModules --> ClientModule
MainModule --> KVNamespace
SchedulerModule --> KVNamespace
MainModule --> CronTrigger
MainModule --> Webhook
ClientModule --> CosmoeAPI[Cosmoe API]
图表来源
依赖特性:
章节来源
Webhook 配置问题:
KV 存储访问失败:
API 调用超时:
章节来源
Cosmoe Bot 项目展现了优秀的软件架构设计,通过三个核心组件实现了清晰的职责分离和良好的扩展性。主入口模块作为系统协调者,命令处理器系统提供灵活的插件化交互,调度器独立处理定时任务,形成了高效稳定的整体架构。
设计优势:
扩展建议: