Отправка SMS на C++: API библиотека LibCurl и REST-запросы

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

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

Начать курс

Отправка SMS на C++: Полное руководство по использованию API с библиотекой LibCurl

Отправка SMS-сообщений является одной из ключевых функций современных приложений: от двухфакторной аутентификации до уведомлений о статусе заказа. В экосистеме C++ нет встроенных средств для работы с SMS-шлюзами, однако с помощью универсальной библиотеки libcurl и стандартных HTTP-запросов можно легко интегрировать любой REST API SMS-провайдера. В этой статье мы разберём, как написать надёжную функцию для отправки SMS на C++, используя библиотеку LibCurl, и рассмотрим типовые примеры для популярных сервисов (Twilio, SMS Aero, Bytehand).

Почему LibCurl?

LibCurl — это кроссплатформенная библиотека для передачи данных по различным протоколам (HTTP, HTTPS, FTP и др.). Она поддерживает:

  • GET, POST, PUT, DELETE запросы
  • SSL/TLS (HTTPS)
  • Работу с заголовками и телом запроса
  • Обработку ответов сервера

Для отправки SMS достаточно выполнить POST-запрос к API выбранного провайдера, передав необходимые параметры (номер телефона, текст, ключ API). LibCurl берёт на себя всю низкоуровневую работу с сокетами и шифрованием.

Установка библиотеки

В большинстве дистрибутивов Linux LibCurl можно установить через пакетный менеджер:

sudo apt-get install libcurl4-openssl-dev  # Ubuntu/Debian
sudo yum install libcurl-devel             # CentOS/RHEL

Для Windows можно скачать предварительно собранные DLL с официального сайта или использовать vcpkg:

vcpkg install curl

Подключение в коде:

#include <curl/curl.h>
#include <string>
#include <json/json.h>  // если используете JSON (nlohmann/json)

Базовая структура SMS-функции

Создадим универсальную функцию sendSms, которая принимает URL API, ключ, номер получателя и текст сообщения. Для работы с JSON удобно использовать библиотеку nlohmann/json (заголовочная, не требует сборки).

#include <iostream>
#include <string>
#include <curl/curl.h>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

// Callback для записи ответа сервера
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;
}

bool sendSms(const std::string& url, const std::string& apiKey, 
             const std::string& phone, const std::string& message) {
    CURL *curl;
    CURLcode res;
    std::string readBuffer;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(!curl) return false;

    // Формируем JSON тело запроса
    json payload;
    payload["phone"] = phone;
    payload["text"] = message;
    payload["api_key"] = apiKey;

    std::string jsonStr = payload.dump();

    // Настройка HTTP-запроса
    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Content-Type: application/json");
    headers = curl_slist_append(headers, "Accept: application/json");

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonStr.c_str());
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

    // Выполняем запрос
    res = curl_easy_perform(curl);

    // Очистка
    curl_easy_cleanup(curl);
    curl_global_cleanup();

    if(res != CURLE_OK) {
        std::cerr << "Ошибка curl: " << curl_easy_strerror(res) << std::endl;
        return false;
    }

    // Парсим ответ (пример для Twilio)
    try {
        json response = json::parse(readBuffer);
        if(response.contains("error_message") && !response["error_message"].is_null()) {
            std::cerr << "Ошибка API: " << response["error_message"] << std::endl;
            return false;
        }
        std::cout << "SMS отправлено. ID: " << response["sid"] << std::endl;
        return true;
    } catch(...) {
        // Если ответ не JSON (например, plain text)
        std::cout << "                    

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