API Bing en PHP
Date de publication : Octobre 2009
Par
Ernaelsten Gérard (Ernaelsten Gérard)
Bing est le nom commercial du nouveau moteur de recherche lancé par Microsoft en mai 2009, ayant pour objectif de concurrencer le monopole de Google dans ce domaine.
Le fonctionnement de BING, selon ses spécifications, repose sur le principe de l'affinage. C'est-à-dire qu'il va faire des propositions à l'internaute pour affiner sa recherche et lui donner des résultats très pertinents.
(1)
Nous allons voir comment utiliser l'API mis à la disposition par Microsoft dans un Projet Zend Framework.
1. Pré-requis
Obtenir une clé
Récupérer la classe PHP
2. Utiliser la classe Bing_API
3. Première recherche
Afficher le résultat
4. Intégrer Bing_API dans un projet Zend Framework
Conclusion
remerciement
1. Pré-requis
Pour pouvoir utiliser cette API, vous devez avoir les pré-requis suivants :
- PHP 5
- Curl
- Obtenir une clé d'utilisation
- Télécharger la classe PHP pour utiliser l'API
Pour l'installation de PHP 5 et de Curl, je vous fais confiance et vous laisse vous dépatouiller avec votre Os préféré :)
Obtenir une clé
Pour obtenir une clé d'utilisation de l'API Bing, rendez-vous à l'adresse suivante :
http://www.bing.com/developers/
Inscrivez-vous et récupérez un ID d'authentification.
 |
Attention, le fait de signer le contrat vous oblige à suivre certaines prérogatives et notamment :
|
 |
We may also include advertising in Bing results provided through the services and, if we do so, you will not remove, modify, or interfere with the display or viewing of this advertising. On any page in which you display Bing results, you will only display advertising that we serve or provide.
|
Que l'on pourrait traduire par :
Nous pouvons aussi inclure de la publicité fournie par le service ,si nous le faisons , vous ne la supprimerez pas, ni ne modifierez ou n'interférerez sur l'affichage de celle-ci. Sur toutes les pages sur lesquelles vous affichez des résultats provenant de Bing ,vous n'afficherez que de la publicité que nous hébergeons ou fournissons.
Récupérer la classe PHP
2. Utiliser la classe Bing_API
Pour utiliser la classe Bing_API, il suffit de l'inclure
Tout est en place pour commencer à travailler !
3. Première recherche
Nous allons donc lancer notre première recherche dans le moteur Bing.
Pour ce faire , il nous faut instancier la classe Bing_Api().
Dans l'action index du controller index.
$search = new Bing_API('6490386F84B3B');
|
Cette méthode prend en paramètre l'id que vous aurez au préalable obtenu chez Microsoft (voir lien plus haut).
Dans mon cas, j'ai dû initialiser un passage par proxy.
Cela se fait via la méthode setCurlArray, où il faut passer un tableau avec les paramètres de connexion au proxy.
$proxy = array(
CURLOPT_HTTPPROXYTUNNEL=>1,
CURLOPT_PROXY=>'adresseIp:8080',
CURLOPT_PROXYUSERPWD=>'nom:passwd');
$search->setCurlArray($proxy);
|
Ensuite, nous effectuons la recherche suivant un mot clé , pour ce faire, il faut passer une string dans la méthode query().
Pour mettre plusieurs mots clés, il faut ajouter le signe "+"
$search->query(urlencode('gimp+developpez.com'));
|
Nous lui passons le type de source que nous désirons parmi les sources suivantes:
- Web
- Image
- InstantAnswer
- Phonebook
- RelatedSearch
- Spelling
$search->setSources('Web');
|
Par contre, ici nous pouvons combiner les sources :
$search->setSources('Web+Images');
|
Nous choisissons sous quelle forme, nous allons recevoir le résultat. Nous avons le choix avec la classe ici présente entre le xml ou json. Soap est également une possibilité de l'API Bing, mais pas la classe que je vous fais découvrir.
Je fais le choix de json.
$search->setFormat('json');
|
Nous pouvons également passer quelques paramètres tels que :
- Le nombre de résultats voulus
- A partir de quelles lignes on affiche
- Le degré de recherche par rapport aux pages à contenu adulte
- ...
$search->setOptions(
array(
'Web.Count' => '25',
'Web.Offset' => '2',
'Adult' => 'Moderate',
)
);
|
Si vous rencontrez des soucis avec l'UTF8, vous pouvez rajouter les paramètres suivants :
'Options' => 'EnableHighlighting'
|
Et pour terminer, nous récupérons le résultat.
$code = $search->getResults();
|
Comme nous avons choisi le format 'json', il faut le décoder grâce à la fonction json_decode().
$json = Json_decode($code);
|
L'ensemble donne ceci:
$search = new Bing_API('6490386F.........................');
$proxy = array(
CURLOPT_HTTPPROXYTUNNEL=>1,
CURLOPT_PROXY=>'IP:8080',
CURLOPT_PROXYUSERPWD=>'NOM:PASSWD');
$search->setCurlArray($proxy);
$search->query('developpez');
$search->setSources('Web+Image');
$search->setFormat('json');
$search->setOptions(
array(
'Web.Count' => '2',
'Web.Offset' => '0',
'Adult' => 'Moderate',
'Options' => 'EnableHighlighting'
));
$code = $search->getResults();
$json = Zend_Json::decode($code);
$this->view->json = $json;
|
Afficher le résultat
Nous passons la fonction Var_Dump(), sur le résultat $json, nous obtenons ceci :
Array
(
[SearchResponse] => Array
(
[Version] => 2.2
[Query] => Array
(
[SearchTerms] => developpez
)
[Web] => Array
(
[Total] => 972000
[Offset] => 0
[Results] => Array
(
[0] => Array
(
[Title] => Développez
[Description] => Propose l'actualité des langages, des liens utiles et un forum de discussion.
[Url] => http://www.developpez.com/
[CacheUrl] => http://cc.bingj.com/cache.aspx?q=developpez&d=76395168664323&w=690eae20,1bef34e5
[DisplayUrl] => www.developpez.com
[DateTime] => 2009-07-16T20:35:47Z
)
[1] => Array
(
[Title] => Les news du Club des Développeurs - Club des décideurs et ...
[Description] => News du club des développeurs. Developpez.com, Club informatique gratuit
[Url] => http://blog.developpez.com/club/
[CacheUrl] => http://cc.bingj.com/cache.aspx?q=developpez&d=76373332660966&w=1f874674,2415529c
[DisplayUrl] => blog.developpez.com/club
[DateTime] => 2009-07-11T08:10:06Z
)
)
)
)
)
|
Le résultat est assez parlant, pour l'afficher une simple boucle fera l'affaire.
<?php foreach ($json['SearchResponse']['Web']['Results'] AS $valeur): ?>
<ul>
<li><?php echo $valeur['Title'] ?></li>
<li><?php echo $valeur['Description'] ?></li>
<li><?php echo $valeur['Url'] ?></li>
<li><?php echo $valeur['CacheUrl'] ?></li>
<li><?php echo $valeur['DisplayUrl'] ?></li>
<li><?php echo $valeur['DateTime'] ?></li>
</ul>
<?php endforeach; ?>
|
Pour afficher les images, la méthode est sensiblement la même, le tout est de savoir si on combine les modes de recherches
$search->setSources('Web+Image');
$search->setSources('Image');
|
Quel que soit le choix, nous aurons un tableau nommé 'Image'
var_dump($this->json['SearchResponse']['Image']['Results']))
|
array
0 =>
array
'Title' => string 'Developpez - Programming forums (in French)' (length=43)
'MediaUrl' => string 'http://rankings.big-boards.com/caps/1745.jpg' (length=44)
'Url' => string 'http://rankings.big-boards.com/highlight/1745/' (length=46)
'DisplayUrl' => string 'http://rankings.big-boards.com/highlight/1745/' (length=46)
'Width' => int 270
'Height' => int 173
'FileSize' => int 8145
'ContentType' => string 'image/jpeg' (length=10)
'Thumbnail' =>
array
'Url' => string 'http://ts4.images.live.com/images/thumbnail.aspx?q=1006798314123&id=5772645d8bba9404a64c6bfa5130fcb9' (length=100)
'ContentType' => string 'image/jpeg' (length=10)
'Width' => int 160
'Height' => int 102
'FileSize' => int 3790
1 =>
array
'Title' => string 'Developpez.com' (length=14)
'MediaUrl' => string 'http://xgql.free.fr/articles/devcom.gif' (length=39)
'Url' => string 'http://xgql.free.fr/?cat=4' (length=26)
'DisplayUrl' => string 'http://xgql.free.fr/?cat=4' (length=26)
'Width' => int 248
'Height' => int 108
'FileSize' => int 9484
'ContentType' => string 'image/gif' (length=9)
'Thumbnail' =>
array
'Url' => string 'http://ts2.images.live.com/images/thumbnail.aspx?q=864555303065&id=545dfa03e44abefeb549b51f0c565e71' (length=99)
'ContentType' => string 'image/jpeg' (length=10)
'Width' => int 160
'Height' => int 69
'FileSize' => int 2741
|
4. Intégrer Bing_API dans un projet Zend Framework
Il existe plusieurs façons de concevoir une classe s'intégrant dans un projet ZF, en voici une proposée par Yogui et qui s'intégrera dans la plupart des projets.
Nous allons créer une classe Http_Client_Bing();
<?php
require_once 'Zend/Http/Client/Adapter/Interface.php';
require_once 'Zend/Uri/Http.php';
require_once 'Zend/Service/Abstract.php';
require_once 'BingAPI.php';
class My_Http_Client_Bing implements Zend_Http_Client_Adapter_Interface
{
protected $_service;
static protected $key = 'clef';
public function __construct($key)
{
self::key = $key;
$this->_service = new BingAPI(self::$key);
}
public function close() {}
public function connect($host, $port=80, $secure=FALSE)
{
throw new Exception("Ce service ne permet pas de se connecter à d'autres serveurs");
}
public function read()
{
switch(preg_replace('~([a-z]+).*~', '\\1', $this->_service->_format))
{
case 'xml':
header('Content-Type: text/xml; charset=utf-8');
header('Content-Type: text/xml; charset=utf-8');
break;
case 'json':
header('Content-Type: text/json; charset=utf-8');
break;
}
echo $this->_service->getResults();
}
public function setConfig($config=array())
{
$this->_service->setOptions($config);
}
public function write($method, $url, $http_ver='1.1', $headers=array(), $body='')
{
throw new Exception("Ce service ne permet pas d'envoyer d'informations");
}
public function query($string)
{
return $this->_service->query(urlencode($string));
}
public function __call($name, $params=NULL)
{
return $this->_service->$name($params);
}
}
$search = new My_Http_Client_Bing('9F84EBBA44C');
$search->query('cours tutoriel faq php')
->setSources('Web')
->setFormat('xml')
->setOptions(
array(
'Web.Count' => '10',
'Web.Offset' => '0',
'Adult' => 'Moderate',
'Options' => 'EnableHighlighting'));
echo $search->read();
|
Nous pourrions également créer une classe, tout en se passant de la classe Bing_API, mais cela sort du cadre de cet article.
Conclusion
Microsoft nous offrent pour le moment plusieurs API en PHP vers ses produits, il faut s'en réjouir, même si certaines containtes ne sont pas forcement gérable (le cas de la publicité par exemple).
Nous voilà donc avec un outil , qu'on aime ou pas, mais qui nous permet en tout cas d'interfacer en PHP.
remerciement
Je tiens à remercier Ridekick pour sa traduction du contrat de Microsoft.
Je remercie également evarisnea pour le temps passé à me corriger les 'fôtes' d'orthographe ;)
Sans oublier Yogui et aityahia pour le suivi et le coup de main XML .
| (1) | http://www.trackbusters.fr/definition-bing.html |
| (2) | http://routecafe.com/ |
| (3) | http://www.codeplex.com/ |


Copyright © 2009 Gérard Ernaelsten. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc.
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 €
de dommages et intérêts.
Cette page est déposée.