12 Juin 2014

Notification par SMS chez Free Mobile via API avec un client Shell

Category: Administration de serveur,Domotiquecduv @ 01:16

Hier, l'opérateur Free Mobile a annoncé un nouveau service gratuit pour ses abonnés : le service d'envoi de SMS via une API.

Pratique et réclamé depuis un moment (même payant) ce service permet d'envoyer des SMS à son propre numéro d'abonné Free Mobile (et uniquement à celui-ci) depuis des appareils connectés tels que les lapin Karotz, un NAS, un serveur (de domotique par exemple).

Le service gratuit s'active en un clic via l'Espace Abonné, "Gérer mon compte" > "Mes Options" et est actif quasi-immédiatement.
Une fois activé, l'envoi du SMS se fait via l'adresse https://smsapi.free-mobile.fr/sendmsg avec les paramètres suivants :

  • user : L'identifiant Free Mobile (celui utilisé pour accéder à l'Espace Abonné)
  • pass : La clé d'identification générée et fournie par Free Mobile via l'Espace Abonné
  • msg : Le contenu du SMS encodé sous forme d'url (en Percent-encoding)

Par exemple pour envoyer le message « All your base are belong to us » sur votre mobile il vous suffit d'utiliser (accéder à) l'URL suivante (remplacer "1234567890" et "s0me5eCre74p1K3y" par vos informations) :

https://smsapi.free-mobile.fr/sendmsg?user=1234567890&pass=s0me5eCre74p1K3y&msg=All%20your%20base%20are%20belong%20to%20us

Pour aider l'envoi de SMS d'alerte depuis vos serveurs en ligne de commande je vous propose le client shell tout simple suivant (et un script PHP aussi simple plus tard) :

send-notification.sh "All your base are belong to us"

Code source disponible sur GitHub : freemobile-smsapi-client

Plus de raison de ne pas vous faire envoyer des SMS d'alertes en cas d'événements importants tels que la chute de services (Nginx, Apache, MySQL, etc.), de problèmes matériels (grappe RAID, segfault kernel, redémarrage impromptu, etc.) ou attaques (fail2ban, fichiers de logs, etc.) voire d’intrusions physiques (dans le cas d'installation domotique : eeDomus, domogik, Homewizard, VeraLite, Z-Wave).

13 Réponses à “Notification par SMS chez Free Mobile via API avec un client Shell”

  1. genma a dit:

    Merci pour le script shell, c'est super !

  2. patpro a dit:

    Chouette script, bien écrit et commenté, par contre je m'interroge sur l'encodage du message. Tu n'utilises pas --data-urlencode ?
    Et aussi (l'avis du mec qui reçoit autour de 900 messages de notification par jour) : le header MESSAGE_HEADER qui dit "Notification :" il me semble plus qu'inutile 🙂
    Dans la même veine, quitte à ajouter un footer, autant le rendre dynamique (invoquer hostname plutôt que de mettre "Le serveur de la maison" en dur).

    • cduv a dit:

      Les valeurs des variables MESSAGE_HEADER et ...FOOTER sont des exemples à modifier à sa convenance 😉 (perso j'ai pas de FOOTER).
      Pour l'encodage j'ai vu plusieurs scripts avec --data-urlencode mais si je l'utilise je n'ai plus de multiligne. Je dois encore faire des tests sur plusieurs OS de
      mobile (dans mon cas sur iOS ça passe bien).

  3. patpro a dit:

    Ha tiens, c'est intéressant ce problème de multi-ligne associé au urlencode. Si je n'utilise pas data-urlencode dans mon script, un sms multilinge ne part carrément pas, mais c'est sans doute du au fait que je compte sur urlencode pour convertir les \r en %0D.

    J'ai le sentiment diffus que ça pourrait être plus simple en POST...

    • cduv a dit:

      Oui, je suis d'accord : il faudrait tester en POST. Mais la "doc" n'indique pas quel format pour coder les 3 paramètres (application/x-www-form-urlencoded ?).
      À la limite les 2 premiers dans l'URL (?user=...&pass=...) puis le message en raw dans le body de la requête POST ?

  4. microniko a dit:

    Si ça intéresse, j'ai commis un bout de code (vite fait et très sale) en PHP...

    https://gitlab.com/microniko/mysms

    Des fois que ça serve à quelqu'un...

  5. Minux a dit:

    Merci pour ce script, très utile 🙂

  6. nico a dit:

    Je confirme pour le code PHP ! Il ne fonctionne pas (notamment à cause d'une fonction _() qui n'existe pas). A refaire de bout en bout

  7. microniko a dit:

    @nico: la fonction _() est un alias de la fonction gettext [http://php.net/manual/en/function.gettext.php}] !

  8. Driss2Nice a dit:

    Ça marche aussi bien en POST avec du json :

    POST https://smsapi.free-mobile.fr/sendmsg

    Header :

    Content-Type: application/json

    Body:

    {
    "user" : "...",
    "pass" : "...",
    "msg" : "....."
    }

    Pour tester via Mozilla, installez le plugin/extension RESTClient.

  9. blogueur tech a dit:

    J'imagine déjà coupler ça avec une camera et un détecteur de mouvements, y'a de quoi s'amuser ! 😀

  10. Dioscurde a dit:

    voici un code que j'ai pondu vite fait... il manque de sureté mais il fonctionne.

    Pseudo
    E-mail ou n° de tel
    Message(160 characters maxi)
    Envoyer

    function envoi() {
    //on confirme l'envoi :
    var answer = confirm ('Envoyer?');
    if (answer) {
    //onrecupere les données :
    var service = "https://smsapi.free-mobile.fr/sendmsg?";
    var accs = "user=12345678&pass=ICI_VOTRE_PASS&msg=";
    var monserv ="From:MON SERVEUR...%20";
    var pseudo = document.getElementById("nom").value;
    var contact = document.getElementById("email").value;
    var content = document.getElementById("message").value;
    var monurl = service + accs + monserv +"Pseudo:"+ pseudo +"%20Contact:"+ contact +"%20Message:%20"+ content;//<==vous pouvez arrangez ceci à votre sauce
    var myWindowURL = monurl;
    var myWindowName = "ONESMS";//<==peut être changé(mais pas trop utile)
    var myWindowProperties = "width=320,height=170,top=250,left=300,menubar=no,toolbar=no,titlebar=no,statusbar=no";
    var myWindow = window.open(myWindowURL, myWindowName, myWindowProperties);
    }
    };

  11. stealth a dit:

    Bonjour, Super script
    Est-il possible de s’envoyer la conso via ce biais ?

    ça pourrait être super pratique de recevoir la conso d'un appareil, par exemple une camera 3g, sur son tel

    Mon bon j'imagine que ce n'est pas possible

Laisser une réponse