Numéros de téléphone ivoiriens : formats, préfixes et validation pour développeurs
Un numéro mal formaté est le premier motif d'échec d'un envoi. Voici les formats à accepter, comment les normaliser et reconnaître l'opérateur.
Envoyer un SMS en Python avec l'API SMS Gold : exemple avec requests, fonction réutilisable, intégration Django et FastAPI, gestion des erreurs.
Script d'automatisation, back-end Django ou API FastAPI : Python permet d'envoyer un SMS en quelques lignes. Voici comment utiliser l'API SMS Gold proprement, avec une gestion des erreurs adaptée à la production.
export SMSGOLD_API_KEY=sk_live_…requests : pip install requestsimport os
import requests
response = requests.post(
"https://smsgold.tornixtech.com/api/v2/sms/send",
headers={"Authorization": f"Bearer {os.environ['SMSGOLD_API_KEY']}"},
json={
"to": "+2250700000000",
"message": "Votre commande n°1042 est prête.",
"sender_name": "MABOUTIQUE",
},
timeout=30,
)
print(response.status_code, response.json())
Le paramètre json= encode le corps et ajoute l'en-tête Content-Type: application/json automatiquement. Le timeout évite qu'un appel bloque indéfiniment votre programme.
import os
import re
import requests
API_URL = "https://smsgold.tornixtech.com/api/v2/sms/send"
class SmsError(Exception):
def __init__(self, status: int, message: str):
super().__init__(f"{status} : {message}")
self.status = status
def normalize_ci(phone: str) -> str:
"""07 00 00 00 00 -> +2250700000000"""
digits = re.sub(r"\D", "", phone)
return "+" + digits if digits.startswith("225") else "+225" + digits
def send_sms(to: str, message: str, sender: str = "MABOUTIQUE") -> dict:
try:
r = requests.post(
API_URL,
headers={"Authorization": f"Bearer {os.environ['SMSGOLD_API_KEY']}"},
json={"to": normalize_ci(to), "message": message, "sender_name": sender},
timeout=30,
)
except requests.RequestException as exc:
raise SmsError(0, f"connexion impossible : {exc}") from exc
data = r.json() if r.content else {}
if r.status_code != 200 or not data.get("success"):
raise SmsError(r.status_code, data.get("error", "erreur inconnue"))
return data
Placez la fonction dans un module (par exemple notifications/sms.py) et appelez-la après l'enregistrement d'une commande. Pour ne pas ralentir la réponse HTTP, déléguez l'envoi à une tâche asynchrone (Celery, Django-Q, RQ) :
# tasks.py (Celery)
from celery import shared_task
from notifications.sms import send_sms, SmsError
@shared_task(bind=True, max_retries=3, default_retry_delay=60)
def notify_order_ready(self, phone: str, order_id: int):
try:
send_sms(phone, f"Votre commande n°{order_id} est prête. Retrait dès aujourd'hui.")
except SmsError as exc:
# On ne relance que les problèmes de connexion, pas les erreurs de requête
if exc.status == 0:
raise self.retry(exc=exc)
raise
Avec FastAPI, les BackgroundTasks suffisent pour un volume modéré :
from fastapi import FastAPI, BackgroundTasks
from notifications.sms import send_sms
app = FastAPI()
@app.post("/orders/{order_id}/ready")
def order_ready(order_id: int, phone: str, tasks: BackgroundTasks):
tasks.add_task(send_sms, phone, f"Votre commande n°{order_id} est prête.")
return {"ok": True}
GET /account/credits) avant toute relance pour éviter un doublon.r = requests.get(
"https://smsgold.tornixtech.com/api/v2/account/credits",
headers={"Authorization": f"Bearer {os.environ['SMSGOLD_API_KEY']}"},
timeout=15,
)
print(r.json()["credits"])
Pratique pour déclencher une alerte interne lorsque le solde passe sous un seuil.
Consultez la documentation de l'API, les exemples en PHP et Node.js, et notre guide pour envoyer des codes OTP par SMS en toute sécurité.
Un numéro mal formaté est le premier motif d'échec d'un envoi. Voici les formats à accepter, comment les normaliser et reconnaître l'opérateur.
Du premier SMS envoyé avec cURL à une classe réutilisable et un service Laravel, avec une gestion propre des erreurs.
Aucune dépendance nécessaire : Node.js 18+ intègre fetch. Exemples en JavaScript, TypeScript et Express.
Créez votre compte gratuitement, importez vos contacts et préparez vos messages. Vous activez l'envoi quand vous êtes prêt.