域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。
  • 方案1️⃣AXUM.RS 域名 = 3000
  • 方案2️⃣方案1️⃣ + 本站所有专题原始 Markdown 文档 = 5000
  • 方案3️⃣方案2️⃣ + 本站原始数据库 = 5500
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名(方案1️⃣),或者该域名到期,本站将启用新的免费域名继续提供服务。
  2. 如果有人购买了 AXUM.RS 域名,且同时购买了内容和/或数据库(方案2️⃣/方案3️⃣),本站将关闭。届时我们或许会以另一种方式与你再相遇。

webhook

Telegram 机器人支持两种方式:轮询和 Webhook。为了节约资源我们将使用 Webhook 的方式开发 Telegram 机器人。

本章代码在01/webhook分支。

创建一个机器人

只需要简单的和BotFather对话,即可创建机器人。注意,在创建成功后,会显示一个Token,这个 Token 是非常重要的,后续的所有操作都需要它。

你可以通过官方文档获取帮助。

你可以通过官方文档获取帮助。

流程重现

下面重现一下创建机器人的流程。

以下内容中,> 开头的是你要输入的内容,< 开头的是 Telegram 返回的内容,【】里的内容是本站提供的注释。

以下流程是在和BotFather对话后进行:

一旦机器人接收到新消息,Telegram 会通过 Webhook 进行通知,我们要做的就是处理它的通知信息。它的通知方式为,以 POST 方式将 JSON 格式的消息发送到 Webhook。

假设,我们的 Webhook 是 https://tg.axum.rs/,那么它是这样通知的:

curl -X POST -H 'content-type:application/json' -d '{{"update_id":994028499, "message" ...}' https://tg.axum.rs/

为此,我们先从路由开始:

路由定义

let app = Router::new().route("/", routing::post(handler::hook).get(handler::index));

路由非常简单,只需要定义一个接收POST请求的处理器就好了。本例中的get(handler::index)仅作演示,你可以只定义POST而不处理GET

hander

pub async fn hook(Json(update): Json<Update>) -> String {
    let msg = format!("recieved: {:?}", update);
    tracing::debug!("{}", msg);
    msg
}

pub async fn index() -> &'static str {
    "A telegram bot from axum.rs"
}

我们只关注 hook()。它将接收到的 JSON 数据反序列化为Update结构体。

数据结构

#[derive(Deserialize, Debug)]
pub struct Update {
    pub update_id: u64,
    pub message: Message,
}

#[derive(Deserialize, Debug)]
pub struct Message {
    pub message_id: u64,
}

可以看到,目前为止数据结构非常简单。

  • Update:每次有新消息发送到机器人的时候,Telegram 就会向 Webhook 发送一个序列化为 JSON 的Update对象

  • Message:它包含了新消息的详细数据

Update:每次有新消息发送到机器人的时候,Telegram 就会向 Webhook 发送一个序列化为 JSON 的Update对象

Message:它包含了新消息的详细数据

注册 Webhook

使用 ngrok 内网穿透进行本地开发

Webhook 必须满足以下条件:

  • 必须是公网可访问

  • 必须是域名

  • 必须是HTTPS协议

必须是公网可访问

必须是域名

必须是HTTPS协议

向 Telegram 注册 Webhook

https://api.telegram.org/bot<你的TOKEN>/setWebhook?url=<你的Webhook>

假设 Token 是12345:ABCDE,Webhook 是https://tg.axum.rs/

$ curl 'https://api.telegram.org/bot12345:ABCDE/setWebhook?url=https://tg.axum.rs/'

建议对你的 webhook 地址进行 Url 编码之后再提交。

建议对你的 webhook 地址进行 Url 编码之后再提交。

本章介绍了创建机器人、搭建最基本的 Webhook 以及注册 Webhook 的方法。下一章我们将开始与机器人进行交互。

要查看完整内容,请先登录