Envoyer des SMS en Python avec l’API OVH

28 novembre 2017
Actualités

Un petit post technique pour partager une expérience récente et servir aussi d’aide-mémoire tant il n’a pas été simple de trouver la configuration adéquate. Il s’agit d’envoyer des SMS depuis un script python, dans un contexte d’envoi d’alertes dans mon cas, mais ça peut aussi être utile dans d’autres cas (Nouvel an, Saint-Valentin…). On dispose pour cela de l’API OVH, pour peu qu’on y ait souscrit une offre SMS (c’est la partie la plus simple).

Charger l’API OVH en python

Première étape ensuite, disposer depuis Python d’un accès à l’API. Si comme moi vous commencez par la page « Premiers pas avec l’API » d’OVH, vous trouverez en bas de celle-ci le lien vers la « surcouche » de l’API en Python. Première erreur. Je ne sais pas si c’est déprécié ou n’a jamais bien fonctionné, mais il suffit en fait de passer par pip et d’installer la librairie ovh !

Donc :

pip install ovh

Et la meilleure doc est finalement là : https://github.com/ovh/python-ovh

Comprendre les différentes clés.

Comme l’indique la première page de la doc de la librairie Python sur Pypi, l’instanciation d’un objet Client de l’API nécessite de transmettre trois paramètres liés à votre compte : une « application key », une « application secret » et une « consumer key » ! Pour les deux premières, c’est assez simple, il suffit d’aller à la page dédiée sur le site OVH : on y créé son « application » et en retour on obtient les clé applicative et son mot de passe. Pour la troisième ça se corse… Il faut faire un script permettant de la générer. Il est indiqué sur la page github, mais mérite qu’on s’y arrête :

# -*- encoding: utf-8 -*-

import ovh

# create a client using configuration
client = ovh.Client()

# Request RO, /me API access
ck = client.new_consumer_key_request()
ck.add_rules(ovh.API_READ_ONLY, "/me")

# Request token
validation = ck.request()

print "Please visit %s to authenticate" % validation['validationUrl']
raw_input("and press Enter to continue...")

# Print nice welcome message
print "Welcome", client.get('/me')['firstname']
print "Btw, your 'consumerKey' is '%s'" % validation['consumerKey']

Déjà la partie de création de l’objet client suppose que vous appliquiez ce qui a été fait dans les paragraphes précédents de la doc (ce qui n’est pas forcément le cas). Donc on fait plutôt ça :

client = ovh.Client('ovh-eu', application_key='your_application_key', application_secret='your_application_secret, consumer_key='' )

Ensuite, modifiez aussi le script pour activer les droits nécessaires à l’envoi des SMS et à l’accès à votre compte :

# Request RW, /me and /sms API access
ck = client.new_consumer_key_request()
ck.add_recursive_rules(ovh.API_READ_ONLY, "/me")
ck.add_recursive_rules(ovh.API_READ_WRITE, "/sms")

et lancez le script en ligne de commande.
Celui-ci va générer un lien, et vous demander d’appuyer sur Entrée pour continuer. Mais visitez bien le lien d’abord ! Sur la page web correspondante, validez les droits indiqués, choisissez leur limite de validité et seulement alors terminez l’exécution du script en appuyant sur Entrée en ligne de commande. Normalement vous obtenez alors votre précieuse « consumer key » qui va vous permettre d’instancier dans de nouveaux scripts des objets ovh.Client dotés des droits qui leur ont été associés. On va donc pouvoir envoyer des SMS via les méthodes de l’API OVH.

Envoyer un SMS pour de vrai

On trouve vite dans la doc de l’API les URL à utiliser pour manipuler des SMS, qui recourrent toutes à une dimension « serviceName » référencée nulle part (non, ce n’est pas « sms »). Il faut récupérer cette dernière par une première requête à l’API, de la forme :

res = client.get('/sms')

qui renvoie un tableau avec une seule valeur, celle du nom interne de votre service, avec lequel on peut alors construire l’URL de base pour la suite :

url = '/sms/' + res[0] + '/jobs/'

On voit ensuite dans la doc de l’API qu’il suffit de faire un POST sur /jobs pour envoyer des SMS, mais la liste des paramètres obligatoires ou optionnels est longue et pas forcément juste… Si vous aurez sans doute des idées quant au contenu du message, il vous faudra obligatoirement un paramètre « sender » correspondant à l’expéditeur du SMS. C’est une string, mais qui doit correspondre à un compte expéditeur créé dans la console d’administation de votre compte OVH-Télécom. Il faut le savoir, d’autant que le paramètre est marqué comme facultatif dans la doc (mais l’API elle-même vous rappelle vitre à l’ordre lors de vos essais infructueux). Par défaut vous en avez un qui correspond à votre compte général OVH, mais vous pouvez aussi en créer de nouveaux, avec des noms plus adaptés à l’application. Une fois le nom du Sender récupéré dans l’admin, ça devient plus simple :

result_send = client.post(url,
    charset='UTF-8',
    coding='7bit',
    message="Votre message",
    noStopClause=False,
    priority='high',
    receivers= ["+336xxxxxxxx","+336xxxxxxxx"],
    senderForResponse=False,
    validityPeriod=2880,
    sender="Le nom du sender tel que proposé dans l'admin"
)
print json.dumps(result_send, indent=4) # pour l'affichage du résultat de la transaction. 

Remarquez néanmoins l’utilisation de la numérotation internationale et quelques paramètres dont la description est proposée dans la doc de l’API.
Normalement c’est bon, vos destinataires devraient recevoir leurs messages.

A bientôt.