Чат-боты на Rust: от идеи до готового бота за один вечер

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему Rust — это выстрел в «мозги» вашего чат-бота

Если вы привыкли писать ботов на Python и думаете, что быстрее уже некуда — вы не пробовали Rust. Rust даёт не просто скорость, а контроль над каждым байтом. Чат-боты на Rust работают молниеносно, потребляют копейки памяти и не падают с ошибками времени выполнения. В этом руководстве мы соберём реального Telegram-бота, который обрабатывает команды, отвечает на сообщения и делает это с производительностью, недоступной интерпретируемым языкам.

Мы напишем бота с нуля, используя крейты teloxide и reqwest. Вы увидите, как легко асинхронный Rust справляется с тысячами запросов, и почему создание чат-бота на Rust — это инвестиция в стабильность вашего проекта.

Настройка окружения и первый запуск

Прежде чем писать код, убедитесь, что у вас установлен Rust. Если нет — выполните:

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

Добавьте cargo в PATH и создайте новый проект:

cargo new rust_tg_bot
cd rust_tg_bot

Теперь откройте Cargo.toml и добавьте зависимости:

[dependencies]
teloxide = { version = "0.12", features = ["macros"] }
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }

Эти крейты — фундамент нашего бота. teloxide — мощный фреймворк для Telegram API, а reqwest позволит делать HTTP-запросы (например, к внешним API).

Получаем токен и пишем «скелет» бота

Зайдите в @BotFather, создайте нового бота и скопируйте токен. Сохраните его в переменную окружения:

export TELOXIDE_TOKEN=ваш_токен_здесь

Теперь напишем самую простую версию бота, которая отвечает на команду /start:

use teloxide::prelude::*;

#[tokio::main]
async fn main() {
    pretty_env_logger::init();
    log::info!("Запускаем чат-бота на Rust...");

    let bot = Bot::from_env();

    teloxide::repl(bot, |bot: Bot, msg: Message| async move {
        if let Some(text) = msg.text() {
            if text == "/start" {
                bot.send_message(msg.chat.id, "Привет! Я бот на Rust 🦀")
                    .await?;
            }
        }
        Ok(())
    })
    .await;
}

Запустите cargo run и напишите боту /start. Если всё ок — вы получите приветствие. Обратите внимание: написание бота на Rust с teloxide требует минимум кода, но даёт максимум производительности.

Как это работает?

  • Bot::from_env() — читает токен из переменной окружения TELOXIDE_TOKEN.
  • teloxide::repl — бесконечный цикл обработки сообщений.
  • Каждое сообщение передаётся в замыкание, где мы проверяем текст и отправляем ответ.

Добавляем обработку команд и аргументов

Простой ответ — скучно. Давайте сделаем команду /echo, которая повторяет текст пользователя. Для этого используем Command-аннотацию из teloxide:

use teloxide::utils::command::BotCommand;

#[derive(BotCommand)]
#[command(rename = "lowercase", description = "Доступные команды:")]
enum Command {
    #[command(description = "Показать приветствие.")]
    Start,
    #[command(description = "Повторить ваш текст.")]
    Echo(String),
}

async fn answer(bot: Bot, msg: Message, cmd: Command) -> ResponseResult<()> {
    match cmd {
        Command::Start => {
            bot.send_message(msg.chat.id, "Привет! Я эхо-бот на Rust.").await?;
        }
        Command::Echo(text) => {
            bot.send_message(msg.chat.id, text).await?;
        }
    }
    Ok(())
}

#[tokio::main]
async fn main() {
    let bot = Bot::from_env();
    Command::repl(bot, answer).await;
}

Теперь бот понимает /echo Привет, мир! и отвечает тем же текстом. Обратите внимание: создание чат-бота на Rust с teloxide позволяет легко парсить команды и аргументы — никакого ручного разбора строк.

Работа с внешними API: погода на Rust

Настоящий бот должен быть полезным. Добавим команду /weather, которая получает погоду через OpenWeatherMap. Вам понадобится API-ключ (бесплатный на openweathermap.org).

Сначала создадим структуру для ответа API:

use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct WeatherResponse {
    main: Main,
    weather: Vec<Weather>,
}

#[derive(Deserialize, Debug)]
struct Main {
    temp: f64,
}

#[derive(Deserialize, Debug)]
struct Weather {
    description: String,
}

Теперь добавим команду /weather в наш enum и обработчик:

#[derive(BotCommand)]
enum Command {
    Start,
    Echo(String),
    Weather(String), // город
}

async fn answer(bot: Bot, msg: Message, cmd: Command) -> ResponseResult<()> {
    match cmd {
        // ... предыдущие команды ...
        Command::Weather(city) => {
            let api_key = std::env::var("WEATHER_API_KEY").unwrap_or_default();
            let url = format!(
                "https://api.openweathermap.org/data/2.5/weather?q={}&appid={}&units=metric",
                city, api_key
            );

            let resp = reqwest::get(&url).await?.json::<WeatherResponse>().await;

            match resp {
                Ok(weather) => {
                    let temp = weather.main.temp;
                    let desc = &weather.weather[0].description;
                    let reply = format!("В городе {} сейчас {:.1}°C, {}.", city, temp, desc);
                    bot.send_message(msg.chat.id, reply).await?;
                }
                Err(_) => {
                    bot.send_message(msg.chat.id, "Не удалось получить погоду. Проверьте название города.")
                        .await?;
                }
            }
        }
    }
    Ok(())
}

Не забудьте установить WEATHER_API_KEY в переменные окружения. Теперь чат-бот на Rust умеет показывать погоду — быстро, без тормозов, с асинхронными запросами.

Асинхронность и производительность: почему Rust выигрывает

В отличие от Python, где GIL ограничивает параллелизм, Rust использует асинхронные задачи на основе tokio. Это значит, что ваш бот может обрабатывать сотни сообщений в секунду,

Блоги

Рекомендаций по книгам