grammY 集成(Telegram Bot API)
为什么选择 grammY
- TypeScript 优先的 Bot API 客户端,内置长轮询(long-poll)+ webhook 辅助、中间件、错误处理、速率限制器。
- 比手动使用 fetch + FormData 更简洁的媒体辅助;支持所有 Bot API 方法。
- 可扩展:通过自定义 fetch 支持代理,会话中间件(可选),类型安全的上下文。
我们发布了什么
- 单一客户端路径: 移除了基于 fetch 的实现;grammY 现在是唯一的 Telegram 客户端(发送 + 网关),默认启用 grammY 节流器。
- 网关: monitorTelegramProvider 构建一个 grammY Bot,连接提及/允许列表门控,通过 getFile/download 下载媒体,并使用 sendMessage/sendPhoto/sendVideo/sendAudio/sendDocument 传递回复。通过 webhookCallback 支持长轮询或 webhook。
- 代理(Proxy): 可选的 channels.telegram.proxy 通过 grammY 的 client.baseFetch 使用 undici.ProxyAgent。
- Webhook 支持: webhook-set.ts 包装 setWebhook/deleteWebhook;webhook.ts 使用健康检查 + 优雅关闭托管回调。当设置 channels.telegram.webhookUrl 时,网关启用 webhook 模式(否则它长轮询)。
- 会话(Sessions): 直接聊天合并到代理主会话(agent:<agentId>:<mainKey>);群组使用 agent:<agentId>:telegram:group:<chatId>;回复路由回相同频道。
- 配置选项: channels.telegram.botToken、channels.telegram.dmPolicy、channels.telegram.groups(允许列表 + 提及默认值)、channels.telegram.allowFrom、channels.telegram.groupAllowFrom、channels.telegram.groupPolicy、channels.telegram.mediaMaxMb、channels.telegram.linkPreview、channels.telegram.proxy、channels.telegram.webhookSecret、channels.telegram.webhookUrl。
- 草稿流式传输(Draft streaming): 可选的 channels.telegram.streamMode 在私有主题聊天中使用 sendMessageDraft(Bot API 9.3+)。这与频道块流式传输是分开的。
- 测试: grammY mock 覆盖私信 + 群组提及门控和出站发送;仍欢迎更多媒体/webhook fixture。
未解决的问题
- 如果我们遇到 Bot API 429s,可选的 grammY 插件(throttler)。
- 添加更多结构化媒体测试(贴纸、语音笔记)。
- 使 webhook 监听端口可配置(当前固定为 8787,除非通过网关连接)。