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

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

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

Начать курс

Введение: почему C++ для чат-ботов — это не безумие

Когда речь заходит о создании чат-ботов, в голову обычно приходят Python, JavaScript или Node.js. Но что, если я скажу вам, что C++ может быть не менее эффективным инструментом для этой задачи? Да, тот самый C++, который ассоциируется с драйверами, играми и высоконагруженными системами.

На самом деле, чат-боты на C++ — это отличное решение, когда:

  • Вам нужна максимальная производительность (обработка тысяч запросов в секунду);
  • Вы работаете в embedded-среде или на микроконтроллерах;
  • Хотите минимизировать потребление памяти;
  • Просто любите C++ и хотите попробовать что-то новое.

В этом практическом руководстве мы создадим полноценного чат-бота на C++ с нуля. Мы будем использовать реальные библиотеки, писать рабочий код и разберем архитектуру, которая позволит вашему боту общаться через Telegram API. К концу статьи у вас будет не просто теория, а готовый проект, который можно запустить и расширять.

Что нам понадобится: инструментарий

Прежде чем писать код, давайте разберемся с инструментами. Для создания чат-бота на C++ нам потребуются:

Библиотеки

  • libcurl — для HTTP-запросов (отправка и получение данных от API Telegram);
  • nlohmann/json — легковесная библиотека для работы с JSON (парсинг ответов от сервера);
  • Boost.Asio (опционально) — для асинхронной работы с сетью;
  • Threading support (std::thread) — для обработки нескольких запросов одновременно.

Установка (Linux / macOS)

sudo apt-get install libcurl4-openssl-dev  # Для Linux
brew install curl                          # Для macOS

Библиотеку nlohmann/json можно подключить как header-only (просто скачайте json.hpp и положите в проект).

Структура проекта

telegram_bot/
├── main.cpp
├── bot.hpp
├── bot.cpp
├── json.hpp
└── Makefile (или CMakeLists.txt)

Шаг 1: Скелет бота — работа с Telegram API

Telegram Bot API — это RESTful API. Всё, что нам нужно — отправлять HTTP-запросы на https://api.telegram.org/bot<TOKEN>/METHOD. Самый важный метод — getUpdates (получить новые сообщения) и sendMessage (отправить ответ).

Создадим класс TelegramBot, который будет отвечать за всю коммуникацию.

bot.hpp — заголовочный файл

#ifndef BOT_HPP
#define BOT_HPP

#include <string>
#include <vector>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

class TelegramBot {
public:
    explicit TelegramBot(const std::string& token);
    
    // Получить список новых сообщений (long polling)
    std::vector<json> getUpdates(long offset = 0);
    
    // Отправить текстовое сообщение
    bool sendMessage(long chat_id, const std::string& text);
    
    // Обработать одно входящее сообщение
    std::string handleMessage(const json& message);

private:
    std::string api_url_;
    std::string httpGet(const std::string& url);
    std::string httpPost(const std::string& url, const std::string& post_data);
};

#endif // BOT_HPP

bot.cpp — реализация

#include "bot.hpp"
#include <curl/curl.h>
#include <sstream>

// Callback для записи ответа curl в строку
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

TelegramBot::TelegramBot(const std::string& token) 
    : api_url_("https://api.telegram.org/bot" + token + "/") {}

std::string TelegramBot::httpGet(const std::string& url) {
    CURL* curl = curl_easy_init();
    std::string response;
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }
    return response;
}

std::string TelegramBot::httpPost(const std::string& url, const std::string& post_data) {
    CURL* curl = curl_easy_init();
    std::string response;
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }
    return response;
}

std::vector<json> TelegramBot::getUpdates(long offset) {
    std::string url = api_url_ + "getUpdates?offset=" + std::to_string(offset) + "&timeout=30";
    std::string response = httpGet(url);
    
    json data = json::parse(response);
    std::vector<json> updates;
    
    if (data.contains("result") && data["result"].is_array()) {
        for (const auto& update : data["result"]) {
            updates.push_back(update);
        }
    }
    return updates;
}

bool TelegramBot::sendMessage(long chat_id, const std::string& text) {
    std::string url = api_url_ + "sendMessage";
    std::string post_data = "chat_id=" + std::to_string(chat_id) + "&text=" + curl_easy_escape(nullptr, text.c_str(), text.length());
    std::string response = httpPost(url, post_data);
    
    json result = json::parse(response);
    return result.contains("ok") && result["ok"].get<bool>();
}

std::string TelegramBot::handleMessage(const json& message) {
    // Базовая логика: эхо-бот
    if (message.contains("text")) {
        std::string text = message["text"].get<std::string>();
        if (text == "/start") {
            return "Привет! Я бот на C++. Напиши мне что-нибудь!";
        } else if (text == "/help") {
            return "Я умею только повторять твои сообщения. Пока что :)";
        } else {
            return "Ты написал: " + text;
        }
    }
    return "Извини, я понимаю только текст.";
}

Шаг 2: Главный цикл — заставляем бота жить

Теперь напишем main.cpp, который будет запускать нашего C++ бота в вечный цикл обработки сообщений.

#include "bot.hpp"
#include <iostream>
#include <thread>
#include <chrono>

int main() {
    // Встав                

Блоги

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