webhook

本章代码在01/webhook分支。

创建一个机器人

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

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

流程重现

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

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

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

开发 Webhook

一旦机器人接收到新消息,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:它包含了新消息的详细数据

注册 Webhook

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

Webhook 必须满足以下条件:

  • 必须是公网可访问

  • 必须是域名

  • 必须是HTTPS协议

很明显,如果我们在开发期间就去折腾这些非常低效,好在有ngrok,它可以实现内网穿透,将本地开发环境暴露给公网。

向 Telegram 注册 Webhook

现在可以向 Telegram 注册我们的 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 以及注册 Webhook 的方法。下一章我们将开始与机器人进行交互。

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