Отправка SMS на C++ с помощью API библиотеки libcurl

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

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

Начать курс

Отправка SMS на C++ с помощью библиотеки libcurl

В современной разработке часто требуется интеграция с внешними сервисами для отправки SMS-сообщений. На C++ эту задачу можно эффективно решить с помощью библиотеки libcurl — мощного инструмента для работы с HTTP/HTTPS протоколами. Библиотека libcurl предоставляет простой и гибкий API для выполнения запросов к REST-сервисам, включая отправку SMS через API провайдеров.

Что такое libcurl?

libcurl — это кроссплатформенная библиотека для передачи данных по различным протоколам (HTTP, HTTPS, FTP, SMTP и другим). Она широко используется в C++ проектах благодаря своей стабильности, производительности и обширной документации. Для отправки SMS нам потребуется функционал HTTP POST-запросов с передачей JSON или URL-encoded данных.

Установка libcurl

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

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

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

Базовый пример: отправка SMS через HTTP POST

Рассмотрим отправку SMS с использованием API популярного сервиса (например, Twilio, Nexmo или российского аналога). В примере ниже мы отправляем POST-запрос с JSON-данными, содержащими номер получателя и текст сообщения.

#include <iostream>
#include <string>
#include <curl/curl.h>

// Функция обратного вызова для записи ответа сервера
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& apiKey, const std::string& phone, const std::string& message) {
    CURL* curl;
    CURLcode res;
    std::string response;
    
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    
    if(curl) {
        // URL API-эндпоинта (замените на ваш)
        curl_easy_setopt(curl, CURLOPT_URL, "https://api.smsprovider.com/v1/send");
        
        // Заголовки: тип контента и авторизация
        struct curl_slist* headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        std::string authHeader = "Authorization: Bearer " + apiKey;
        headers = curl_slist_append(headers, authHeader.c_str());
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        
        // Формируем JSON тело запроса
        std::string jsonData = "{";
        jsonData += "\"phone\":\"" + phone + "\",";
        jsonData += "\"message\":\"" + message + "\"";
        jsonData += "}";
        
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        
        // Выполняем запрос
        res = curl_easy_perform(curl);
        
        // Проверяем результат
        if(res != CURLE_OK) {
            std::cerr << "Ошибка curl: " << curl_easy_strerror(res) << std::endl;
            curl_easy_cleanup(curl);
            curl_global_cleanup();
            return false;
        }
        
        // Получаем HTTP код ответа
        long httpCode;
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode);
        
        curl_easy_cleanup(curl);
        curl_global_cleanup();
        
        if(httpCode == 200 || httpCode == 201) {
            std::cout << "SMS успешно отправлен. Ответ: " << response << std::endl;
            return true;
        } else {
            std::cerr << "Ошибка сервера. HTTP " << httpCode << ": " << response << std::endl;
            return false;
        }
    }
    
    curl_global_cleanup();
    return false;
}

int main() {
    // Данные для отправки
    std::string apiKey = "your_api_key_here";
    std::string phone = "+79001234567";
    std::string message = "Привет! Это тестовое SMS с C++.";
    
    if(sendSms(apiKey, phone, message)) {
        std::cout << "Операция завершена успешно." << std::endl;
    } else {
        std::cout << "Произошла ошибка." << std::endl;
    }
    
    return 0;
}

Компиляция и запуск

Для компиляции примера необходимо указать линковку с libcurl:

g++ -o sms_sender sms_sender.cpp -lcurl                    

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