消息模型 API 参考
该模块为 QQ 频道机器人 API 中不同类型的消息提供数据结构,包括频道消息、私信、群聊消息和 C2C(客户端到客户端)消息。
核心消息类型
Message
表示频道中的消息。
rust
pub struct Message {
pub id: String,
pub content: Option<String>,
pub channel_id: String,
pub guild_id: String,
pub author: Option<MessageUser>,
pub member: Option<MessageMember>,
pub message_reference: Option<MessageReference>,
pub mentions: Vec<MessageUser>,
pub attachments: Vec<MessageAttachment>,
pub seq: Option<u64>,
pub seq_in_channel: Option<String>,
pub timestamp: Option<String>,
pub event_id: Option<String>,
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
方法
reply
回复消息,发送文本内容。
rust
pub async fn reply(
&self,
api: &BotApi,
token: &Token,
content: &str,
) -> Result<Message>
1
2
3
4
5
6
2
3
4
5
6
参数:
api
: 机器人 API 客户端实例token
: 认证令牌content
: 回复文本内容
示例:
rust
async fn handle_message(ctx: Context, message: Message) {
if let Some(content) = &message.content {
if content == "!ping" {
message.reply(&ctx.api, &ctx.token, "Pong!").await?;
}
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
is_from_bot
检查消息是否由机器人发送。
rust
pub fn is_from_bot(&self) -> bool
1
返回值: 如果消息作者是机器人则返回 true
,否则返回 false
。
示例:
rust
if message.is_from_bot() {
// 忽略机器人消息
return;
}
1
2
3
4
2
3
4
has_content
检查消息是否包含文本内容。
rust
pub fn has_content(&self) -> bool
1
has_attachments
检查消息是否包含文件附件。
rust
pub fn has_attachments(&self) -> bool
1
has_mentions
检查消息是否提及其他用户。
rust
pub fn has_mentions(&self) -> bool
1
DirectMessage
表示机器人与用户之间的私信。
rust
pub struct DirectMessage {
pub id: String,
pub content: Option<String>,
pub channel_id: String,
pub guild_id: String,
pub direct_message: bool,
pub author: Option<DirectMessageUser>,
pub member: Option<DirectMessageMember>,
pub message_reference: Option<MessageReference>,
pub attachments: Vec<MessageAttachment>,
pub seq: Option<u64>,
pub seq_in_channel: Option<String>,
pub src_guild_id: Option<String>,
pub timestamp: Option<String>,
pub event_id: Option<String>,
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
方法
reply
回复私信。
rust
pub async fn reply(
&self,
api: &BotApi,
token: &Token,
content: &str,
) -> Result<DirectMessage>
1
2
3
4
5
6
2
3
4
5
6
GroupMessage
表示 QQ 群中的消息。
rust
pub struct GroupMessage {
pub id: String,
pub content: Option<String>,
pub message_reference: Option<MessageReference>,
pub mentions: Vec<GroupMessageUser>,
pub attachments: Vec<MessageAttachment>,
pub msg_seq: Option<u64>,
pub timestamp: Option<String>,
pub author: Option<GroupMessageUser>,
pub group_openid: Option<String>,
pub event_id: Option<String>,
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
方法
reply
回复群消息。
rust
pub async fn reply(
&self,
api: &BotApi,
token: &Token,
content: &str,
) -> Result<GroupMessage>
1
2
3
4
5
6
2
3
4
5
6
C2CMessage
表示客户端到客户端的消息。
rust
pub struct C2CMessage {
pub id: String,
pub content: Option<String>,
pub message_reference: Option<MessageReference>,
pub mentions: Vec<C2CMessageUser>,
pub attachments: Vec<MessageAttachment>,
pub msg_seq: Option<u64>,
pub timestamp: Option<String>,
pub author: Option<C2CMessageUser>,
pub event_id: Option<String>,
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
方法
reply
回复 C2C 消息。
rust
pub async fn reply(
&self,
api: &BotApi,
token: &Token,
content: &str,
) -> Result<C2CMessage>
1
2
3
4
5
6
2
3
4
5
6
用户类型
MessageUser
频道消息中的用户信息。
rust
pub struct MessageUser {
pub id: String,
pub username: Option<String>,
pub bot: Option<bool>,
pub avatar: Option<String>,
}
1
2
3
4
5
6
2
3
4
5
6
DirectMessageUser
私信中的用户信息。
rust
pub struct DirectMessageUser {
pub id: String,
pub username: Option<String>,
pub avatar: Option<String>,
}
1
2
3
4
5
2
3
4
5
GroupMessageUser
群消息中的用户信息。
rust
pub struct GroupMessageUser {
pub id: Option<String>,
pub member_openid: Option<String>,
pub union_openid: Option<String>,
}
1
2
3
4
5
2
3
4
5
C2CMessageUser
C2C 消息中的用户信息。
rust
pub struct C2CMessageUser {
pub user_openid: Option<String>,
}
1
2
3
2
3
富内容类型
Embed
消息的富嵌入内容。
rust
pub struct Embed {
pub title: Option<String>,
pub description: Option<String>,
pub url: Option<String>,
pub timestamp: Option<String>,
pub color: Option<u32>,
pub footer: Option<EmbedFooter>,
pub image: Option<EmbedImage>,
pub thumbnail: Option<EmbedThumbnail>,
pub video: Option<EmbedVideo>,
pub provider: Option<EmbedProvider>,
pub author: Option<EmbedAuthor>,
pub fields: Vec<EmbedField>,
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
EmbedField
嵌入内容中的字段。
rust
pub struct EmbedField {
pub name: String,
pub value: String,
pub inline: Option<bool>,
}
1
2
3
4
5
2
3
4
5
Ark
用于富交互内容的 ARK 模板消息。
rust
pub struct Ark {
pub template_id: Option<u32>,
pub kv: Vec<ArkKv>,
}
1
2
3
4
2
3
4
Keyboard
交互式键盘按钮。
rust
pub struct Keyboard {
pub content: Option<KeyboardContent>,
}
1
2
3
2
3
KeyboardButton
交互式键盘中的按钮。
rust
pub struct KeyboardButton {
pub id: Option<String>,
pub render_data: Option<KeyboardButtonRenderData>,
pub action: Option<KeyboardButtonAction>,
}
1
2
3
4
5
2
3
4
5
消息参数
MessageParams
发送频道消息的参数。
rust
pub struct MessageParams {
pub content: Option<String>,
pub embed: Option<Embed>,
pub ark: Option<Ark>,
pub message_reference: Option<Reference>,
pub image: Option<String>,
pub file_image: Option<String>,
pub msg_id: Option<String>,
pub event_id: Option<String>,
pub markdown: Option<MarkdownPayload>,
pub keyboard: Option<Keyboard>,
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
方法
new_text
创建包含文本内容的消息参数。
rust
pub fn new_text(content: &str) -> Self
1
with_file_image
为消息添加文件图片。
rust
pub fn with_file_image(mut self, file_info: &str) -> Self
1
with_reply
将消息设置为对另一条消息的回复。
rust
pub fn with_reply(mut self, message_id: &str) -> Self
1
示例:
rust
let params = MessageParams::new_text("你好!")
.with_file_image("file_info_string")
.with_reply("original_message_id");
1
2
3
2
3
GroupMessageParams
发送群消息的参数。
rust
pub struct GroupMessageParams {
pub msg_type: Option<u32>,
pub content: Option<String>,
pub embed: Option<Embed>,
pub ark: Option<Ark>,
pub message_reference: Option<Reference>,
pub media: Option<Media>,
pub msg_id: Option<String>,
pub msg_seq: Option<u64>,
pub event_id: Option<String>,
pub markdown: Option<MarkdownPayload>,
pub keyboard: Option<Keyboard>,
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
C2CMessageParams
发送 C2C 消息的参数。
rust
pub struct C2CMessageParams {
pub msg_type: Option<u32>,
pub content: Option<String>,
pub embed: Option<Embed>,
pub ark: Option<Ark>,
pub message_reference: Option<Reference>,
pub media: Option<Media>,
pub msg_id: Option<String>,
pub msg_seq: Option<u64>,
pub event_id: Option<String>,
pub markdown: Option<MarkdownPayload>,
pub keyboard: Option<Keyboard>,
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
DirectMessageParams
发送私信的参数。
rust
pub struct DirectMessageParams {
pub content: Option<String>,
pub embed: Option<Embed>,
pub ark: Option<Ark>,
pub message_reference: Option<Reference>,
pub image: Option<String>,
pub file_image: Option<String>,
pub msg_id: Option<String>,
pub event_id: Option<String>,
pub markdown: Option<MarkdownPayload>,
pub keyboard: Option<Keyboard>,
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
附件和媒体
MessageAttachment
消息中的文件附件。
rust
pub struct MessageAttachment {
pub id: Option<String>,
pub filename: Option<String>,
pub content_type: Option<String>,
pub size: Option<u64>,
pub url: Option<String>,
pub width: Option<u32>,
pub height: Option<u32>,
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
方法
is_image
检查附件是否为图片。
rust
pub fn is_image(&self) -> bool
1
is_video
检查附件是否为视频。
rust
pub fn is_video(&self) -> bool
1
is_audio
检查附件是否为音频文件。
rust
pub fn is_audio(&self) -> bool
1
Media
消息的媒体内容。
rust
pub struct Media {
pub file_info: Option<String>,
pub ttl: Option<u32>,
}
1
2
3
4
2
3
4
常见使用模式
基础文本回复
rust
async fn handle_message(ctx: Context, message: Message) {
if let Some(content) = &message.content {
if content.starts_with("!echo ") {
let echo_text = &content[6..];
message.reply(&ctx.api, &ctx.token, echo_text).await?;
}
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
富嵌入响应
rust
use botrs::models::message::{Embed, EmbedField};
let embed = Embed {
title: Some("机器人信息".to_string()),
description: Some("使用 BotRS 构建的 QQ 频道机器人".to_string()),
color: Some(0x00ff00),
fields: vec![
EmbedField {
name: "版本".to_string(),
value: "0.2.5".to_string(),
inline: Some(true),
},
EmbedField {
name: "语言".to_string(),
value: "Rust".to_string(),
inline: Some(true),
},
],
..Default::default()
};
let params = MessageParams {
embed: Some(embed),
..Default::default()
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
文件上传
rust
let params = MessageParams::new_text("这是一张图片!")
.with_file_image("base64_encoded_file_info");
1
2
2
消息引用
rust
let params = MessageParams::new_text("这是一条回复")
.with_reply(&original_message.id);
1
2
2