本文引用的文件
Cosmoe Bot 是一个基于 Cloudflare Workers 的 Telegram 摄影活动预约管理机器人。它通过与 Cosmoe 摄影平台的 API 集成,为用户提供便捷的活动浏览、登录认证、在线预约与取消、预约历史查询等功能,并支持定时任务推送新活动通知。项目采用 TypeScript 开发,结合 grammY 框架与 Cloudflare Workers 平台,具备高扩展性与低运维成本。
项目采用按功能模块划分的目录组织方式,核心入口位于 src/index.ts,命令路由与处理器集中在 src/command 下,客户端封装在 src/client 中,定时任务逻辑位于 src/scheduler。Wrangler 作为部署与配置工具,tsconfig 提供类型检查与编译选项,test 目录包含单元与集成测试。
graph TB
A["src/index.ts<br/>Worker 入口与 Webhook"] --> B["src/command/index.ts<br/>命令注册与对话插件"]
B --> C["src/command/handlers/*.ts<br/>命令处理器"]
A --> D["src/scheduler/index.ts<br/>定时任务"]
C --> E["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
F["wrangler.jsonc<br/>部署与触发器配置"] --> A
G["tsconfig.json<br/>TypeScript 编译配置"] --> A
H["test/index.spec.ts<br/>测试用例"] --> A
图表来源
章节来源
章节来源
下图展示了从 Telegram 用户到 Cloudflare Workers、grammY、KV 存储与外部 Cosmoe API 的整体数据流与控制流。
sequenceDiagram
participant U as "Telegram 用户"
participant W as "Cloudflare Worker<br/>src/index.ts"
participant CMD as "命令系统<br/>src/command/index.ts"
participant CONV as "对话插件<br/>conversations"
participant KV as "KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"
participant API as "Cosmoe API 客户端<br/>src/client/cosmoe.ts"
participant S as "定时任务<br/>src/scheduler/index.ts"
U->>W : 发送命令/消息
W->>CMD : 路由到对应处理器
CMD->>CONV : 进入对话如登录
CONV->>KV : 读写对话状态
CMD->>API : 调用 Cosmoe API
API-->>CMD : 返回结果
CMD-->>U : 发送回复/内联键盘
S->>API : 拉取活动列表
API-->>S : 返回活动数据
S->>KV : 读取/更新最新活动ID
S-->>U : 推送新活动通知
图表来源
错误处理
API 调用异常时捕获并反馈错误信息。
flowchart TD
Start(["进入命令处理"]) --> Route{"匹配命令/正则/回调"}
Route --> |"/login"| LoginConv["进入登录对话"]
Route --> |"/events"| EventsList["获取活动列表并展示"]
Route --> |"/event_{id}"| EventDetail["获取活动详情并展示时段"]
Route --> |"/book_{event}_{slot}"| BookFlow["校验余量/优惠券并下单"]
Route --> |"/history"| History["获取并格式化历史记录"]
Route --> |"/cancel_{id}"| CancelFlow["生成确认内联键盘"]
Route --> |回调: 确认/优惠券选择| ConfirmOrCoupon["执行确认或优惠券选择"]
LoginConv --> End(["结束"])
EventsList --> End
EventDetail --> End
BookFlow --> End
History --> End
CancelFlow --> End
ConfirmOrCoupon --> End
图表来源
章节来源
错误处理
未认证调用抛出错误;KV 读写失败记录日志并提示用户。
classDiagram
class CosmoeClient {
+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, newSlot)
+selfTransfer(bookingId, recipient)
+changePassword(current, new)
+register(key, username, email, password, identity)
}
图表来源
章节来源
关键流程
拉取活动列表 → 过滤新活动 → 遍历已登录用户 → 发送通知 → 更新最新活动ID。
flowchart TD
Tick["定时触发"] --> LoadLast["读取最新活动ID"]
LoadLast --> Fetch["拉取活动列表"]
Fetch --> Filter{"过滤新活动"}
Filter --> |有| Notify["遍历已登录用户并发送通知"]
Filter --> |无| End["结束"]
Notify --> Update["更新最新活动ID"]
Update --> End
图表来源
章节来源
章节来源
项目脚本
cf-typegen:生成 Cloudflare 类型定义。
graph LR
P["package.json"] --> G["grammy"]
P --> C["@grammyjs/conversations"]
P --> K["@grammyjs/storage-cloudflare"]
P --> W["wrangler"]
P --> V["vitest"]
P --> T["typescript"]
图表来源
章节来源
章节来源
Cosmoe Bot 通过 Cloudflare Workers 与 grammY 的组合,构建了一个轻量、可扩展、易于维护的摄影活动预约机器人。其清晰的模块划分、完善的错误处理与定时通知机制,使其能够稳定支撑日常运营与用户交互。未来可在前端界面、支付对接与更细粒度的权限控制方面进一步增强用户体验与安全性。
章节来源