Classe wikiloc

Contenu du snippet

Ceci est une source ré-écrite à partir de la source se trouvant à cette url :
http://www.phpcs.com/codes/WIKILOC-ARTICLE-WIKIPEDIA-SUR-VOTRE-MOBILE-SFR-PLUS_52839.aspx

Titre de la source : L'ARTICLE WIKIPEDIA SUR VOTRE MOBILE SFR LE PLUS PROCHE DE L'ENDROIT OU VOUS ÊTES PAR UN SIMPLE SMS VIA SFR API

Le service wikiloc peut être customisé en bas du script et les classes peuvent être ré-utilisées à d'autres fins.

Source / Exemple :


<?php

	/**



	/**

  • Classe d'erreur générique
  • /
class WikiLoc_Exception extends Exception { } /**
  • Classe d'erreur du webservice
  • /
class WikiLoc_Exception_WS extends WikiLoc_Exception { } /**
  • Classe générique gérant la communication avec le webservice
  • /
class WikiLoc_WS { /**
  • Nom du serveur contenant le webservice
  • /
private $server; /** public static $context = array( 'http' => array( 'method' => 'GET', 'timeout' => 20 ) ); public function __construct($server) { $this->server = $server; } /**
  • Execute un appel vers le webservice et retourne la réponse sous forme de chaine
  • @params string l'url a executer
  • @params array un tableau associatif d'arguments
  • @returns string la réponse de la page
  • /
public function Run($uri, $parameters = null) { // crée l'url $url = 'http://'.$this->server.$uri; if (is_array($parameters)) { $url .= '?'; foreach($parameters as $name => $value) { $url .= $name.'='.urlencode($value).'&'; } } // crée le contexte $context = stream_context_create(self::$context); if (!$content) { throw new WikiLoc_Exception_WS( 'Unable to create the context : '.print_r(self::$context, true) ); } // ouvre la connexion $fp = @fopen($url, 'rb', false, $context); if (!$fp) { throw new WikiLoc_Exception_WS( 'Unable to execute the page : '.$url ); } // charge la page $response = @stream_get_contents($fp); fclose($fp); // lit la réponse if ($response === false) { throw new WikiLoc_Exception_WS( 'Problem reading data from : '.$url ) } return $response; } /** public function RunAsXml($uri, $parameters = null) { $return = @simplexml_load_string( $this->Run($uri, $parameters) ); if ($return === false) { throw new WikiLoc_Exception_WS( 'Unable to read response for '.$uri ); } else return $return; } } /**
  • Wrapper du webservice
  • /
class WikiLoc extends WikiLoc_WS { /** private $token = ''; /**
  • L'identifiant de l'api WIKI
  • /
private $wiki_account = ''; /**
  • Chargement du webservice
  • /
public function __construct($token, $wiki_account) { parent::__construct('ws.red.sfr.fr'); if (strlen($token) != 32) { throw new WikiLoc_Exception( 'Le token est un clef MD5 de 32 caracteres !' ); } $this->token = $token; $this->wiki_account = $wiki_account; } /**
  • Lit la file des SMS entrants et retourne le dernier non lu
  • @returns array
  • /
public function getIncommingSMS() { $event = $this->RunAsXml( '/red-ws/red-b2c/resources/event/consume', array( 'responseType' => 'xml', 'token' => $this->token ) ); if ($event->redEvent->eventCode == 11) { return array( 'sender' => $event->redEvent->eventSource, 'message' => $event->redEvent->eventMessage ); } else return null; } /**
  • Géolocalise la ligne émetrice
  • la première fois il faut qu'elle confirme qu'elle accepte d'être géolocalisée par WikiLoc
  • si elle confirme la localization peut être réalisée
  • /
public function Localize($phoneNumber) { $event = $this->RunAsXml( '/red-ws/red-b2c/resources/loc/localize', array( 'responseType' => 'xml', 'token' => $this->token, 'userIdentifier' => $phoneNumber, 'type' => 'PhoneNumber' ) ); if($event->errorCode==0) { return array( 'longitude' => $event->location->longitude, 'latitude' => $event->location->latitude ); } else return null; } /**
  • Envoie un SMS
  • /
public function Send($phoneNumber, $message) { $event = $this->RunAsXml( '/red-ws/red-b2c/resources/sms/send', array( 'responseType' => 'xml', 'token' => $this->token, 'to' => $phoneNumber, 'type' => 'PhoneNumber', 'msg' => $message ) ); return true; } /**
  • Cherche l'url de l'article wiki le plus proche
  • selon la longitude et latitude indiquées
  • /
public function FindNearestWikiUrl($longitude, $latitude) { $ws = new WikiLoc_WS('api.geonames.org'); $event = $ws->RunAsXml( '/findNearbyWikipedia', array( 'lat' => $latitude, 'lng' => $longitude, 'username' => $this->wiki_account, 'style' => 'full' ) ); if (isset($event->entry)) { $max = 0; foreach($event->entry as $id => $entry) { if ($event->entry[$max]->rank < $entry->rank) { $max = $id; } } return $event->entry[$max]->wikipediaUrl; } else return null; } /**
  • affecte un numéro court à l'expéditeur qui
  • pourra être utilisé pour éviter l'usage du 6010
  • avec l'alias #wikiloc#
  • /
public function generateSmsShortCode($phoneNumber) { $event = $this->RunAsXml( '/red-ws/red-b2c/resources/shortcode/generateSmsShortcod', array( 'responseType' => 'xml', 'token' => $this->token, 'msisdn' => $phoneNumber ) ); return ($event->errorCode==0); } } /**
  • TOKEN généré à titre de demonstration par SFR
  • /
$service = new WikiLoc( '81e3d203dd52a852fa986624c718929c', 'sfrapi' ); $sms = $service->getIncommingSMS(); if ($sms) { switch(strtolower($sms['message'])) { case 'wiki': $position = $service->Localize($sms['sender']); if ($position) { $url = $service->FindNearestWikiUrl( $position['longitude'], $position['latitude'] ); if ($url) { $service->Send( $sms['sender'], $url ); } } break; case 'short': if ($service->generateSmsShortCode($sms['sender'])) { $service->Send( $sms['sender'], 'utilisez ce numero pour interroger wikiloc en repondant wiki' ); } break; } }

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.