Envoyer des SMS en php (5 lignes)

131
Eléphanteau du PHP | 45 Messages

16 août 2009, 18:07

Ca le fait comme titre.
Bon, en verité, ca n'est pas possible, mais, on peut faire comme si en 5 lignes de code - et vous allez vite comprendre le truc

Le code
$browser = new browser();
$window = $browser->open($sfr_home_url);
$window->document->getElement("form#frm")->submit($sfr_credentials);
$window->go($sfr_mailbox_url);
$window->document->getElement("form#MMSForm")->submit($mms_data);
Le vrai truc
Voici donc une introduction à la vraie partie de ma contribution.
- J'ai ecris un DOM ( CSS rule based) selector (basé sur simplexmlelement) totalement inspiré du Selector.js de Mootools (js framework)
- J'ai ecris un browser en php plutot simple


Quelques liens
http://svn.exyks.org/exts/selectors/ - le dom selector
http://svn.exyks.org/exts/browser/ - le browser http://doc.exyks.org/wiki/Source:ext/browser et sa documentation



Real world usage
Je me sers de cette extension, pour monitorer mon server et recevoir, par exemple, un SMS lorsqu'une url de ping/autocheck ne répond plus convenablement.
//yks_core is http://svn.exyks.org/yks/parts/core
include "yks_core/class/yks/loader.php";
include "yks_core/class/functions.php";

classes::register_class_path("sfr", "sfr.php");
//same as : include 'sfr.php'; sfr::init();

$sfr_login = // your sfr login
$sfr_pswd  = // your sfr password
$sfr_dest  = $sfr_login;


$msg = "Hello world";
var_dump(sfr::send_mms($sfr_login, $sfr_pswd, $sfr_dest, $msg));
Et voilà, c'est tout, evidement http://yks.exyks.org/rsrcs/projects/sfr/sfr.phps est disponible, si vous en avez besoin demandez moi des credentials par mail/mp, mais bon, vous n'y trouverez rien de plus que ce que j'ai deja raconté ici.
Modifié en dernier par 131 le 21 avr. 2010, 13:04, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 août 2009, 10:54

Bonjour,

Merci pour cette contribution, toutefois pourrais tu expliquer davantage le fonctionnement de ton script car cela ne me semble pas très clair...
Tu utilises la webmessagerie SFR pour envoyer des sms?

Pour fonctionner il semblerait qu'il faille télécharger Yks : http://svn.exyks.org/files/yks.zip
Mais quid du fichier "sfr.php" il contient quoi?
Quand tout le reste a échoué, lisez le mode d'emploi...

131
Eléphanteau du PHP | 45 Messages

25 août 2009, 11:34

<?

class sfr {

  private $browser;
  private $window;

  const home_url      = "http://messagerie.sfr.fr";
  const mailbox_url   = "http://www.sfr.fr/web-messagerie/mc/envoyer-texto-mms/index.do";
  const send_success  = "Le Texto a été expédié avec succès !";

  static function init(){
        classes::extend_include_path(array(
            CLASS_PATH."/exts/browser",
            CLASS_PATH."/exts/http",
            CLASS_PATH."/exts/selectors",
        ));
  }

  static function send_mms($user_login, $user_pswd, $dest, $message){
    $session = new self($user_login, $user_pswd);
    return $session->send_message($dest, $message);
  }


  function __construct($user_login, $user_pswd){


    $sfr_credentials = array(
        'username'=>$user_login,
        'password'=>$user_pswd,
    );
    $this->browser = new browser();
    $this->window = $this->browser->open(self::home_url);

        //authentification
    $form = $this->window->document->getElement("form#frm");
    $form->submit($sfr_credentials);

    if(!$this->window->document->getElement("form button[title='Se déconnecter']"))
        throw new Exception("Authentification failure");
  }


  public function send_message($dest, $message){

        // authenfication ok => go to mailbox
    $this->window->go(self::mailbox_url);

    $form = $this->window->document->getElement("form#MMSForm");

        // prepare message
    $mms_data = array(
        'msisdns' =>  $dest,
        'message' =>  utf8_decode($message),
    );

    $form->submit($mms_data);

        // confirm & send message
    $form = $this->window->document->getElement("form#MMSForm");
    $form->submit();

    return $this->window->document->getElement('h3')->get("text")
            == self::send_success;
  }
}
Je ne voulais pas donner le script clefs en main, mais bon, pourquoi pas en fait.
Ex/yks est un layer web qui embarque le yks toolkit (un couteau suisse en PHP). En effet, pour le script ci dessus fonctionne, il faut que ce framework soit présent * (la classe 'browser' y est incluse). J'ai posté dans mon message precedent un exemple fonctionnel d'utilisation de ce script.
Et comme je l'ai expliqué, ceci n'est qu'une simulation d'un browser se connectant au portail sfr, s'identifiant, et utilisant ce portail pour envoyer un sms via les formulaires qui y sont presents. Ca n'est qu'un exemple d'utilisation de "browser.php" qui vous permet de donner à n'importe quel site une API gratuite sur n'importe laquelle de ses fonctionnalitées.

* Vous pouvez faire un checkout de http://svn.exyks.org/yks/parts/core pour obtenir les elements requis afin de faire fonctionner le browser.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 août 2009, 17:46

Unrecoverable error
Configuration file is missing
J'ai cherché dans les fichiers, j'ai cherché dans la doc, nulle part je n'ai trouvé de quel fichier de config il était question et encore moins un exemple de ce fameux fichier de config...

Il faudrait vraiment que tu travailles la documentation ou au moins fasse une procédure d'installation claire parce que là, je vois mal comment d'autres que toi peuvent utiliser ton système... :|
Par ailleurs un conseil : tu devrais éviter de développer les short_open_tags ce n'est pas portable du tout. :)
Quand tout le reste a échoué, lisez le mode d'emploi...

131
Eléphanteau du PHP | 45 Messages

26 août 2009, 00:43

J'ai impardonablement oublié de vous faire savoir que ce script (tel que je l'ai presenté) ne marchera qu'en SAPI cli (en ligne de commande). (et pour ce soir, j'ai pris le temps de rediger un peu de doc sur l'installation (ici, et là). Le chargement d' yks via une interface web ira automatiquement chercher un fichier "config/{$_SERVER['HTTP_HOST']}.xml" (ce qui n'a pas de sens en CLI)... Vous ne pouvez pas leurer la constante PHP_SAPI, mais vous pouvez placer $_SERVER['YKS_FREE'] = true; en haut de votre fichier et desactiver ainsi le chargement de ce fichier de config.xml, quand il n'y a rien a "configurer" comme ici

131
Eléphanteau du PHP | 45 Messages

27 août 2009, 15:05

Je reste curieux de savoir si quelqu'un à réussi à ce servir de ce script et ce qu'il aurait pu en penser :roll:

ViPHP
ViPHP | 2287 Messages

27 août 2009, 16:14

Je reste curieux de savoir si quelqu'un à réussi à ce servir de ce script et ce qu'il aurait pu en penser :roll:
Sois patient... phpfrance n'est pas un service de bêta-testing en temps réel.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

28 août 2009, 13:00

Je reste curieux de savoir si quelqu'un à réussi à ce servir de ce script et ce qu'il aurait pu en penser :roll:
J'ai finalement réussi à le faire marcher :)
Quelques infos importantes:
- vous avez besoin d'activer les short_tags (pôoo bien! ;-) )
- PHP doit être compilé avec OpenSSL pour pouvoir accéder aux pages HTTPS (c'est le cas pour SFR). Dans Wamp, clic sur l'icone, PHP -> Extensions PHP -> phpopenssl doit être côché.
- Attention à l'encodage de votre éditeur de texte quand vous allez créer le fichier sfr.php car les messages de confirmation contiennent des accents et si vous n'avez pas le bon encodage, le script ne pourra pas fonctionner correctement.


Mon avis, c'est que l'approche de Ex/yks est assez intéressante et assez bien réalisée du moment que l'on a compris le fonctionnement.
Moi qui avait l'habitude de tout faire "à la mano" avec cURL et des regex, je pense que je vais tester Ex/yks pour voir si ça me fait gagner du temps :)

Merci en tout cas pour ta contribution et pour les réponses que tu as apportée et qui ont permis de faire fonctionner ton script.
Quand tout le reste a échoué, lisez le mode d'emploi...