Telegram бот на C++: пошаговый гайд для смелых

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

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

Начать курс

Почему C++ для Telegram-бота? Это не безумие

Когда речь заходит о создании Telegram-ботов, в голову первым делом приходят Python, Node.js или Go. Они просты, имеют тысячи готовых библиотек и огромные комьюнити. Но что, если ваш проект требует максимальной производительности? Или вы пишете высоконагруженный парсер? А может, вы просто фанат C++ и хотите сделать всё «по-хардкору»?

Написать Telegram бота на C++ — задача вполне реальная. Да, это не самый популярный путь, но у него есть серьёзные плюсы: скорость работы, низкое потребление памяти и полный контроль над каждым байтом. В этом гайде мы пройдём путь от установки библиотек до готового бота, который отвечает на команды и парсит данные. Поехали!

Что нам понадобится?

Для работы нам потребуется:

  • Компилятор C++17/20 — g++ (Linux/macOS) или MSVC (Windows).
  • CMake — система сборки (версия 3.10+).
  • Библиотека tgbot-cpp — самая популярная C++ обёртка для Telegram Bot API.
  • libcurl — для HTTP-запросов (идёт в составе tgbot-cpp).
  • nlohmann/json — для работы с JSON (тоже входит в зависимости).
  • Токен бота — получите его у @BotFather в Telegram.

Весь код мы будем писать под Linux (Ubuntu 22.04), но он легко адаптируется под Windows через vcpkg или Conan.

Шаг 1: Установка библиотек

Сначала установим зависимости. В терминале выполняем:

sudo apt update
sudo apt install git cmake g++ libcurl4-openssl-dev libssl-dev nlohmann-json3-dev

Теперь клонируем и собираем tgbot-cpp:

git clone https://github.com/reo7sp/tgbot-cpp.git
cd tgbot-cpp
mkdir build && cd build
cmake ..
make -j4
sudo make install

Если всё прошло успешно, библиотека установлена в систему. Проверить можно командой ls /usr/local/include/tgbot/ — вы увидите заголовочные файлы.

Шаг 2: Структура проекта и CMakeLists.txt

Создадим папку для проекта:

mkdir my_telegram_bot && cd my_telegram_bot
touch main.cpp CMakeLists.txt

В CMakeLists.txt пишем конфигурацию сборки:

cmake_minimum_required(VERSION 3.10)
project(MyTelegramBot)

set(CMAKE_CXX_STANDARD 17)

find_package(TgBot REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(CURL REQUIRED)

add_executable(my_bot main.cpp)
target_link_libraries(my_bot TgBot::TgBot OpenSSL::SSL OpenSSL::Crypto CURL::libcurl)

Обратите внимание: мы подключаем OpenSSL и libcurl — они нужны для шифрования и HTTP-запросов.

Шаг 3: Пишем ядро бота на C++

Открываем main.cpp и пишем минимальную структуру:

#include <tgbot/tgbot.h>
#include <iostream>

int main() {
    // Замените на свой токен
    std::string token = "1234567890:ABCdefGHIjklMNOpqrsTUVwxyz";

    TgBot::Bot bot(token);

    // Обработчик команды /start
    bot.getEvents().onCommand("start", [&bot](TgBot::Message::Ptr message) {
        bot.getApi().sendMessage(message->chat->id, "Привет! Я бот на C++. Чем могу помочь?");
    });

    // Обработчик любого текстового сообщения
    bot.getEvents().onAnyMessage([&bot](TgBot::Message::Ptr message) {
        if (message->text == "/start") return; // Игнорируем дубли
        bot.getApi().sendMessage(message->chat->id, "Вы написали: " + message->text);
    });

    try {
        std::cout << "Бот запущен. Ждём сообщения..." << std::endl;
        TgBot::TgLongPoll longPoll(bot);
        while (true) {
            longPoll.start();
        }
    } catch (TgBot::TgException& e) {
        std::cerr << "Ошибка: " << e.what() << std::endl;
    }

    return 0;
}

Что здесь происходит:

  • Создаётся объект Bot с токеном.
  • Регистрируются обработчики команд и текста.
  • Запускается бесконечный цикл Long Poll — бот сам опрашивает сервер Telegram на наличие новых сообщений.

Собираем проект:

mkdir build && cd build
cmake ..
make -j4

Запускаем: ./my_bot. Если в консоли нет ошибок — идите в Telegram и напишите вашему боту /start. Он ответит!

Шаг 4: Добавляем полезные функции

Простое «эхо» — скучно. Давайте добавим команду /weather, которая парсит погоду (упрощённо, без реального API, чтобы не усложнять пример):

bot.getEvents().onCommand("weather", [&bot](TgBot::Message::Ptr message) {
    std::string response = "Погода в Москве: +15°C, облачно с прояснениями.";
    bot.getApi().sendMessage(message->chat->id, response);
});

А теперь — команда /calc, которая принимает выражение и считает его (осторожно, eval на C++ — это опасно, для примера используем простой парсинг):

bot.getEvents().onCommand("calc", [&bot](TgBot::Message::Ptr message) {
    std::string text = message->text;
    // Удаляем "/calc " из начала
    if (text.size() < 6) {
        bot.getApi().sendMessage(message->chat->id, "Использование: /calc 2+2");
        return;
    }
    std::string expr = text.substr(6);
    // Очень простой парсер: ищем '+' и складываем
    size_t pos = expr.find('+');
    if (pos != std::string::npos) {
        int a = std::stoi(expr.substr(0, pos));
        int b = std::stoi(expr.substr(pos+1));
        int result = a + b;
        bot.getApi().sendMessage(message->chat->id, std::to_string(a) + " + " + std::to_string(b) + " = " + std::to_string(result));
    } else {
        bot.getApi().sendMessage(message->chat->id, "Пока поддерживается только сложение. Пример: /calc 10+20");
    }
});

Как

Блоги

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