机器人 API 参考
BotApi
是用于与 QQ 频道 REST API 交互的核心客户端。它提供了完整的 API 端点访问,支持消息发送、频道管理、成员操作等所有功能。
概述
rust
pub struct BotApi {
http_client: HttpClient,
}
BotApi
封装了所有 QQ 频道机器人 API 端点,提供类型安全的接口和自动的错误处理。所有方法都是异步的,支持高并发操作。
构造函数
new
创建新的 BotApi 实例。
rust
pub fn new() -> Self
返回值
返回新的 BotApi
实例,使用默认的 HTTP 客户端配置。
示例
rust
use botrs::BotApi;
let api = BotApi::new();
with_http_client
使用自定义 HTTP 客户端创建 BotApi 实例。
rust
pub fn with_http_client(http_client: HttpClient) -> Self
参数
http_client
: 自定义的 HTTP 客户端
示例
rust
use botrs::{BotApi, HttpClient};
use std::time::Duration;
let http_client = HttpClient::builder()
.timeout(Duration::from_secs(30))
.build()?;
let api = BotApi::with_http_client(http_client);
消息 API
post_message
发送消息到指定频道(旧版 API)。
rust
pub async fn post_message(
&self,
token: &Token,
channel_id: &str,
content: Option<&str>,
embed: Option<&Embed>,
) -> Result<Message, BotError>
参数
token
: 身份验证令牌channel_id
: 目标频道 IDcontent
: 消息文本内容(可选)embed
: 嵌入内容(可选)
返回值
返回发送成功的消息对象或错误。
示例
rust
let message = api.post_message(
&token,
"channel_123",
Some("你好,世界!"),
None
).await?;
post_message_with_params
使用结构化参数发送消息(推荐)。
rust
pub async fn post_message_with_params(
&self,
token: &Token,
channel_id: &str,
params: MessageParams,
) -> Result<Message, BotError>
参数
token
: 身份验证令牌channel_id
: 目标频道 IDparams
: 消息参数结构体
示例
rust
use botrs::{MessageParams, Embed};
// 发送文本消息
let params = MessageParams::new_text("Hello, World!");
let message = api.post_message_with_params(&token, "channel_123", params).await?;
// 发送嵌入消息
let embed = Embed::new()
.title("标题")
.description("描述")
.color(0x3498db);
let params = MessageParams::new_embed(embed);
let message = api.post_message_with_params(&token, "channel_123", params).await?;
// 发送回复消息
let params = MessageParams::new_text("这是回复")
.with_reply("original_message_id");
let message = api.post_message_with_params(&token, "channel_123", params).await?;
post_message_with_file
发送带文件的消息。
rust
pub async fn post_message_with_file(
&self,
token: &Token,
channel_id: &str,
filename: &str,
file_data: &[u8],
file_type: &str,
) -> Result<Message, BotError>
参数
token
: 身份验证令牌channel_id
: 目标频道 IDfilename
: 文件名file_data
: 文件数据file_type
: 文件类型(如 "image", "video", "audio")
示例
rust
let file_data = std::fs::read("image.png")?;
let message = api.post_message_with_file(
&token,
"channel_123",
"image.png",
&file_data,
"image"
).await?;
get_message
获取指定消息。
rust
pub async fn get_message(
&self,
token: &Token,
channel_id: &str,
message_id: &str,
) -> Result<Message, BotError>
delete_message
删除指定消息。
rust
pub async fn delete_message(
&self,
token: &Token,
channel_id: &str,
message_id: &str,
hidetip: Option<bool>,
) -> Result<(), BotError>
频道管理 API
get_guild
获取频道信息。
rust
pub async fn get_guild(
&self,
token: &Token,
guild_id: &str,
) -> Result<Guild, BotError>
示例
rust
let guild = api.get_guild(&token, "guild_123").await?;
println!("频道名称: {}", guild.name.unwrap_or_default());
get_guild_channels
获取频道的子频道列表。
rust
pub async fn get_guild_channels(
&self,
token: &Token,
guild_id: &str,
) -> Result<Vec<Channel>, BotError>
示例
rust
let channels = api.get_guild_channels(&token, "guild_123").await?;
for channel in channels {
println!("子频道: {} ({})",
channel.name.unwrap_or_default(),
channel.id);
}
get_channel
获取指定子频道信息。
rust
pub async fn get_channel(
&self,
token: &Token,
channel_id: &str,
) -> Result<Channel, BotError>
create_guild_channel
创建新的子频道。
rust
pub async fn create_guild_channel(
&self,
token: &Token,
guild_id: &str,
channel_data: &serde_json::Value,
) -> Result<Channel, BotError>
示例
rust
use serde_json::json;
let channel_data = json!({
"name": "新子频道",
"type": 0, // 文本频道
"sub_type": 0, // 聊天频道
"position": 1
});
let channel = api.create_guild_channel(&token, "guild_123", &channel_data).await?;
modify_guild_channel
修改子频道信息。
rust
pub async fn modify_guild_channel(
&self,
token: &Token,
channel_id: &str,
channel_data: &serde_json::Value,
) -> Result<Channel, BotError>
delete_guild_channel
删除子频道。
rust
pub async fn delete_guild_channel(
&self,
token: &Token,
channel_id: &str,
) -> Result<(), BotError>
成员管理 API
get_guild_members
获取频道成员列表。
rust
pub async fn get_guild_members(
&self,
token: &Token,
guild_id: &str,
after: Option<&str>,
limit: Option<u32>,
) -> Result<Vec<Member>, BotError>
参数
after
: 分页参数,获取此 ID 之后的成员limit
: 返回成员数量限制(最大 400)
示例
rust
// 获取前100个成员
let members = api.get_guild_members(&token, "guild_123", None, Some(100)).await?;
// 分页获取
let first_batch = api.get_guild_members(&token, "guild_123", None, Some(400)).await?;
if let Some(last_member) = first_batch.last() {
let second_batch = api.get_guild_members(
&token,
"guild_123",
Some(&last_member.user.id),
Some(400)
).await?;
}
get_guild_member
获取指定成员信息。
rust
pub async fn get_guild_member(
&self,
token: &Token,
guild_id: &str,
user_id: &str,
) -> Result<Member, BotError>
add_guild_member_role
为成员添加身份组。
rust
pub async fn add_guild_member_role(
&self,
token: &Token,
guild_id: &str,
user_id: &str,
role_id: &str,
) -> Result<(), BotError>
remove_guild_member_role
移除成员的身份组。
rust
pub async fn remove_guild_member_role(
&self,
token: &Token,
guild_id: &str,
user_id: &str,
role_id: &str,
) -> Result<(), BotError>
create_guild_member_mute
禁言频道成员。
rust
pub async fn create_guild_member_mute(
&self,
token: &Token,
guild_id: &str,
user_id: &str,
mute_data: &serde_json::Value,
) -> Result<(), BotError>
示例
rust
use serde_json::json;
// 禁言10分钟
let mute_data = json!({
"mute_end_timestamp": (chrono::Utc::now() + chrono::Duration::minutes(10)).timestamp().to_string(),
"mute_seconds": 600
});
api.create_guild_member_mute(&token, "guild_123", "user_456", &mute_data).await?;
私信 API
create_direct_message_session
创建私信会话。
rust
pub async fn create_direct_message_session(
&self,
token: &Token,
guild_id: &str,
user_id: &str,
) -> Result<DirectMessageSession, BotError>
post_direct_message_with_params
发送私信消息。
rust
pub async fn post_direct_message_with_params(
&self,
token: &Token,
guild_id: &str,
channel_id: &str,
params: MessageParams,
) -> Result<DirectMessage, BotError>
示例
rust
// 创建私信会话
let session = api.create_direct_message_session(&token, "guild_123", "user_456").await?;
// 发送私信
let params = MessageParams::new_text("这是一条私信");
let dm = api.post_direct_message_with_params(
&token,
"guild_123",
&session.channel_id,
params
).await?;
get_direct_messages
获取私信历史。
rust
pub async fn get_direct_messages(
&self,
token: &Token,
guild_id: &str,
channel_id: &str,
limit: Option<u32>,
) -> Result<Vec<DirectMessage>, BotError>
群组消息 API
post_group_message_with_params
发送群组消息。
rust
pub async fn post_group_message_with_params(
&self,
token: &Token,
group_id: &str,
params: MessageParams,
) -> Result<GroupMessage, BotError>
post_c2c_message_with_params
发送 C2C(用户对用户)消息。
rust
pub async fn post_c2c_message_with_params(
&self,
token: &Token,
user_id: &str,
params: MessageParams,
) -> Result<C2CMessage, BotError>
公告 API
create_guild_announce
创建频道公告。
rust
pub async fn create_guild_announce(
&self,
token: &Token,
guild_id: &str,
announce_data: &serde_json::Value,
) -> Result<Announce, BotError>
示例
rust
use serde_json::json;
let announce_data = json!({
"message": "重要通知:系统维护将在今晚进行",
"channel_id": "channel_123"
});
let announce = api.create_guild_announce(&token, "guild_123", &announce_data).await?;
delete_guild_announce
删除频道公告。
rust
pub async fn delete_guild_announce(
&self,
token: &Token,
guild_id: &str,
announce_id: &str,
) -> Result<(), BotError>
表情回应 API
put_message_reaction
为消息添加表情回应。
rust
pub async fn put_message_reaction(
&self,
token: &Token,
channel_id: &str,
message_id: &str,
emoji: &str,
) -> Result<(), BotError>
示例
rust
// 添加点赞表情
api.put_message_reaction(&token, "channel_123", "message_456", "👍").await?;
delete_message_reaction
删除消息的表情回应。
rust
pub async fn delete_message_reaction(
&self,
token: &Token,
channel_id: &str,
message_id: &str,
emoji: &str,
) -> Result<(), BotError>
get_message_reaction_users
获取对消息添加特定表情的用户列表。
rust
pub async fn get_message_reaction_users(
&self,
token: &Token,
channel_id: &str,
message_id: &str,
emoji: &str,
cookie: Option<&str>,
limit: Option<u32>,
) -> Result<ReactionUsers, BotError>
身份组 API
get_guild_roles
获取频道身份组列表。
rust
pub async fn get_guild_roles(
&self,
token: &Token,
guild_id: &str,
) -> Result<GuildRoles, BotError>
create_guild_role
创建频道身份组。
rust
pub async fn create_guild_role(
&self,
token: &Token,
guild_id: &str,
role_data: &serde_json::Value,
) -> Result<GuildRole, BotError>
modify_guild_role
修改频道身份组。
rust
pub async fn modify_guild_role(
&self,
token: &Token,
guild_id: &str,
role_id: &str,
role_data: &serde_json::Value,
) -> Result<GuildRole, BotError>
delete_guild_role
删除频道身份组。
rust
pub async fn delete_guild_role(
&self,
token: &Token,
guild_id: &str,
role_id: &str,
) -> Result<(), BotError>
音频 API
get_channel_audio_members
获取音频频道成员列表。
rust
pub async fn get_channel_audio_members(
&self,
token: &Token,
channel_id: &str,
) -> Result<Vec<Member>, BotError>
audio_control
控制音频播放。
rust
pub async fn audio_control(
&self,
token: &Token,
channel_id: &str,
control_data: &serde_json::Value,
) -> Result<AudioControl, BotError>
日程 API
get_guild_schedules
获取频道日程列表。
rust
pub async fn get_guild_schedules(
&self,
token: &Token,
guild_id: &str,
since: Option<u64>,
) -> Result<Vec<Schedule>, BotError>
get_guild_schedule
获取指定日程信息。
rust
pub async fn get_guild_schedule(
&self,
token: &Token,
guild_id: &str,
schedule_id: &str,
) -> Result<Schedule, BotError>
create_guild_schedule
创建频道日程。
rust
pub async fn create_guild_schedule(
&self,
token: &Token,
guild_id: &str,
schedule_data: &serde_json::Value,
) -> Result<Schedule, BotError>
modify_guild_schedule
修改频道日程。
rust
pub async fn modify_guild_schedule(
&self,
token: &Token,
guild_id: &str,
schedule_id: &str,
schedule_data: &serde_json::Value,
) -> Result<Schedule, BotError>
delete_guild_schedule
删除频道日程。
rust
pub async fn delete_guild_schedule(
&self,
token: &Token,
guild_id: &str,
schedule_id: &str,
) -> Result<(), BotError>
论坛 API
get_threads
获取论坛帖子列表。
rust
pub async fn get_threads(
&self,
token: &Token,
channel_id: &str,
) -> Result<Vec<Thread>, BotError>
get_thread
获取指定论坛帖子信息。
rust
pub async fn get_thread(
&self,
token: &Token,
channel_id: &str,
thread_id: &str,
) -> Result<ThreadInfo, BotError>
create_thread
创建论坛帖子。
rust
pub async fn create_thread(
&self,
token: &Token,
channel_id: &str,
thread_data: &serde_json::Value,
) -> Result<OpenThread, BotError>
delete_thread
删除论坛帖子。
rust
pub async fn delete_thread(
&self,
token: &Token,
channel_id: &str,
thread_id: &str,
) -> Result<(), BotError>
权限 API
get_guild_api_permission
获取频道 API 权限。
rust
pub async fn get_guild_api_permission(
&self,
token: &Token,
guild_id: &str,
) -> Result<ApiPermission, BotError>
post_guild_api_permission_demand
申请频道 API 权限。
rust
pub async fn post_guild_api_permission_demand(
&self,
token: &Token,
guild_id: &str,
permission_data: &serde_json::Value,
) -> Result<ApiPermissionDemand, BotError>
错误处理
所有 API 方法都返回 Result<T, BotError>
,其中 BotError
包含详细的错误信息:
rust
use botrs::BotError;
match api.get_guild(&token, "invalid_guild_id").await {
Ok(guild) => println!("获取频道成功: {}", guild.id),
Err(BotError::NotFound) => eprintln!("频道不存在"),
Err(BotError::Forbidden) => eprintln!("权限不足"),
Err(BotError::RateLimited(retry_after)) => {
eprintln!("速率限制,{}秒后重试", retry_after);
}
Err(BotError::Authentication(_)) => eprintln!("身份验证失败"),
Err(BotError::Network(_)) => eprintln!("网络连接错误"),
Err(e) => eprintln!("其他错误: {}", e),
}
批量操作示例
批量获取频道信息
rust
use futures::future::try_join_all;
async fn get_multiple_guilds(
api: &BotApi,
token: &Token,
guild_ids: &[String]
) -> Result<Vec<Guild>, BotError> {
let futures: Vec<_> = guild_ids.iter()
.map(|id| api.get_guild(token, id))
.collect();
try_join_all(futures).await
}
批量发送消息
rust
async fn broadcast_message(
api: &BotApi,
token: &Token,
channel_ids: &[String],
content: &str
) -> Result<Vec<Message>, BotError> {
let mut results = Vec::new();
for channel_id in channel_ids {
let params = MessageParams::new_text(content);
match api.post_message_with_params(token, channel_id, params).await {
Ok(message) => results.push(message),
Err(e) => eprintln!("发送到频道 {} 失败: {}", channel_id, e),
}
// 避免速率限制
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
}
Ok(results)
}
最佳实践
- 错误处理: 始终处理可能的 API 错误
- 速率限制: 在批量操作中添加适当的延迟
- 重试机制: 对临时错误实现自动重试
- 参数验证: 在调用 API 前验证输入参数
- 日志记录: 记录重要的 API 调用和错误
另请参阅
Token
API 参考 - 身份验证令牌管理Context
API 参考 - 事件处理器中的 API 使用- API 客户端使用指南 - API 使用最佳实践
- 错误处理指南 - API 错误处理策略