# 快速开始
一个最小机器人只需要:实现 `EventHandler` 的结构体、`Client::new(token, intents, handler, is_sandbox)` 调用,再加上 `client.start().await`。
## Cargo.toml
```toml
[dependencies]
botrs = "0.11.0"
tokio = { version = "1", features = ["full"] }
async-trait = "0.1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
```
## main.rs
下面的处理器在频道里被 @ 时回复 `!ping`。在此阶段你只需要 `Token::new(app_id, secret)` 和 `Client::new` 的 `is_sandbox` 这两项配置。
```rust
use botrs::{Client, Context, EventHandler, Intents, Message, Ready, Token};
struct MyBot;
#[async_trait::async_trait]
impl EventHandler for MyBot {
async fn ready(&self, _ctx: Context, ready: Ready) {
tracing::info!("ready as {}", ready.user.username);
}
async fn message_create(&self, ctx: Context, message: Message) {
if message.is_from_bot() {
return;
}
let Some(content) = message.content.as_deref() else { return };
if content.trim() == "!ping" {
let _ = message.reply(&ctx.api, &ctx.token, "pong").await;
}
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt().with_env_filter("botrs=info").init();
let app_id = std::env::var("QQ_BOT_APP_ID")?;
let secret = std::env::var("QQ_BOT_SECRET")?;
let token = Token::new(app_id, secret);
let intents = Intents::default()
.with_public_guild_messages()
.with_guilds();
let mut client = Client::new(token, intents, MyBot, true)?;
client.start().await?;
Ok(())
}
```
## 各部分说明
- `Token` 保存 App ID 与 Secret。也可以用 `Token::from_env()`,它会读取 `QQ_BOT_APP_ID` 和 `QQ_BOT_SECRET`。
- `Intents` 是位标志集合,`Intents::default()` 为空,按需链式调用 `with_*` 方法订阅事件类别,机器人只会收到你显式订阅的事件。
- `Client::new(token, intents, handler, is_sandbox)` —— 开发期传 `true` 走沙箱地址,正式环境传 `false`。
- `Message::reply(&api, &token, text)` 是回复同频道的便捷方法;要发送更复杂的内容,使用 `BotApi::post_message_with_params`(详见 [消息](/zh/guide/messages))。
## 接下来
- [客户端与事件处理器](/zh/guide/client-handler) —— 所有可分派事件。
- [消息](/zh/guide/messages) —— 嵌入、文件、Markdown、ARK、键盘等消息形式。
- [配置](/zh/guide/configuration) —— 环境变量与沙箱/正式切换。