begin process at 2012 05 27 22:19:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > CLASSE WIKILOC

CLASSE WIKILOC


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Classé sous :SFRAPI, WIKI, PHP5 Niveau :Débutant Date de création :02/03/2011 Vu :2 096

Auteur : aKheNathOn

Ecrire un message privé
Site perso
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Ceci est une source ré-écrite à partir de la source se trouvant à cette url :
http://www.phpcs.com/codes/WIKILOC-ARTICLE-WIKIP EDIA-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

  • <?php
  • /**
  • * Ré-écriture du code source proposé par HHoareau
  • * @see http://www.phpcs.com/codes/WIKILOC-ARTICLE-WIKIPEDIA-SUR-VOTRE-MOBILE-SFR-PLUS_52839.aspx
  • * @author Akhenathon
  • * @license GNU/LGPL
  • */
  • /**
  • * 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;
  • /**
  • * Contexte d'exection par défaut
  • * NB : On peut indiquer ici le proxy ou autre ...
  • * @see http://php.net/manual/fr/function.stream-context-create.php
  • */
  • 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;
  • }
  • /**
  • * Execute l'appel et interpréte le retour en tant que XML
  • * @see WikiLoc_WS::Run
  • * @see http://fr2.php.net/manual/fr/function.simplexml-load-string.php
  • * @return mixed SimpleXMLElement
  • */
  • 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
  • {
  • /**
  • * Le token généré par SFR
  • * @see http://api.sfr.fr
  • */
  • 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;
  • }
  • }
<?php

	/**
	 * Ré-écriture du code source proposé par HHoareau
	 * @see http://www.phpcs.com/codes/WIKILOC-ARTICLE-WIKIPEDIA-SUR-VOTRE-MOBILE-SFR-PLUS_52839.aspx
	 * @author Akhenathon
	 * @license GNU/LGPL	 
	 */	 	 	 	

	/**
	 * 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; 

		/**
		 * Contexte d'exection par défaut
		 * NB : On peut indiquer ici le proxy ou autre ...
		 * @see http://php.net/manual/fr/function.stream-context-create.php	 		 
		 */		 		
		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;			
		}	
		
		/**
		 * Execute l'appel et interpréte le retour en tant que XML
		 * @see WikiLoc_WS::Run
		 * @see http://fr2.php.net/manual/fr/function.simplexml-load-string.php		 
		 * @return mixed SimpleXMLElement 		 		 
		 */		 		
		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		
	{
		/**
		 * Le token généré par SFR 
		 * @see http://api.sfr.fr 		 
		 */		 		
		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;
		}	
	}



 Sources du même auteur

Source avec Zip OBSERVER PATTERN ORIENTÉ DÉVELOPPEMENT ÉVÉNEMENTIEL DÉCLARAT...
Source avec Zip SERVICE DESIGN PATTERN / CHARGEMENT DYNAMIQUE DE SERVICES D'...
Source avec Zip Source avec une capture WHOIS DOMAIN CLASS : LOOKUP & AVAIBILITY
Source avec Zip Source avec une capture XML MAPPING TO CLASS OBJECTS / CHARGEMENT / PARSING / MODIFI...
Source avec Zip SQLDIFF : MIGRATION, VERSIONNING ET SYNCHRONISATION DE LA ST...

 Sources de la même categorie

INSPECTEUR DE PAGES (VÉRIFIEZ SI DES SITES AFFICHENT UN TEXT... par pablo836
Source avec Zip Source avec une capture GÉOLOCALISATION par pgl10
Source avec Zip TAPI : METTRE EN RELATION DEUX POSTES TELEPHONIQUES par ravery
Source avec Zip CLIENT / SERVEUR : LES SOCKETS par Morphinof
Source avec Zip VALIDATEUR_3WC par lezj

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MY.BOOKMARKS par inwebo
Source avec Zip M.V.C M.E.D par faceme
Source avec Zip Source avec une capture TODO LIST (AJAX/PHP5) par VinceMonkeyz
CALENDRIER EN 70 LIGNES par tchconst
Source avec Zip Source avec une capture GÉNÉRATION DE FORMULAIRES HTML PERSONNALISÉS. par beejeridou

Commentaires et avis

Commentaire de hhoareau le 02/03/2011 14:25:20 9/10

Merci aKheNathOn pour la réécriture d'une version plus propre de mon exemple d'usage des API SFR. Je rappelle aux personnes intéressées qu'il est souhaitable d'obtenir sur le site SFR API votre propre token.

Commentaire de zave le 04/03/2011 12:53:27

Etant chez SFR, je suis concerné, j'ai lu vite fait mais ça me semble intéressant je vais regarder cette source de plus près ainsi que celle à l'origine de cette source.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

differnec entre php 4 et php5 [ par hardelgylls ] Bonjourpetite question :j'ai passer un oral et l'examinateur m'a demandé quel était la différence entre php4 et php5. et la gros blanc, est ce que qqu Doc PHP5 sniff sniff [ par slhuilli ] Bonjour, Bonsoir,Je suis a la recherche d'un PDF qui recenserait les mots-clefs + explications (bref un bouquin complet) sur PHP 5 qui parait-il est Pb passage PHP4 -> PHP5 [ par Galmiza ] Salut,J'ai acheté un bouquin pour débuter le PHP.J'ai suivi a la lettre les instructions du livre:-installer EasyPHP 1.7-installer PHP 5.0..-lancer Ea Cohabitation PHP4 PHP5 sur même serveur ! [ par Zacland ] Ce n'est pas une question, mais je me doute que certaines personnes veulent essayer de faire cohabiter 2 versions de PHP sur un même serveur Apache... Un caractére se trouve t'il dans ma chaîne... [ par juki_webmaster ] Bonsoir,Je travaille depuis 14h cette apres-midi sur une fonction alternative d'une fonction connu et disponible uniquement sur php5, je fait cette fo PHP5 en PHP3 [ par el shaddai ] J'ai développé une partie de site en PHP5. MAlheureusement , chargé chez FREE, ils n'utilisent que PHP3. Y a t-il une manip simple pour qur du PHP5 pa PHP5 et MySQL 4.1.7 [ par TMT ] J'ai installé PHP5 et MySQL sur mon Windows XP avec IIS. J'ai bien activé le module php_mysql dans le fichier php.ini Là mon problème est qu-à chaque php4 vers php5 [ par aurelielaugraud ] Bonjour, Je suis passée de php4 à php5 pour utiliser la librairie graphique GD. Seulement, un programme que j'avais précédemment faire refuse de fonct Modification d'un script pour conformité avec php4 et/ou php5 [ par christobal ] Bonjour, depuis plusieurs ann&#233;es j'utilise le m&#234;me script pour mes sites.Maitenant avec les derrnieres version de PHP4 et PHP5 ce script ne Connection mysql avec php5 [ par Chess0 ] Bonjour, j'ai install&#233; r&#233;cemment la derni&#232;re version de mysql ainsi que la derni&#232;re version de php (5). J'ai essay&#233; la connec


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales