إرسال الرسائل النصية القصيرة (SMS) بلغة Go (Golang): نظرة عامة على مكتبات API وأمثلة على التنفيذ
يُعد إرسال رسائل SMS إحدى الوظائف الأساسية لتطبيقات الويب الحديثة: بدءًا من المصادقة الثنائية وصولاً إلى الإشعارات بحالة الطلب. في نظام Go (Golang) البيئي، توجد العديد من المكتبات الناضجة التي تسمح بدمج إرسال SMS عبر بوابات شائعة (Twilio, Vonage, Clickatell، ومزودي الخدمة الروس). في هذه المقالة، سنشرح بالتفصيل كيفية إعداد إرسال SMS بلغة Go باستخدام أفضل الممارسات وواجهات API الرسمية.
لماذا Go لإرسال الرسائل النصية القصيرة (SMS)؟
Go هي لغة مُجمّعة مع دعم ممتاز للتوازي، مما يجعلها مثالية للإرسال غير المتزامن لعدد كبير من الرسائل. بفضل goroutines والقنوات المدمجة، يمكنك معالجة آلاف طلبات SMS دون حظر الخيط الرئيسي. بالإضافة إلى ذلك، تسمح المكتبة القياسية net/http بالعمل بسهولة مع REST API لأي مزود خدمة SMS.
المكتبات الرئيسية للعمل مع SMS في Go
- twilio-go — العميل الرسمي لـ Twilio (الخدمة الدولية الأكثر شيوعًا). يدعم SMS و MMS والمكالمات الصوتية.
- vonage-go (المعروف سابقًا باسم Nexmo) — عميل لـ Vonage API.
- go-sms — مكتبة عالمية تدعم عدة مزودي خدمة (SMS.ru, Twilio, Clickatell).
- gosms — غلاف بسيط لطلبات HTTP لأي بوابة SMS.
تثبيت المكتبة
على سبيل المثال، سنستخدم العميل الرسمي Twilio. قم بتثبيت الحزمة عبر go get:
go get github.com/twilio/twilio-goبالنسبة للمزود الروسي SMS.ru، توجد أيضًا مكتبة مناسبة:
go get github.com/smsru/smsru-goمثال أساسي: إرسال SMS عبر Twilio
قبل البدء، احصل على Account SID و Auth Token من لوحة تحكم Twilio. فيما يلي الحد الأدنى من الكود العملي:
package main
import ( "fmt" "os"
"github.com/twilio/twilio-go" openapi "github.com/twilio/twilio-go/rest/api/v2010")
func main() { // تهيئة العميل client := twilio.NewRestClientWithParams(twilio.ClientParams{ Username: os.Getenv("TWILIO_ACCOUNT_SID"), Password: os.Getenv("TWILIO_AUTH_TOKEN"), })
// معلمات الرسالة params := &openapi.CreateMessageParams{} params.SetTo("+1234567890") // رقم المستلم params.SetFrom("+0987654321") // رقم Twilio الخاص بك params.SetBody("مرحبًا! هذه رسالة SMS اختبارية من Go!")
// الإرسال resp, err := client.Api.CreateMessage(params) if err != nil { fmt.Println("خطأ في الإرسال:", err) return }
fmt.Println("تم إرسال SMS! SID:", *resp.Sid)}إرسال SMS عبر بوابة روسية (SMS.ru)
للتكامل مع SMS.ru، استخدم المكتبة smsru-go. سيكون الكود كالتالي:
package main
import ( "fmt" "os"
"github.com/smsru/smsru-go")
func main() { // إنشاء عميل باستخدام مفتاح API client := smsru.NewClient(os.Getenv("SMSRU_API_KEY"))
// إرسال رسالة واحدة result, err := client.SendSMS("+79991234567", "مرحبًا! هذا اختبار من Go!") if err != nil { fmt.Println("خطأ:", err) return }
if result.Status == "OK" { fmt.Println("تم إرسال SMS! المعرف:", result.SmsID) } else { fmt.Println("خطأ:", result.StatusText) }}الإرسال غير المتزامن باستخدام goroutines
إحدى المزايا الرئيسية لـ Go هي القدرة على إرسال SMS بالتوازي بسهولة. مثال على الإرسال الجماعي:
package main
import ( "fmt" "sync")
func sendSMSAsync(client *smsru.Client, phone, message string, wg *sync.WaitGroup) { defer wg.Done() resul