用 Rust 打造聊天机器人:从创意到成品,一晚搞定

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么 Rust 是您聊天机器人的“大脑”利器

\n\n

如果您习惯用 Python 编写机器人,并认为速度已经无法再提升——那么您还没试过 Rust。Rust 不仅提供速度,还能让您控制每一个字节。用 Rust 编写的聊天机器人运行极快,内存消耗极低,并且不会出现运行时错误。在本指南中,我们将构建一个真实的 Telegram 机器人,它能处理命令、回复消息,并以解释型语言无法企及的性能运行。

\n\n

我们将从零开始编写机器人,使用 teloxide 和 reqwest 这两个 crate。您将看到异步 Rust 如何轻松处理数千个请求,以及为什么 用 Rust 创建聊天机器人 是对项目稳定性的投资。

\n\n

环境配置与首次启动

\n\n

在编写代码之前,请确保您已安装 Rust。如果没有,请执行:

\n\n
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
\n\n

将 cargo 添加到 PATH 并创建一个新项目:

\n\n
cargo new rust_tg_bot\ncd rust_tg_bot
\n\n

现在打开 Cargo.toml 并添加依赖项:

\n\n
[dependencies]\nteloxide = { version = "0.12", features = ["macros"] }\nreqwest = { version = "0.11", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1.0", features = ["derive"] }
\n\n

这些 crate 是我们机器人的基础。teloxide 是一个强大的 Telegram API 框架,而 reqwest 允许我们进行 HTTP 请求(例如,向外部 API 发送请求)。

\n\n

获取令牌并编写机器人“骨架”

\n\n

访问 @BotFather,创建一个新机器人并复制令牌。将其保存到环境变量中:

\n\n
export TELOXIDE_TOKEN=您的令牌在此
\n\n

现在编写一个最简单的机器人版本,用于响应 /start 命令:

\n\n
use teloxide::prelude::*;\n\n#[tokio::main]\nasync fn main() {\n    pretty_env_logger::init();\n    log::info!("正在启动 Rust 聊天机器人...");\n\n    let bot = Bot::from_env();\n\n    teloxide::repl(bot, |bot: Bot, msg: Message| async move {\n        if let Some(text) = msg.text() {\n            if text == "/start" {\n                bot.send_message(msg.chat.id, "你好!我是 Rust 机器人 🦀")\n                    .await?;\n            }\n        }\n        Ok(())\n    })\n    .await;\n}
\n\n

运行 cargo run 并向机器人发送 /start。如果一切正常,您将收到问候语。请注意:用 Rust 编写机器人 配合 teloxide 只需最少的代码,却能带来最大的性能。

\n\n

它是如何工作的?

\n
    \n
  • Bot::from_env() — 从环境变量 TELOXIDE_TOKEN 中读取令牌。
  • \n
  • teloxide::repl — 一个无限的消息处理循环。
  • \n
  • 每条消息都会传递给闭包,我们在其中检查文本并发送回复。
  • \n
\n\n

添加命令和参数处理

\n\n

简单的回复太无聊了。让我们创建一个 /echo 命令,用于重复用户的文本。为此,我们使用 teloxide 的 Command 注解:

\n\n
use teloxide::utils::command::BotCommand;\n\n#[derive(BotCommand)]\n#[command(rename = "lowercase", description = "可用命令:")]\nenum Command {\n    #[command(description = "显示问候语。")]\n    Start,\n    #[command(description = "重复您的文本。")]\n    Echo(String),\n}\n\nasync fn answer(bot: Bot, msg: Message, cmd: Command) -> ResponseResult<()> {\n    match cmd {\n        Command::Start => {\n            bot.send_message(msg.chat.id, "你好!我是 Rust 回显机器人。").await?;\n        }\n        Command::Echo(text) => {\n            bot.send_message(msg.chat.id                

博客

书籍推荐