web-dev-qa-db-fra.com

API de recherche Bing et Azure

J'essaie de procéder par programme à une recherche sur le moteur de recherche Microsoft Bing.

Voici ma compréhension:

  • Il y avait une API de recherche Bing 2.0, qui sera bientôt remplacée (1er août 2012)
  • La nouvelle API s'appelle Windows Azure Marketplace.
  • Vous utilisez une URL différente pour les deux.

Dans l'ancienne API (Bing Search API 2.0) , vous spécifiez une clé (ID d'application) dans l'URL. Cette clé sera utilisée pour authentifier la demande. Tant que vous avez la clé en tant que paramètre dans l'URL, vous pouvez obtenir les résultats.

Dans la nouvelle API (Windows Azure Marketplace) , vous n'incluez PAS la clé (Account Key) dans l'URL. Au lieu de cela, vous insérez une URL de requête, puis le serveur vous demandera vos informations d'identification. Lorsque vous utilisez un navigateur, il y aura un pop-up demandant un nom/c et un mot de passe. L’instruction consistait à laisser le nom du compte en blanc et à insérer votre clé dans le champ du mot de passe.

D'accord, j'ai fait tout cela et je peux voir les résultats de ma recherche au format JSON sur la page de mon navigateur.

Comment est-ce que je fais ceci par programme en PHP? J'ai essayé de chercher la documentation et l'exemple de code dans la bibliothèque Microsoft MSDN, mais je cherchais au mauvais endroit ou les ressources sont extrêmement limitées.

Quelqu'un pourrait-il me dire comment faire la partie "Entrez la clé dans le champ du mot de passe dans la fenêtre contextuelle" dans PHP s'il vous plaît?

Merci beaucoup d'avance.

27
Gapton

La documentation de nouveaux services peut devenir un peu intéressante, notamment dans le labyrinthe de MSDN. L'explication la plus claire que je puisse trouver se trouve dans Migration Guide à partir de cette page Bing Search API . Mieux encore, le guide de migration contient un exemple simple et agréable de PHP vers la fin.

EDIT: Bon, le guide de migration est un point de départ, mais ce n’est pas le meilleur exemple. Voici deux méthodes qui fonctionnent pour moi (aucun proxy, aucun pare-feu, etc. n'interférant):

Utiliser file_get_contents

Remarque: ' allow_url_fopen ' doit être activé pour que cela fonctionne. Vous pouvez utiliser ini_set (ou changer le fichier php.ini, etc.) s'il ne l'est pas.

if (isset($_POST['submit'])) 
{

    // Replace this value with your account key
    $accountKey = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';            
    $ServiceRootURL =  'https://api.datamarket.Azure.com/Bing/Search/';                    
    $WebSearchURL = $ServiceRootURL . 'Web?$format=json&Query=';

    $cred = sprintf('Authorization: Basic %s', 
      base64_encode($accountKey . ":" . $accountKey) );

    $context = stream_context_create(array(
        'http' => array(
            'header'  => $cred
        )
    ));

    $request = $WebSearchURL . urlencode( '\'' . $_POST["searchText"] . '\'');

    $response = file_get_contents($request, 0, $context);

    $jsonobj = json_decode($response);

    echo('<ul ID="resultList">');

    foreach($jsonobj->d->results as $value)
    {                        
        echo('<li class="resultlistitem"><a href="' 
                . $value->URL . '">'.$value->Title.'</a>');
    }

    echo("</ul>");
}

Utiliser cURL

Si cURL est installé, ce qui est normal ces jours-ci:

<?php
  $query = $_POST['searchText'];

  $accountKey = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
  $serviceRootURL =  'https://api.datamarket.Azure.com/Bing/Search/';  
  $webSearchURL = $serviceRootURL . 'Web?$format=json&Query=';

  $request = $webSearchURL . "%27" . urlencode( "$query" ) . "%27";

  $process = curl_init($request);
  curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($process, CURLOPT_USERPWD,  "$accountKey:$accountKey");
  curl_setopt($process, CURLOPT_TIMEOUT, 30);
  curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
  $response = curl_exec($process);
  $response = json_decode($response);

  echo "<ol>";
  foreach( $response->d->results as $result ) {
    $url = $result->Url;
    $title = $result->Title;

    echo "<li><a href='$url'>$title</a></li>";
  }
  echo "</ol>";
?>

[WTS] a modifié SearchWeb en Recherche.

37
John C

Aucun de ce qui précède n'a fonctionné pour moi. En cours d'exécution MAMP, cela peut être pertinent. Essayez le ci-dessous:


$accountKey = '=';


function sitesearch ($query, $site, $accountKey, $count=NULL){
  // code from http://go.Microsoft.com/fwlink/?LinkID=248077

    $context = stream_context_create(array(
    'http' => array(
      'request_fulluri' => true,       
      'header'  => "Authorization: Basic " . base64_encode($accountKey . ":" . $accountKey)
    ) 
    )); 

    $ServiceRootURL =  'https://api.datamarket.Azure.com/Data.ashx/Bing/Search/v1/News?Market=%27en-GB%27&';
    $WebSearchURL = $ServiceRootURL . '$format=json&Query=';  

    $request = $WebSearchURL . urlencode("'$query'"); // note the extra single quotes
    if ($count) $request .= "&\$top=$count"; // note the dollar sign before $top--it's not a variable!
    return json_decode(file_get_contents($request, 0, $context), true);
}


$q = "query";

if ($q){
  // get search results
  $articles = sitesearch ($q, $_SERVER['HTTP_Host'], $accountKey , 100);

  foreach($articles['d']['results'] as $article) {
      echo " <p>".$article['Title'].'</p>';
      echo " <p>".$article['Description'].'</p>';
      echo " <p>".$article['Source'].'</p>';
      echo " <p>".strtotime($article['Date']).'</p>';
  }



}

DE: http://bililite.com/blog/2012/06/05/new-bing-api/

6
Jim

vous pouvez utiliser le code ci-dessous pour obtenir des résultats de recherche bing 

$acctKey = 'Your account key here';
$rootUri = 'https://api.datamarket.Azure.com/Bing/Search';
$query = 'Kitchen';
$serviceOp ='Image';
$market ='en-us';
$query = urlencode("'$query'");
$market = urlencode("'$market'");
$requestUri = "$rootUri/$serviceOp?\$format=json&Query=$query&Market=$market";
$auth = base64_encode("$acctKey:$acctKey");
$data = array(  
            'http' => array(
                        'request_fulluri' => true,
                        'ignore_errors' => true,
                        'header' => "Authorization: Basic $auth"
                        )
            );
$context = stream_context_create($data);
$response = file_get_contents($requestUri, 0, $context);
$response=json_decode($response);
echo "<pre>";
print_r($response);
echo "</pre>";
5
kishore chowdary

http://www.guguncube.com/2771/python-using-the-bing-search-api

il contient du code python pour interroger le bing et ceci est conforme à la dernière nouvelle API (Windows Azure Marketplace)

# -*- coding: utf-8 -*-
import urllib
import urllib2
import json

def main():
    query = "sunshine"
    print bing_search(query, 'Web')
    print bing_search(query, 'Image')

def bing_search(query, search_type):
    #search_type: Web, Image, News, Video
    key= 'YOUR_API_KEY'
    query = urllib.quote(query)
    # create credential for authentication
    user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; FDM; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 1.1.4322)'
    credentials = (':%s' % key).encode('base64')[:-1]
    auth = 'Basic %s' % credentials
    url = 'https://api.datamarket.Azure.com/Data.ashx/Bing/Search/'+search_type+'?Query=%27'+query+'%27&$top=5&$format=json'
    request = urllib2.Request(url)
    request.add_header('Authorization', auth)
    request.add_header('User-Agent', user_agent)
    request_opener = urllib2.build_opener()
    response = request_opener.open(request) 
    response_data = response.read()
    json_result = json.loads(response_data)
    result_list = json_result['d']['results']
    print result_list
    return result_list

if __== "__main__":
    main()
4
Ritesh

Voici un exemple de travail de l’API de recherche. Il suffit de remplacer "XXXX" par votre clé d’accès. Même si j'ai passé pas mal de temps à essayer de le faire fonctionner avec cURL, il échouait à cause de "CURLOPT_SSL_VERIFYPEER" sur local :( - alors assurez-vous que vos options de cURL sont définies correctement.

$url = 'https://api.datamarket.Azure.com/Bing/Search/Web?Query=%27xbox%27';
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($process, CURLOPT_USERPWD, base64_encode("username:XXXX"));
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($process);

# Deliver
return $response;

# Have a great day!
curl_close($process);
3
Kailash Yadav

N'oubliez pas de mettre ceci:

base64_encode("ignored:".$accountKey)

au lieu de:

base64_encode($accountKey . ":" . $accountKey)

Voici comment appeler l'API Bing/Azure à l'aide de Bibliothèque Unirest .

require_once '/path/to/unirest-php/lib/Unirest.php';

$accountKey = "xxx";
$searchResults = Unirest::get("https://api.datamarket.Azure.com/Bing/Search/v1/Composite",
    array(),
    array(
        'Query' => '%27Microsoft%27',
        'Sources' => '%27web%2Bimage%2Bvideo%2Bnews%2Bspell%27',
        '$format' => 'json',
    ), $accountKey, $accountKey
);

// Results are here:
$objectArray = $searchResults->body->d->results;
$rawJson = $searchResults->raw_body;

Vous pouvez omettre le paramètre Source en le définissant dans l'URL: https://api.datamarket.Azure.com/Bing/Search/v1/Webou https://api.datamarket.Azure.com/Bing/Search/v1/Image

Remarque: les paramètres de l'URL de la demande sont sensibles à la casse. Pour Bing, ils commencent par une lettre majuscule.

1
Websirnik