Skip to content

BotApi

BotApi 是 bot 在事件处理过程中使用的共享类型化 REST 客户端。事件进来以后,handler 通常通过事件 session 调用它完成回复、撤回、上传群/C2C 文件、管理频道与子频道资源、公告、日程、精华、表情回应、权限、身份组、禁言和音频控制。

Client 驱动的 bot 中通常不需要手动创建 BotApi。每个事件回调收到的 session 已经暴露同一个 API 客户端,可以直接调用:

rust
let params = MessageParams::new_text("pong").with_reply(message_id);
session.send_message(params).await?;

只需要独立调用 REST、而不运行网关时,可以手动构造:

rust
let http = HttpClient::new(30, false)?;
let token = Token::new("app_id", "secret");
let api = BotApi::new(http, token);

let me = api.get_bot_info().await?;

当前能力

BotApi 覆盖以下路径:

场景方法
bot 身份和网关发现get_bot_infoget_gateway
频道与子频道资源get_guildlist_bot_guildsget_channellist_channelscreate_channelupdate_channeldelete_channelcreate_private_channel
成员、身份组与禁言get_guild_memberlist_guild_membersdelete_guild_memberlist_rolescreate_roleupdate_roledelete_roleadd_member_roledelete_member_rolemute_guildmute_membermute_members
子频道权限与语音成员get_channel_permissionsupdate_channel_permissionsget_channel_role_permissionsupdate_channel_role_permissionslist_voice_channel_members
频道消息get_messagelist_messagessend_messageupdate_messagerecall_messagesend_setting_guide
群与 C2C 消息send_group_messagesend_c2c_messagerecall_group_messagerecall_c2c_message
私信create_direct_messagesend_direct_messagerecall_direct_messagesend_direct_setting_guide
群/C2C 文件post_group_filepost_c2c_file
公告create_channel_announcedelete_channel_announcecreate_announcecreate_recommend_announcedelete_announce
日程get_schedulesget_schedulecreate_scheduleupdate_scheduledelete_schedule
API 权限get_api_permissionspost_permission_demand
表情回应put_reactiondelete_reactionget_reaction_users
精华消息put_pindelete_pinclean_pinsget_pins
音频控制post_audioput_micdelete_mic

消息发送

发送消息通过参数结构体完成:

rust
let params = MessageParams::new_text("hello");
session.send_message(params).await?;

let params = GroupMessageParams::new_text("hello group");
group_session.send_message(params).await?;

频道消息和私信使用 MessageParams / DirectMessageParams。群和 C2C 使用 GroupMessageParams / C2CMessageParams,对应 QQ 开放平台的 open message 形态。

在事件处理器里,优先使用 session helper:send_text_messagesend_markdown_messagesend_ark_messagesend_embed_messagesend_keyboard_message,以及群/C2C 的 send_media_message。直接调用底层 API 时,使用 new_markdownnew_arknew_embednew_keyboardnew_media 等 params 构造器,它们会自动填好协议消息类型。

文件与媒体

群和 C2C 文件发送分两步:先上传得到 Media,再把它放进消息参数里发送。file_type 使用平台定义的数字,常用值是 1 图片、2 视频、3 语音、4 文件。

rust
let media = session
    .post_file(1, "https://example.com/image.png", None)
    .await?;

session.send_media_message(media).await?;

如果 srv_send_msgSome(true),平台会在上传后直接发送,通常就不需要再手动构造一条 media 消息。

公告、日程、精华和权限

这些 API 的使用方式比较直接:

  • 公告可以从已有消息创建,也可以创建推荐频道公告。
  • 日程支持列表、单个查询、创建、更新和删除。
  • 精华消息支持置顶、取消置顶、清空和查询。
  • API 权限申请通过 post_permission_demand 直接传 channel_idAPIPermissionDemandIdentify 和描述文本。
rust
let identify = APIPermissionDemandIdentify {
    path: "/channels/{channel_id}/messages".to_string(),
    method: "POST".to_string(),
};

session.post_permission_demand(&guild_id, &channel_id, identify, "需要发送回复")
    .await?;

错误处理

所有方法返回 botrs::Result<T>。在事件处理器里,通常就地记录错误并返回即可,因为 EventHandler 方法本身不返回 Result

rust
if let Err(err) = session.send_message(params).await {
    tracing::warn!("send failed: {err}");
}

参见

基于 MIT 许可证发布