OpenClawSkills
GitHub
通道 • 5 分钟阅读

grammY

通过 grammY 接入 Telegram Bot API 的实现与配置要点

- TypeScript 优先的 Bot API 客户端,内建 long-poll / webhook 辅助、middleware、错误处理与限流器。

- 媒体处理比自己手写 fetch + FormData 更干净;覆盖 Bot API 全量方法。

- 可扩展:支持自定义 fetch(用于代理)、session middleware(可选)、类型安全的上下文。




- 单一客户端路径: 已移除 fetch 版实现;目前 Telegram 客户端(发送 + gateway)统一使用 grammY,并默认启用 grammY throttler。

- Gateway: monitorTelegramProvider 构建 grammY Bot,接入 mention/allowlist 门禁;媒体通过 getFile/download 下载;出站使用 sendMessage/sendPhoto/sendVideo/sendAudio/sendDocument。支持 long-poll 或通过 webhookCallback 的 webhook。

- 代理: 可选 channels.telegram.proxy,通过 grammY 的 client.baseFetch 使用 client.baseFetch。

- Webhook 支持: webhook-set.ts 封装 setWebhook/deleteWebhook;webhook.ts 托管 callback 并提供健康检查与优雅退出。Gateway 在配置了 channels.telegram.webhookUrl + channels.telegram.webhookSecret 时启用 webhook 模式(否则默认 long-poll)。

- Sessions: DMs fold into agent main session (agent:<agentId>:<mainKey>); groups use agent:<agentId>:telegram:group:<chatId>; replies deterministically return to same channel.

- 配置项: channels.telegram.botToken、channels.telegram.dmPolicy、channels.telegram.groups(群 allowlist + mention 默认)、channels.telegram.allowFrom、channels.telegram.groupAllowFrom、channels.telegram.groupPolicy、channels.telegram.mediaMaxMb、channels.telegram.linkPreview、channels.telegram.proxy、channels.telegram.webhookSecret、channels.telegram.webhookUrl。

- 草稿流式: 可选 channels.telegram.streamMode,在私聊 topic chat 里使用 sendMessageDraft(Bot API 9.3+)。该能力与通道 block streaming 独立。

- 测试: grammY mocks 覆盖私聊 + 群 mention 门禁与出站发送;仍欢迎补充更多媒体/webhook fixtures。

开放问题

- 若遇到 Bot API 429,评估引入更多 grammY plugins(或调整 throttler 策略)。

- 增加更结构化的媒体测试(贴纸、语音条等)。

- 让 webhook 监听端口可配置(当前若不通过 gateway 统一配置,默认固定为 8787)。