API de recherche Bing et Azure

J'essaie d'effectuer une recherche par programme 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 est connue sous le nom de 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, et cette clé sera utilisée pour authentifier la requête. Comme tant que vous avez la clé comme paramètre dans L'URL, vous pouvez obtenir les résultats.

Dans la nouvelle API (Windows Azure Marketplace) , Vous n'incluez pas la clé (clé de compte) dans L'URL. Au lieu de cela, vous mettez 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 a / C nom et mot de passe. L'Instruction consistait à laisser le nom du compte vide et à insérer votre clé dans le champ Mot de passe.

OK, j'ai tout fait cela et je peux voir un résultat au format JSON de ma recherche sur ma page de navigateur.

Comment puis-je faire cela par programme en PHP? J'ai essayé de chercher la documentation et l'exemple de code de la bibliothèque Microsoft MSDN, mais je cherchais soit au mauvais endroit, soit il y a des ressources extrêmement limitées.

Quelqu'un pourrait-il me dire comment faites-vous la partie "entrez la clé dans le champ Mot de passe dans la fenêtre contextuelle" en PHP s'il vous plait?

Merci beaucoup d'avance.

27
demandé sur pnuts 2012-06-01 08:36:55

7 réponses

La Documentation pour les nouveaux services peut devenir un peu intéressante-en particulier dans le rabbit-warren de MSDN. L'explication la plus claire que je puisse trouver est sur le Guide de Migration de cette page Bing Search API. Le meilleur de tous le guide de migration a un bel exemple simple en PHP vers la fin.

EDIT: D'accord, 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 (pas de proxy, pare-feu etc. interférer):

En utilisant file_get_contents

Remarque: 'allow_url_fopen " doit être activé pour que cela fonctionne. Vous pouvez utiliser ini_set (ou changer php.ini etc.) si elle 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>");
}

En utilisant 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] changé SearchWeb à la recherche.

37
répondu John C 2016-02-15 15:05:26

Rien de ce qui précède n'a fonctionné pour moi. Im 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>';
  }



}

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

6
répondu Jim 2012-10-30 16:37:39

Vous pouvez utiliser le code ci-dessous pour obtenir les 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
répondu kishore chowdary 2014-08-28 05:39:30

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

Il contient du code python pour interroger 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 __name__ == "__main__":
    main()
4
répondu Ritesh 2014-04-14 10:14:28

N'oubliez pas de mettre ceci:

base64_encode("ignored:".$accountKey)

Au Lieu de:

base64_encode($accountKey . ":" . $accountKey)
3
répondu Andrès Mauricio Peña Carmona 2012-07-27 16:16:57

Voici un exemple de travail de L'API de recherche il suffit de remplacer "XXXX" par votre clé d'accès. Même j'ai perdu quelques heures à essayer de le faire fonctionner en utilisant cURL mais 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
répondu Kailash Yadav 2014-08-26 01:14:03

Voici l'exemple d'appel de 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 Source paramètre par définition 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 requête sont sensibles à la casse. Pour Bing, ils commencent par une lettre majuscule.

1
répondu Websirnik 2013-11-20 12:35:23