التثبيت وأول رسالة SMS
pip install envoisms، ثم client = EnvoiSMSClient(api_key=os.getenv("ENVOISMS_API_KEY")). تعيد client.send(to="+212600000000", message="…", from_sender="MonBusiness") معرّف الرسالة، الذي تتابعه عبر get_message() وتجده في الويب هوك.
- from envoisms import EnvoiSMSClient
- from_sender: اسم المرسل المعتمد، أو احذفه لاستعمال المرسل الافتراضي
- send_bulk(messages=[...], from_sender=...) للإرسال الجماعي؛ وlist_messages(limit=50, offset=0) لآخر عمليات الإرسال
إرسال آمن عند الإعادة والأخطاء
يحمل كل استدعاء send() وsend_bulk() مفتاح Idempotency-Key — مولَّدًا، أو مرّر idempotency_key= — فلا تُفوتر إعادة المحاولة بعد انتهاء المهلة الرسالة نفسها مرتين أبدًا. ويعيد العميل محاولة ردود 5xx وأخطاء الشبكة حتى max_retries مرة (2 افتراضيًا) بمهلة متزايدة، ثم يرمي EnvoiSMSError مع الخاصيتين status_code وcode.
- EnvoiSMSClient(api_key=..., max_retries=3, timeout=20)
- except EnvoiSMSError as e: e.status_code, e.code
SMS أم واتساب، والانتقال التلقائي
SMS افتراضيًا: تصل إلى كل الهواتف المغربية دون أي إعداد غير مفتاح API. أما channel="whatsapp" فترسل من رقم WhatsApp Business الخاص بك المربوط بالمنصة — 403 WHATSAPP_NOT_CONNECTED بدونه، و400 OUT_OF_24H_WINDOW للنص الحر خارج نافذة 24 ساعة، ولا خصم في الحالتين. خارج النافذة مرّر قالبًا معتمدًا. وcascade=True تعيد الرسالة إلى SMS إذا تعذر الوصول إلى الرقم أو لم يكن لديه واتساب.
- template={"name": "order_shipped", "language": "fr", "variables": ["89240"]}
- اترك channel على "sms" لأي نص عادي إلى زبون
OTP والويب هوك والحساب
تعيد client.send_otp(to=..., brand="MonBusiness", code_length=6, expiry=600) معرّف session_id؛ وتعيد client.check_otp(session_id=..., code=...) الحقل verified؛ وتقرأ get_otp_session() الجلسة دون استهلاك محاولة. وتتحقق EnvoiSMSClient.verify_webhook_signature(raw_body=..., signature_header=..., secret=...) من الترويسة X-EnvoiSMS-Signature على جسم الطلب الخام.
- send_otp(..., channel="whatsapp"): رمز عبر واتساب من المرسل المشترك، دون ربط
- get_balance() وlist_packs() وcreate_topup(amount_mad=200, payment_method="stripe")
- analytics(days=30) وcreate_api_key() وcreate_optout()