Почему 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");
}
});
Как