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