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.

               Version PDF   Version hors-ligne

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.

warning Attention, le fait de signer le contrat vous oblige à suivre certaines prérogatives et notamment :
info 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

Il existe donc une classe PHP, permettant d'interagir avec l'API de Bing.
Cette classe a été écrite par David González(2). David González a mis à disposition cette classe sur la forge CodePlex(3), et nous pouvons la télécharger ici : http://bingapiphp.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28368


2. Utiliser la classe Bing_API

Pour utiliser la classe Bing_API, il suffit de l'inclure

include ('Bing_API.php');
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().

 $search->query(urlencode('gimp'));
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',//nombres de résultats retournés
 
'Web.Offset' => '2',//ordre dans laquelle apparaissent les pages
 
'Adult' => 'Moderate',//les possibilités sont 'Strict' - 'Moderate' - 'Off' f'
            )
        );
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.........................');
 
        //paramètre pour proxie
 
        $proxy = array(
            CURLOPT_HTTPPROXYTUNNEL=>1,
            CURLOPT_PROXY=>'IP:8080',
            CURLOPT_PROXYUSERPWD=>'NOM:PASSWD');
 
        $search->setCurlArray($proxy);
 
        /* To use multiple resources simply do
   ->setSources('Web+Image') ,
   it must match the source type bing.com provides */
        // Build your query easily
        $search->query('developpez');
        $search->setSources('Web+Image');
 
        $search->setFormat('json');
        # Also you can try: xml, soap or 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');
// ou
$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') // xml, soap ou json
        ->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 .



               Version PDF   Version hors-ligne

(1)http://www.trackbusters.fr/definition-bing.html
(2)http://routecafe.com/
(3)http://www.codeplex.com/

Valid XHTML 1.0 TransitionalValid CSS!

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.

 
 
 
 
Partenaires

Hébergement Web