Bien que ce ne soit plus une nouveauté au jour d’aujourd’hui, il y a quelques semaines, Free Mobile mettait à disposition une API permettant d’envoyer des notifications SMS directement sur son téléphone lié à son compte Free Mobile.
Je me suis dit que ce serait sympa à intégrer au logiciel d’alerte Leboncoin que je maintient sur GitHub. C’est chose faite avec la version 2.4 qui permet maintenant d’envoyer les alertes par SMS grâce à la nouvelle API de Free Mobile.
Pour l’occasion, j’ai écris une petite classe pour prendre en charge l’envoi des SMS. Je vous partage donc le code (c’est simple, mais peut toujours servir) :
<?php namespace SMS; class FreeMobile { protected $_url = "https://smsapi.free-mobile.fr/sendmsg"; protected $_user; protected $_key; protected $_curl; public function __construct() { $this->_curl = curl_init(); curl_setopt($this->_curl, CURLOPT_SSL_VERIFYPEER, false); } public function __destruct() { curl_close($this->_curl); } /** * Envoi un message par SMS. * @param string $msg * @throws \Exception */ public function send($msg) { $msg = trim($msg); if (!$this->_user || !$this->_key || empty($msg)) { throw new \Exception("Un des paramètres obligatoires est manquant", 400); } curl_setopt($this->_curl, CURLOPT_URL, $this->_url."?user=".$this->_user. "&pass=".$this->_key. "&msg=".urlencode($msg)); curl_exec($this->_curl); if (200 != $code = curl_getinfo($this->_curl, CURLINFO_HTTP_CODE)) { switch ($code) { case 400: $message = "Un des paramètres obligatoires est manquant."; break; case 402: $message = "Trop de SMS ont été envoyés en trop peu de temps."; break; case 403: $message = "Vous n'avez pas activé la notification SMS dans votre espace abonné Free Mobile ou votre identifiant/clé est incorrect."; break; case 500: $message = "erreur sur serveur Free Mobile."; break; default: $message = "erreur inconnue."; } throw new \Exception($message, $code); } return $this; } /** * @param string $user * @return \SMS\FreeMobile */ public function setUser($user) { $this->_user = $user; return $this; } /** * @return string */ public function getUser() { return $this->_user; } /** * @param string $key * @return \SMS\FreeMobile */ public function setKey($key) { $this->_key = $key; return $this; } /** * @return string */ public function getKey() { return $this->_key; } }
Elle exploite cURL, veillez à l’avoir installée.
Je l’ai placée dans un espace de nom « SMS » que vous pouvez enlever si vous ne souhaitez pas utiliser les espaces de nom.
L’usage est extrêmement simple :
// inclure ici le fichier de la classe require "sms/FreeMobile.php"; $sms = new SMS\FreeMobile(); /** * configure l'ID utilisateur et la clé disponible dans * le compte Free Mobile après avoir activé l'option. */ $sms->setKey("La clé générée") ->setUser("votre id Free Mobile"); try { // envoi d'un message $sms->send("Hello World !"); } catch (Exception $e) { // le monde n'est pas parfait, il y aura // peut-être des erreurs. echo "Erreur sur envoi de SMS: (".$e->getCode().") ".$e->getMessage(); }
À vous de trouver des cas d’utilisation maintenant 😉
Confirmation ! En testant le logiciel Windows Freemobile_SMS_Notifier.zip, vous pourrez constater par vous même que l’envoi du SMS fonctionne si vous l’envoyez sur votre ligne FREE, MAIS pas sur un autre numéro ! (pour ma part, un SFR)
Service gratuit mais verrouillé ;o(((
Verrouillé ? Il n’a jamais été question de pouvoir envoyer des SMS vers d’autre numéro que celui du compte Free Mobile. Tous les sites en parlant le précisaient. Il n’est pas difficile de comprendre pourquoi …
Merci pour le script. Par contre, le CURL sur un HTTPS ne fonctionne pas pour moi. Cela me faisait une erreur: SSL: certificate subject name ‘*.free.fr’ does not match target host name ‘smsapi.free-mobile.fr’ (avec la fonction curl_error)
J’ai du passé par un file_get_contents et récuper son http_code.
Étrange l’erreur, je n’ai pas rencontré ce souci.
Avec : curl_setopt($this->_curl, CURLOPT_SSL_VERIFYPEER, false);
On évite une erreur sur les certificats non « certifié ». Mais là, je ne vois pas en quoi est du ton erreur.
Si j’ai le temps, j’essayerai de creuser.
J’ai réussi à le faire passer en mettant:
curl_setopt($this->_curl, CURLOPT_SSL_VERIFYHOST, 0);
le problème à mon avis vient d’un souci plutot serveur (côté DNS) donc le script n’y est pas pour grand chose.
A+
Il y a une erreur sur la dernière ligne pour afficher le code et le message de l’exception, la dernière parenthèse est en trop.
Effectivement, corrigé. Merci.
J’essaie depuis une page PHP hébergée chez Free (…) dans les pages perso.
J’ai une box B&You, et je teste juste l’URL.
Pour l’instant, j’obtiens « Firefox ne peut trouver le serveur à l’adresse smsapi.free-mobile.fr ».
Le service serait déjà déconnecté ?
C’est bon ! le temps que B&You résolve le DNS, j’ai reçu mon message de test.
Bonjour,
cURL n’a pas l’air d’être utilisable sur les pages perso de Free : avez-vous des infos ?
Les connexions distantes ne sont pas autorisées sur les hébergements perso Free.
Il faudra trouver un autre hébergeur.
Merci pour l’info.
Mais je tiens à envoyer les SMS depuis les pages perso Free.
J’y arrive depuis une page PHP, maintenant je cherche un moyen de récupérer les codes d’erreur. Ça a pas l’air coton, beaucoup de méthodes sont bridées.
Salut
Quelqu’un a t’il noté si le numéro utilisé pour l’envoi est toujours le même SVP ?
C’est pour pouvoir l’utiliser sur un service où le numéro d’envoi doit être connu pour passer, comme AndroidLost.
Le numéro destinataire ne peut pas être modifié car celui-ci ne peut être que le numéro associé au compte Free Mobile.
OK le numéro de téléphone utilisé pour envoyer les notifs (alias N. de l’expéditeur) est son propre N. de téléphone Free Mobile. Merci.
Avoir intégré les Status codes HTTP dans le script est une bonne idée pour savoir rapidement ou regarder en cas de schmilblick.
Pour ma part un essai avec l’URL de l’API Free-SMS-notification, j’obtiens une page _blanche_ code source inclu ; autant dire que j’aimerai bien un status code ! La syntaxe utilisée est correcte sauf erreur perso : …/sendmsg?user=CODE&pass=KEY&msg=MESSAGE%20ENCODED
Bonjour chez loi l’exécution de ce script m’envoi deux message identique ? Avez-vous une solution à ce problème
Bonjour,
Il faudrait pouvoir voir le code exacte, je n’ai jamais eu de souci d’envoi en double.
C’est exactement le même que vous. Un fichier php pour la class et un autre pour l’exécution du script. Les seules valeurs qui changent sont mon identifiant et le mot de passe.
Je peux maintenant vous envoyer les scripts par mail si vous pensez pouvoir m’aider.
j’aime trop mais j’ai pas bien compris comment faire ça de toutes façon merci pour le tuto
Bonjour,
J’ai essayé de vous contacter via GitHub mais impossible.
Est-il possible d’ajouter votre script directement sur le chrome store ? Car quand je l’importe, celui-ci le bloque quelques minutes plus tard…
Dommage de ne pas pouvoir profiter d’un super travail à cause de ce blocage. Merci 🙂
Bonjour,
Lignes 36 et 51 : throw new \Exception . L’anti-slash me signale une erreur Unexpected character in input: ‘\’ (ASCII=92)
Je l’ai supprimé mais sans résultat satisfaisant.
J’ai encore l’erreur suivante que je ne sais pas interpréter :
FreeMobile chargéFreeMobile Object ( [_url:protected] => https://smsapi.free-mobile.fr/sendmsg [_user:protected] => 102xxxxx [_key:protected] => we6puExxxxxxxx [_curl:protected] => Resource id #5 ) Erreur sur envoi de SMS: (0) erreur inconnue.
Une piste svp ?
Bonjour,
ça fonctionne avec EasyPHP 14.1 (en local)
mais sur le site de FREE ou même OVH ça ne fonctionne pas.
Voici l’erreur :
Ligne 11 —–> $sms = new SMS\FreeMobile(); // new SMS\FreeMobile();
Warning: Unexpected character in input: ‘\’ (ASCII=92) state=1 in /mnt/153/sda/3/4/geryko/sendsms.php on line 11
Parse error: syntax error, unexpected T_STRING in /mnt/153/sda/3/4/geryko/sendsms.php on line 11
Que se passe t-il ?
Remède ?
Merci
(au départ j’avais tenté de tout mettre sur la racine, sans le dossier sms)
Sur Free, les appels distants ne sont pas autorisés, il n’est donc pas possible d’utiliser l’API sur leur hébergement.
Pour OVH, ca devrait passer.
Bonjour Blount et merci pour ta réponse.
Non, sur OVH ça ne fonctionne pas non plus. Dommage.
Une solution ?
L’erreur semble venir de la version de PHP utilisée.
Le script utilise les namespace, il faut donc PHP >= 5.3.
Oui !
OVH = PHP Version 5.2.17 au 04/11/2016
FREE = PHP Version 5.1.3RC4-dev au 04/11/2016
Normalement, il est possible de choisir la version PHP à utiliser (du moins sur OVH, Free je ne sais pas).
J’essaierai de changer OVH la semaine prochaine.
Je n’ai pas mes identifiants OVH à mon domicile.
Bonjour à tous,
Sur free, j’ai réussi à passer en version PHP Version 5.6.8 (5.3 non disponible)
grâce à ce lien :
https://www.freenews.fr/freenews-edition-nationale-299/services-web-180/pages-perso-free-ajout-support-php-5-6
Mais j’ai encore une erreur :
Fatal error: Call to undefined function SMS\curl_init() in /var/www/sda/3/4/geryko/sms/FreeMobile.php on line 14
ligne 14 —-> $this->_curl = curl_init();
Que puis-je faire ?
Merci
Comme indiqué plus haut, il n’est pas possible de faire des appels distants sur Free, donc impossible d’utiliser l’API sur leur hébergement.
Merci pour ce script qui fonctionne parfaitement!
Bonjour, je souhaite intégrer votre système.
Après test aucun sms n’arrive.
PHP Version 5.5.9-1
Petite question : ou entrez vous le numéro de téléphone sur lequel recevoir le sms ?
Je sais pas vous mais je ne peux plus utiliser l’option sms de free depuis quelques jours, erreur 500 retournée: erreur sur serveur Free Mobile.
C’est revenu aujourd’hui, YES!!