J'essaie de procéder par programme à une recherche sur le moteur de recherche Microsoft Bing.
Voici ma compréhension:
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.
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):
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>");
}
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.
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>';
}
}
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>";
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()
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);
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/Web
ou 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.