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.
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.
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>';
}
}
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>";
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()
N'oubliez pas de mettre ceci:
base64_encode("ignored:".$accountKey)
Au Lieu de:
base64_encode($accountKey . ":" . $accountKey)
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);
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/Web
ou 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.