Отправка 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 << "