为什么 Rust 是您聊天机器人的“大脑”利器
\n\n如果您习惯用 Python 编写机器人,并认为速度已经无法再提升——那么您还没试过 Rust。Rust 不仅提供速度,还能让您控制每一个字节。用 Rust 编写的聊天机器人运行极快,内存消耗极低,并且不会出现运行时错误。在本指南中,我们将构建一个真实的 Telegram 机器人,它能处理命令、回复消息,并以解释型语言无法企及的性能运行。
\n\n我们将从零开始编写机器人,使用 teloxide 和 reqwest 这两个 crate。您将看到异步 Rust 如何轻松处理数千个请求,以及为什么 用 Rust 创建聊天机器人 是对项目稳定性的投资。
环境配置与首次启动
\n\n在编写代码之前,请确保您已安装 Rust。如果没有,请执行:
\n\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\n将 cargo 添加到 PATH 并创建一个新项目:
cargo new rust_tg_bot\ncd rust_tg_bot\n\n现在打开 Cargo.toml 并添加依赖项:
[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访问 @BotFather,创建一个新机器人并复制令牌。将其保存到环境变量中:
\n\nexport TELOXIDE_TOKEN=您的令牌在此\n\n现在编写一个最简单的机器人版本,用于响应 /start 命令:
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
Bot::from_env()— 从环境变量TELOXIDE_TOKEN中读取令牌。 \n teloxide::repl— 一个无限的消息处理循环。 \n - 每条消息都会传递给闭包,我们在其中检查文本并发送回复。 \n
添加命令和参数处理
\n\n简单的回复太无聊了。让我们创建一个 /echo 命令,用于重复用户的文本。为此,我们使用 teloxide 的 Command 注解:
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