إرسال SMS بلغة C++: مكتبات API libcurl و cpprestsdk
في التطوير الحديث بلغة C++، غالبًا ما تنشأ الحاجة إلى التكامل مع الخدمات الخارجية، بما في ذلك إرسال رسائل SMS. على الرغم من أن المكتبة القياسية للغة C++ لا توفر أدوات مدمجة للعمل مع طلبات HTTP، إلا أن هناك مكتبات خارجية قوية تحل هذه المشكلة. في هذه المقالة، سنستعرض مكتبتين شائعتين — libcurl (CURL) و cpprestsdk (Casablanca) — وسنوضح كيفية استخدامهما لإرسال SMS عبر API لمزودي خدمة SMS المشهورين.
لماذا تحتاج إلى مكتبة لإرسال SMS بلغة C++؟
إرسال SMS عبر C++ هو مهمة نموذجية لتطبيقات الخادم، وأنظمة المراقبة، والإشعارات، أو الأتمتة. العمل المباشر مع المقابس (sockets) وبروتوكول HTTP في C++ معقد وعرضة للأخطاء. المكتبات مثل libcurl و cpprestsdk تجرد هذا التعقيد، وتوفر واجهة سهلة لتنفيذ طلبات HTTP (GET، POST، PUT) ومعالجة الردود بصيغة JSON/XML.
سنستخدم API لمزود خدمة SMS (مثل Twilio، SMS.ru أو أي مزود آخر يدعم REST API). في الأمثلة أدناه، استبدل YOUR_API_KEY و YOUR_SENDER و YOUR_PHONE ببياناتك الحقيقية.
المكتبة 1: libcurl (CURL)
libcurl هي مكتبة مجربة عبر الزمن للعمل مع عناوين URL، وتدعم العديد من البروتوكولات (HTTP، HTTPS، FTP وغيرها). هي مكتوبة بلغة C، ولكن لديها روابط ممتازة بلغة C++. لاستخدامها في مشروع C++، يكفي تضمين ملف الرأس curl/curl.h والربط مع libcurl.
تثبيت libcurl
- لينكس (Ubuntu/Debian):
sudo apt-get install libcurl4-openssl-dev - ويندوز: قم بتنزيل الملفات الثنائية المجمعة مسبقًا من الموقع الرسمي أو استخدم vcpkg:
vcpkg install curl - macOS:
brew install curl
مثال لإرسال SMS عبر libcurl (صيغة C++)
في هذا المثال، نستخدم طلب POST بسيط مع بيانات بصيغة JSON. مكتبة libcurl تعالج رؤوس HTTP وجسم الطلب.
#include <iostream>#include <string>#include <curl/curl.h>
// دالة الاستدعاء لتسجيل رد الخادمsize_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { size_t totalSize = size * nmemb; output->append((char*)contents, totalSize); return totalSize;}
bool sendSMS_via_libcurl(const std::string& phone, const std::string& message) { CURL* curl = curl_easy_init(); if (!curl) return false;
std::string response; std::string url = "https://api.sms-provider.com/v1/send"; // استبدل بعنوان URL لمزود الخدمة الخاص بك std::string jsonData = R"({ "api_key": "YOUR_API_KEY", "sender": "YOUR_SENDER", "phone": ")" + phone + R"(", "text": ")" + message + R"(" })";
struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl); curl_slist_free_all(headers); curl_easy_cleanup(curl);
if (res != CURLE_OK) { std::cerr << "خطأ في curl: " << curl_easy_strerror(res) << std::endl; return false; }
std::cout << "رد الخادم: " << response << std::endl; return true;}
int main() { curl_global_init(CURL_GLOBAL_DEF