本文档引用的文件
本文件面向使用 grammY 框架在 Cloudflare Workers 上部署 Telegram 机器人的开发者,系统性阐述 Bot 实例初始化流程、环境变量配置、中间件与插件(尤其是 conversations 插件)的安装与配置、KV 存储适配器的使用以及版本化状态存储的实现思路。同时提供完整的框架初始化参考路径、错误处理与配置验证建议,以及 Cloudflare KV 的集成最佳实践。
该项目采用按功能模块划分的组织方式:
配置与类型:wrangler.jsonc 定义 Workers 配置、KV 绑定与 vars;.dev.vars 提供本地开发环境变量;worker-configuration.d.ts 提供 KV 类型声明。
graph TB
A["入口文件<br/>src/index.ts"] --> B["命令与对话注册<br/>src/command/index.ts"]
A --> C["调度任务处理<br/>src/scheduler/index.ts"]
B --> D["登录对话处理器<br/>src/command/handlers/login.ts"]
A --> E["Cloudflare 配置<br/>wrangler.jsonc"]
E --> F[".dev.vars 环境变量"]
A --> G["类型声明<br/>worker-configuration.d.ts"]
图表来源
章节来源
章节来源
下图展示从请求进入 Worker 到 Bot 初始化、命令注册、对话存储与调度任务的整体流程。
sequenceDiagram
participant CF as "Cloudflare Workers"
participant Entry as "入口函数<br/>src/index.ts"
participant Bot as "Bot 实例"
participant Cmd as "命令注册<br/>src/command/index.ts"
participant KV as "KV 存储<br/>COSMOE_STORAGE/COSMOE_CREDENTIALS"
CF->>Entry : "fetch 请求"
Entry->>Bot : "构造 Bot 并注入 botInfo"
Entry->>Cmd : "setupCommands(bot, env)"
Cmd->>KV : "创建 KvAdapter 并包装 storage"
Cmd->>Bot : "安装 conversations 插件"
Entry->>CF : "webhookCallback 返回响应"
CF->>Entry : "scheduled 触发"
Entry->>Bot : "重新构造 Bot"
Entry->>Cmd : "handleScheduledEvent(bot, env)"
Cmd->>KV : "读取/更新最新活动 ID"
Cmd->>Bot : "向已注册用户发送通知"
图表来源
章节来源
错误处理
读写 KV 失败时记录错误并返回默认值或空状态,避免中断对话流程。
flowchart TD
Start(["进入 conversations 配置"]) --> CreateAdapter["创建 KvAdapter(COSMOE_STORAGE)"]
CreateAdapter --> BuildStorage["构建 storage 对象<br/>read/write/delete"]
BuildStorage --> WrapJSON["读取时 JSON.parse<br/>写入时 JSON.stringify"]
WrapJSON --> TryCatch["异常捕获与日志记录"]
TryCatch --> InstallPlugin["bot.use(conversations({ storage }))"]
InstallPlugin --> End(["完成配置"])
图表来源
章节来源
章节来源
KV 写入策略
写入时包含时间戳,便于后续清理或审计。
sequenceDiagram
participant U as "用户"
participant Conv as "登录对话"
participant API as "CosmoeClient"
participant KV as "COSMOE_CREDENTIALS"
U->>Conv : "触发 /login"
Conv->>U : "提示输入用户名"
U-->>Conv : "用户名"
Conv->>U : "提示输入密码"
U-->>Conv : "密码"
Conv->>API : "getToken(username, password)"
API-->>Conv : "返回 token"
Conv->>KV : "put(telegramUserId, JSON)"
Conv-->>U : "登录成功/失败消息"
图表来源
章节来源
KV 列表与读写
使用 KV.get/put 进行轻量级状态持久化。
flowchart TD
S(["scheduled 触发"]) --> InitBot["构造 Bot 实例"]
InitBot --> LoadKV["读取 latestEventId"]
LoadKV --> FetchEvents["调用 CosmoeClient.getEvents()"]
FetchEvents --> Compare{"有新活动?"}
Compare --> |否| End(["结束"])
Compare --> |是| ListUsers["KV.list() 获取用户键"]
ListUsers --> Notify["逐用户发送通知"]
Notify --> Update["更新 latestEventId"]
Update --> End
图表来源
章节来源
运行时耦合
conversations 插件依赖 KV 存储,KV 由 Wrangler 绑定到环境变量。
graph LR
Pkg["package.json 依赖"] --> G["grammY"]
Pkg --> C["@grammyjs/conversations"]
Pkg --> S["storage-cloudflare"]
Entry["src/index.ts"] --> Cmd["src/command/index.ts"]
Entry --> Sch["src/scheduler/index.ts"]
Cmd --> KV["COSMOE_STORAGE/COSMOE_CREDENTIALS"]
Sch --> KV
Wrangler["wrangler.jsonc"] --> KV
图表来源
章节来源
章节来源
本项目基于 grammY 在 Cloudflare Workers 上实现了完整的 Telegram 机器人服务:Bot 初始化、命令与对话管理、KV 存储适配与调度任务。通过明确的环境接口与 Wrangler 配置,系统具备良好的可维护性与可扩展性。建议在生产环境中进一步完善版本化状态存储、KV 访问优化与错误恢复策略,以提升稳定性与性能。
章节来源
章节来源