Free vient de mettre à disposition de ses abonnés Free-mobile un moyen simple de générer via une API accessible en ligne des SMS à soi-même. L'utilisation est globalement très simple et tient presque toutes ses promesses (actuellement il ne semble pas possible de faire du POST
, seul le GET
fonctionne).
Il suffit aux intéressés de se rendre sur leur interface de gestion de compte Free-mobile, dans la section "Mes options", et d'y activer (vers le bas de la page) l'option ad-hoc. Une fois l'option activée, Free vous gratifie d'un mot de passe dédié à cet usage, et vous renseigne un peu sur le fonctionnement du service :
Une fois l'option activée, l'utilisation se résume à une requête HTTP
de cette forme :
curl 'https://smsapi.free-mobile.fr/sendmsg?user=***&pass=***&msg=coucou'
Vous recevez alors sur votre téléphone Free-mobile le SMS contenant le message "coucou".
La création d'un message multiligne est un peu plus délicate. La plupart des plateforme Unix/Linux envoie en guise de séparateur de ligne un \n
qui se traduit par %0a
une fois "url-encodé". Malheureusement, l'API n'accepte pas ce %0a
et le message sera tronqué à la première occurrence.
Par contre, le séparateur de ligne \r
, encodé en %0d
est bien accepté par l'API Free-mobile. Il faut donc, avant d'envoyer un message sur plusieurs lignes, traduire les \n
en \r
.
J'ai conçu un script shell pour mes besoins personnels. Il prend ses données en entrée standard, par exemple via un pipe :
echo "mon message" | sms.sh
Ce qui est plus souple pour moi dans bien des situations, que de devoir invoquer le script et de lui servir le message comme argument, par exemple :
autresms.sh mon message
Voici donc le code de mon script qui prend les messages via stdin
, et qui converti les \n
en \r
. Notez que le SMS à l'arrivée ne contient pas de saut de ligne, donc prévoyez des espaces en fin de ligne si vous ne voulez pas que la fin de ligne soit collée au début de la ligne suivante.
#!/usr/local/bin/bash # # push notification via smsapi.free-mobile.fr # LOGGEROPT="-p security.notice -t SMS" REPLOGG=1 REPMAIL=1 MAILTO=root USR="****" PSW="****" URL="https://smsapi.free-mobile.fr/sendmsg" CURL=/usr/local/bin/curl report() { [ ${REPLOGG} -eq 1 ] && echo $@ | logger ${LOGGEROPT} [ ${REPMAIL} -eq 1 ] && echo $@ | mail -s "SMS $@" ${MAILTO} } eval $(${CURL} --insecure -G --write-out "c=%{http_code} u=%{url_effective}" \ -o /dev/null -L -d user=${USR} -d pass=${PSW} --data-urlencode msg="$(cat|tr '\n' '\r')" ${URL} 2>/dev/null | tr '&' ';') echo ${c} ${u}\&pass=***\&msg=${msg} | logger ${LOGGEROPT} case ${c} in "200") exit 0 ;; "400") report "parameter missing" ; exit 400 ;; "402") report "too many SMS..." ; exit 402 ;; "403") report "service unavailable for user, or wrong credentials" ; exit 403 ;; "500") report "server error, try later" ; exit 500 ;; *) report "unexpected result" ; exit 600 ;; esac
Utilisation :
echo "mon message sur plusieurs lignes" | sms.sh
Il reste à faire :
- ajouter l'enregistrement dans les log système de chaque utilisation du script sms.sh
- ajouter la gestion des codes de retour HTTP
autres que 200.
Attention
Pour bénéficier d'une gestion d'erreur et d'une trace dans les log de la machine j'ai utilisé une grosse ruse très sale avec eval
. Cela permet de créer des variables à la volée à partir de données fournie par l'utilisateur. C'est éminemment risqué car tout ce est qui généré par c=%{http_code} u=%{url_effective}
sera évalué sans distinction (avec potentiellement des exécutions de code).
Pour un système de monitoring c'est un risque négligeable : les messages sont connus et fixés par le logiciel qui les génère, sans interaction avec l'utilisateur. Pour une utilisation dans tout autre mécanisme la prudence est requise.