telegram_bot_oxidebot
telegram_bot_oxidebot 是 oxidebot 的 Telegram Bot API 适配器。
当前版本按 Telegram Bot API 10.2(2026-07-14) 核对。适配器只实现 oxidebot 通用接口所需的 Telegram API 子集,但接收更新时采用向前兼容设计:Telegram 新增字段会被保留,尚未映射为 oxidebot 标准事件的更新会作为原始事件交给上层,而不会导致整个 getUpdates 响应反序列化失败。
主要能力
- 纯 Rustls HTTPS,不依赖 OpenSSL。
- 长轮询支持 offset 提交、失败指数退避、Telegram
retry_after限流等待和自定义allowed_updates。 - 支持文本、提及、回复、图片、视频、音频、文件、相册、贴纸、位置以及本地文件/base64 上传。
- 自动遵守文本 4096、caption 1024、相册 2–10 项等 Telegram 约束;单个媒体不会再错误调用
sendMediaGroup。 - 支持删改消息、消息反应、成员禁言/解禁、全群权限、踢出/封禁、管理员升降级、管理员头衔、群资料、用户资料、入群申请审批和文件信息。
- 将普通消息、频道消息、编辑、成员变化、反应和入群申请映射为 oxidebot 标准事件。
- Bot API 10.x 的 Rich Message、Guest Message、Managed Bot、Subscription、Ephemeral Message 等尚无 oxidebot 通用抽象的内容,会通过
TelegramRawEvent或MessageSegment::CustomValue完整保留。 - 通过 oxidebot 的
PlatformApiRequest暴露全部 185 个 Bot API 10.2 方法;其他适配器不支持时会返回明确错误。 - 通过
TelegramBot::client()继续暴露更低层的TelegramClient::call,新发布且尚未进入方法目录的 Telegram API 也能立即调用。
安装
使用
use Result;
use OxideBotManager;
use ;
async
TelegramBot::new 为兼容 0.1 版本仍然保留,但连接失败时会 panic。新代码应使用返回 Result 的 TelegramBot::try_new。本地 Bot API 服务器或测试服务可使用 TelegramBot::try_with_api_base。
原始 Telegram 事件
无法直接表示为 oxidebot 标准事件的更新会成为 Event::AnyEvent:
AnyEvent.r#type是 Telegram 原始 update 字段名,例如callback_query、guest_message或subscription;AnyEvent.data可向下转换为telegram_bot_oxidebot::event::TelegramRawEvent;TelegramRawEvent.data保留 Telegram 返回的完整 JSON。
对于已经映射成 oxidebot 标准事件的 update,Matcher.event_object 仍保存完整的 UpdateEvent,可通过 EventTrait::as_any 向下转换后读取原始 Update;因此标准事件映射不会阻断业务层访问 Telegram 的完整数据。这种设计也意味着 Telegram 后续增加 update 类型时,机器人不会因为依赖库缺少枚举变体而卡死在同一个 offset。
调用全部 Telegram 原生 API
oxidebot 的平台 API 扩展层可以直接通过 BotObject 使用,因此不需要向下转换到 TelegramBot。JSON 参数和返回值不会丢失 Telegram 专属字段:
use Result;
use ;
use json;
async
需要上传文件时,使用 PlatformApiFile::bytes 或异步的 PlatformApiFile::from_path,再通过 PlatformApiRequest::file 添加 multipart 字段。嵌套 Telegram 对象可以按官方语法用 attach://字段名 引用附件。
TELEGRAM_BOT_API_METHODS 完整列出 Bot API 10.2 的 185 个方法,TELEGRAM_BOT_API_UPDATE_TYPES 完整列出 26 个 update 类型。原生调用不会被目录硬性限制,因此 Telegram 发布第 186 个方法后也仍然可以直接调用。
Telegram 返回 API 错误时,可以从 anyhow::Error 向下转换为 TelegramApiError。错误会保留 HTTP 状态、Telegram error_code、描述,以及 migrate_to_chat_id、retry_after 两个完整的 ResponseParameters 字段。
兼容性边界
oxidebot 的通用模型不能表达 Telegram 的全部概念,因此以下行为是有意的:
- Telegram 不提供按 message_id 查询历史消息、好友列表、机器人所在群列表或群文件目录,这些通用接口会返回明确错误。
get_group_member_list只能返回 Telegram Bot API 允许查询的管理员列表。- 临时“全群禁言”没有对应 Telegram API;永久修改群默认权限可用,临时禁言应逐成员执行。
- Rich Message、Guest Query、Ephemeral Message、Business Connection、支付、Inline Query 等 Telegram 专属流程目前以原始 JSON 暴露,没有伪装成语义不完整的通用事件。
get_file_info返回的 Telegram 下载 URL 含 bot token。不要记录、公开或持久化完整 URL;应把它视为敏感凭据。
从 0.1.2 升级到 0.1.3
0.1.3 移除了停留在 Bot API 7.9 的 telegram_bot_api_rs 依赖,并将配置类型改为本 crate 的 GetUpdatesConfig。常见迁移只需:
- 把
telegram_bot_api_rs::getting_updates::GetUpdateConfig改为telegram_bot_oxidebot::GetUpdatesConfig; - 把
TelegramBot::new(...).await改为TelegramBot::try_new(...).await?; - 如果处理过适配器内部的 Telegram 类型,改为使用
telegram_bot_oxidebot::telegram中的精简类型或TelegramRawEvent的 JSON。