[admin sys] free SMS


[admin sys] free SMS


Envoi d'alerte par SMS avec le service free

Préface :

L'administration système l'une de mes passions informatiques favorites, princiaplement sous les systèmes d'exploitation
GNU/Linux et freeBSD. Etant donné que c'est pas une activité professionel pour moi, je me debrouille au mieux pour que
ca me prenne pas trop temps.
J'automatise certaines mise à jours, utilise des scripts de backup, et j'utilise des logiciels de monitoring/surveillances (snort, mrtg, nagios)
pour me prevenir en cas de soucis.
Jusqu'a maintenant pour me prevenir j'utilisais les alerts par mail. Donc en cas de soucis, je n'étais au courant qu'une fois que j'avais checké mes
maills. C'était pas très professionel comme attitude. Surtout que parfois je me connectais pas de tout le week end. Ou comme, cet été quand j'étais en vacances,.
je me connectais qu'une fois par semaine. Heureusement, jusqu'a aujour'hui j'ai jamais eu de gros soucis.

Il a fallut alors, que je trouve un moyen pas trop cher, pour que je sois prevenu le plus rapidement possible en cas de soucis sur un de mes serveurs.
Le meilleur moyen pour cela ca serait d'utiliser mon telephone portable qui est presque tout le temps sur moi.

Pour cela je pensais changer mon vieux telephone portable et prendre une telephone "Nouvelle generation" avec la possibilité de recevoir des MMS à partir d'une adresse email.
J'ai fait alors le tour de quelques offres téléphonie, mais sans vraiment être convaincue. Coté portable, j'ai pas été trop séduit. Les seules telephones qui risquaient de m'intersser était l'iphone et l'open moko. Je me connais, si je le prend ca sera pour une longue durée, il fallait donc que je puisse m'ammuser avec comme je veux et l'améliorer en cas de besoin :p. Pour le reste des telephones, les forfaits étaient trop cher, utilisait un système trop bridé, et rapport fonctionalité/prix pas trop interessant. Certes ca fesait appareil photo, caméra, lecteur mp3, et je sais quel autre gadget, mais ca n'interessait mon côté geek en plus coté forfait , il y avait de forfait data illimité. Je cherchais plutot à savoir sur quel OS le telephone ca tournait, et s'il y a possibilté de transferrer des applications codés par moi dessus, ou encore d'installer un linux embarqué dessus :p. Finalement, j'ai décidé d'abandonner cette piste, du moins jusqu'après la sortie de l'iPhone, et de l'open moko avec le support wifi.

Donc la seul solution qui me restait était utiliser mon bon vieux téléphone. Je pensais alors, à créer un 'tit programme qui m'appele en cas de soucis en utilisant un logiciel de synthèse vocal :p, mais j'ai du abandoner l'idée... ou plutot la reporter pour une autre fois :p
Il me restait qu'utiliser le SMS comme système d'alert.

SMS, oui mais comment ?


Relier deux réseaux entre eux, l'internet de le GSM ! Fidèle au fameux principe "pourquoi faire simple lorsqu'on peu faire compliqué". J'ai pensé à chercher un moyen pour envoyer des SMS depuis mon telephone fixe :p J'ai trouvé quelques outils sympa, mais qui necessitait de relier un vrai telephone portable à la machine. Faute de temps, j'ai remis à cette idée dans ma grande boite d'idée à creuser.
Je me suis alors retourné vers les sites web proposant des services des envois SMS. C'est pas ce qu'il manque sur le net. Certains même sont gratuit. J'en ai verifié quelque'uns mais sans grande satisaction. Les plupart en fait rajoute des pub (ce qui reduit la taille du SMS), d'autres sont pas très sur (peuvent revendre votre numéro de telephone et des partenaires pour vous spammer d'offres commerciales), et le reste sont pas facile à automatiser (utilisent des captcha ou un système compliqué pour pourvoir envoyer le sms). Je me suis alors retourné vers les offres payants.

Les offres SMS Payants


J'ai fait le tour rapidement et comparé les prix, et repertorié ces offres, ce qui donne le tableau suivant :

http://www.smsbox.fr        0,11 €
http://www.cephalo-sms.com    0.157 €
http://www.smsmode.com        0,169 € à 0,110 €
http://www.ti-sms.com        0,0977 ct TTC.
http://www.sms4com.com        0,11 HT
http://www.lesms.com        0.14
http://www.lyra-sms.com        0,065  par SMS (A partir de 10 000 SMS)
http://www.envoyersms.org    0,27 €
http://smstob.com        0,15 €
http://gizmosms.com        0,09€
http://free.phonevalley.com    0,12€
http://www.savemysms.fr        0,15€
http://www.cardboardfish.com    0.085€
http://www.mobimel.com        0,16 €
http://sms.be            0,08 €

J'ai fait le tour des services, testé quelques uns. Finalement j'ai choisis d'utiliser le service fourni par mon opérateur internet Free.

Service SMS de Free


C'est pas le meilleur, ni le moins cher, mais ca permettais d'acheter des petits lots selon ses besoin (de 10 jusqu'a 100), ce qui convenait parfaitement à mon besoin.
Cerise sur le gateau, l'interface d'envoi est tres simple, et l'achat de lots est facile, j'ai rien à payer, ca se rajoute à la fin du mois à ma facture internet.

L'interface est accessible par :
 http://free.phonevalley.com/websms/free/index.jsp

Vous devez avoir un compte, et une fois inscris vous pouvez acheter le lot qui vous convier, et envoyer les sms.

La classe SMS


Il faut trouver maintenant un moyen pour automatiser ses quelques opérations :
 - Se connecter à l'aide d'un identifiant, mot de passe,
 - Envoyer le SMS
 - Recupere le resultat et envoyer un mail ou ecrire dans un log en cas d'erreur.

Etant donné que PHP est mon langage preferé j'ai crée un 'tit classe SMS.
Cette class utilise l'extension CURL qui permet de communiquer facilement avec un serveur WEB.

/**
 * SMS Class
 *
 * Premet d'utiliser le service WEB phonevalley
 * pour recuperer le crédit restant et envoyer des sms
 *
 * Licence: GNU General Public Licence v2 ou supèrieur
 */
Class SMS {
    // Configuration
    private $login='compte'; // email
    private $password='motdepasse';
    private $phone='06xxxxxxxx'; // telephone par default

    // PhoneValley WebService
    private $url_prefix='http://free.phonevalley.com/websms/';
    private $patterns=array(
            'connect'=>'Bonjour',
            'connect_error' =>'|txt_red_alert">([^<]+)</span>|',
            'send'    =>'Votre message a bien',
            'result' =>'|txt_red_alert">([^<]+)</span>|',
            'status'=>'|Bonjour <span class="title_blue">([^<]+)</span>[^l]+l vous reste <span class="txt_red">([^<]+)</span>|'
            );
    private $cookie='cookiefile'; // Fichier ou stocker les infos d'authetification
    private $debug=true;
    private $disable_send=true;
    private $session;
    public $result;
    public $account;
    public $credit;

    function __construct($phone=null,$login=null,$password=null) {
        if ($phone) $this->phone=$phone;
        if ($login) $this->login=$login;
        if ($password) $this->password=$password;
    }
    function __destruct() {
        if ($this->session)
            curl_close($this->session);
    }

    function send($msg) {
        $this->debug("sending message to $this->phone (length:".strlen($msg).")");
        if (!$this->session) { if (!$this->connect()) throw new Exception("Can't connect !"); }
        if ($this->disable_send) return true;
        curl_setopt($this->session, CURLOPT_COOKIEFILE,$this->cookie);
        curl_setopt($this->session, CURLOPT_URL,$this->url_prefix."servlet/com.phonevalley.websms.web.free.HttpSenderSmsServlet");
        curl_setopt($this->session, CURLOPT_POST, 1);
        curl_setopt($this->session, CURLOPT_POSTFIELDS, "TEL=$this->phone&MSG=".urlencode($msg));
       
        $this->result=curl_exec ($this->session);
       
        if (preg_match($this->patterns['result'],$this->result,$error)) {
            if (!strstr($this->result,$this->patterns['send']))
                throw new Exception(html_entity_decode($error[1]));
            else return $this->result;
        }
    }
   
    function connect() {
        $this->debug("connectin using .$this->login");
        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL,$this->url_prefix."servlet/com.phonevalley.websms.web.free.AuthenticateServlet");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "mail=$this->login&password=".urlencode($this->password));
        curl_setopt($ch, CURLOPT_HEADER , 1);
        curl_setopt($ch, CURLOPT_COOKIESESSION, true);
        curl_setopt($ch, CURLOPT_COOKIEJAR,$this->cookie);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
       
        $data=curl_exec ($ch);
        if (preg_match($this->patterns['connect_error'],$data,$error)) {
            throw new Exception(html_entity_decode($error[1]));
        }
        $data=strstr($data,$this->patterns['connect']);
        if ($data) $this->session=$ch;
        return $data;
    }

    public function getInfo() {
        if (!$this->account && !$this->credit) {
            $this->debug('getting info');
            if (!$this->session) {
                if (!$data=$this->connect()) throw new Exception("Can't connect !");
            } else {
                curl_setopt($this->session, CURLOPT_COOKIEFILE,$this->cookie);
                curl_setopt($this->session, CURLOPT_URL,$this->url_prefix."/free/index.jsp");
                curl_setopt($this->session, CURLOPT_POST, 0);
       
                $data=curl_exec ($this->session);       
            }
            if (preg_match($this->patterns['status'],$data,$data)) {
                $this->account=$data[1];
                $this->credit=$data[2];
            } else {
                throw new Exception("Can't parse html !$tmp    ");
            }
        }
        return array('account'=>$this->account,'credit'=>$this->credit);
    }
    private function debug($msg) {
        if ($this->debug)
            echo "[DEBUG]$msg\n";
       
    }
}



Et vala le travail :)

Utilisation de la classe SMS:


Maintenant rien de plus facile, pour l'utiliser :
<?php

 require_once 'SMS.class.php';

 $sms=new SMS();
 // ou
 // $sms=new SMS('06xxxxxxxx');
 try {
    // optionel
    // $sms->connect();
    $sms->getInfo();
    echo " Compte ".$sms->account."\n Credit :".$sms->credit."\n"    ;
    exec('command pour recupere les alerts ',$result);
    if (!empty($result)) {
        if ($sms->send("df:\n ".implode("\n",$result)." \n-------------\n".($sms->credit-1)." sms remaining"))
            echo "Message sent succefully !\n";
        else
            echo "Error sending message !";
    }
 } catch (Exception $e) {
    echo "Echec lors de l'envoi ",$e->getMessage(),"\n";
 }
?>

Et voila le travail :)

Conclusion :

J'avais codé cette classe, uniquement dans le but que ca soit utilisé par le système d'alert. Mais plein d'autres utilisations se sont revelés très utils :) A titre d'exemple, cette page qui permet à mes amis de m'envoyer un SMS quand je suis pas connecté, ou encore quelques scripts qui j'active de temps en temps, qui m'ont permis de recevoir sur mon portable la météo quand je partais en week end, ou me prevenir en cas d'incident sur le métro/train que je prend pour aller au boulot, Ou encore  l'horraire de mon train en cas de grève :) 
Tout ca, en payant uniquement le prix d'un seul SMS (soit 0,12 €).
J'espère que ca vous facilitera aussi la vie si vous l'adoptez. N'hesitez pas à m'en informer, ca me fera plaisir .

PS: Maintenant que ce defis est resolu, je me penche sur un autre, celui d'envoyer des requettes par SMS et de recevoir le resultat par SMS. Exemple: envoyer un sms 'PTSA' pour Prochain Train de Saint-Lazare et recevoir les horraires :p. Je vous tienderai surrement au courant quand j'aurai creusé le problème ;)

Happy hacking ;)






Poster un commentaire:

Nom/Name
Comment.

#.Renaud (05 Aug 2010 - 15:01)

Excellent tutoriel...

Mais il existe une solution très pratique et bon marché que les personnes moins douées en développement pourront utiliser : Le client TeamTILT pour Nagios. D'autres client sont en cours de développement pour pouvoir être utilisés avec un maximum d'outil de monitoring !

Il est complètement libre de licence, vous ne payez que pour les SMS et voice call utilisés ! Plusieurs médias sont disponibles, SMS, voice call, push iphone notification et email ! Les deux derniers étant gratuits ;) !

Une fonction "heartbeat" est également disponible, de ce fait même si votre service mail ou votre serveur de monitoring tombent, une alerte vous est envoyé ! Fonction que vous n'aurez pas en installant vous même un modem ! De plus, aucun matériel supplémentaire n'est nécessaire !

Vous pourrez trouver plus d'information et le télécharger à cette adresse :
http://www.alarmtilt.com/fr/gerez-vos-alertes-nagios-avec-teamtilt.html

Bien à vous,

Renaud
#.PM (05 Apr 2008 - 22:05)

Gerard : Actuelement j'ai pas ce besoin. mais je pense pas qu'avec free ca soit possible.
Par contre, j'en avais testé un l'epoque (je pense que c'est cardboardfish.com) qui permettait de definir l'adresse de l'envoyeur, donc de recevoir les reponses. Peut etre qu'il y a une offre spécifique chez phonevalley premettant de le faire.
#.Gerard (05 Apr 2008 - 21:15)

Bonsoir,
Je viens d'acheter des SMS "free.phonevalley.com" dans le but d'interroger une balise GPS/GPRS qui normalement doit me répondre, également par SMS. Mais je ne vois nulle part d'information sur la façon dont les réponses arrivent. Avez-vous déj reçu une réponse par SMS un SMS envoyé par "free.phonevalley.com"?
Merci
 1
3 commentaires