# 调用 QQ 开放接口
下面这些 demo 展示了 `BotApi` 在消息收发之外的常见用法。每个 demo 都是自包含的 event handler,通过聊天命令触发 API 调用。
| [`demo_api_permission.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_api_permission.rs) | `BotApi::get_api_permissions`、`BotApi::post_permission_demand`、`APIPermissionDemandIdentify` |
| [`demo_announce.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_announce.rs) | `BotApi::create_announce`、`BotApi::delete_announce`、`BotApi::create_recommend_announce`、`RecommendChannel`、`AnnouncesType` |
| [`demo_schedule.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_schedule.rs) | `BotApi::create_schedule`、`get_schedule`、`update_schedule`、`delete_schedule`、`RemindType` |
| [`demo_pins_message.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_pins_message.rs) | `BotApi::get_pins`、`BotApi::put_pin`、`BotApi::delete_pin` |
| [`demo_get_reaction_users.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_get_reaction_users.rs) | `BotApi::get_reaction_users`、`EmojiType::System`,按 `cookie` 字段翻页 |
| [`demo_recall.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_recall.rs) | `Context::recall_message`(也可走 `BotApi::recall_message`) |
## 套路
所有 REST 调用都可以直接写在 `ctx` 上,因为 `Context` 会解引用到 `BotApi`;token 存在 `BotApi` 内部。错误以 `botrs::BotError` 返回,框架不会自动重试,请就地处理。
```rust
// demo_recall.rs —— 发完立即撤回
let resp = message.reply(&ctx, "this will vanish").await?;
if let Some(message_id) = resp.id {
ctx.recall_message(channel_id, &message_id, /* hidetip */ true).await?;
}
```
对于 `get_reaction_users` 这类分页 API,按 demo 里的写法用返回的 `cookie` 与 `is_end` 自行驱动循环。
## 参见
- 指南:[`docs/zh/guide/api-client.md`](../guide/api-client.md)
- 可用方法的权威来源:`src/api.rs`(`BotApi` 的 impl)
- 上面表格里列出的 `examples/` demo 路径