Ich versuche, programmgesteuert eine Suche in der Microsoft Bing-Suchmaschine durchzuführen.
Hier ist mein Verständnis:
In der alten API (Bing Search API 2.0) geben Sie einen Schlüssel (Anwendungs-ID) in der URL an. Dieser Schlüssel wird zur Authentifizierung der Anforderung verwendet. Solange Sie den Schlüssel als Parameter in der URL haben, können Sie die Ergebnisse abrufen.
In der neuen API (Windows Azure Marketplace) fügen Sie NICHT den Schlüssel (Kontoschlüssel) in die URL ein. Geben Sie stattdessen eine Abfrage-URL ein, und der Server fragt nach Ihren Anmeldeinformationen. Wenn Sie einen Browser verwenden, wird ein Popup angezeigt, in dem Sie nach einem/c-Namen und einem Kennwort fragen. Sie sollten den Kontonamen leer lassen und Ihren Schlüssel in das Kennwortfeld eingeben.
Okay, ich habe das alles gemacht und kann auf meiner Browserseite ein JSON-formatiertes Ergebnis meiner Suche sehen.
Wie mache ich das programmgesteuert in PHP? Ich habe versucht, nach Dokumentation und Beispielcode aus der Microsoft MSDN-Bibliothek zu suchen, aber ich habe entweder an der falschen Stelle gesucht oder es gibt extrem begrenzte Ressourcen.
Kann mir irgendjemand sagen, wie Sie den "Geben Sie den Schlüssel in das Kennwortfeld im Popup-Teil" in PHP eingeben?
Vielen Dank im Voraus.
Die Dokumentation für neue Dienste kann etwas interessant werden - insbesondere im Kaninchenbau von MSDN. Die eindeutigste Erklärung, die ich finden kann, ist auf der Seite Migration Guide von dieser Bing Search API . Das Migrationshandbuch hat am Ende ein schönes einfaches Beispiel in PHP.
BEARBEITEN: Okay, der Migrationsleitfaden ist ein Ausgangspunkt, aber er ist nicht das beste Beispiel. Hier sind zwei Methoden, die für mich funktionieren (keine Proxy, keine Firewalls usw. stören):
Hinweis: ' allow_url_fopen ' muss aktiviert sein, damit dies funktioniert. Sie können ini_set verwenden (oder php.ini usw. ändern), falls dies nicht der Fall ist.
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>");
}
Wenn cURL installiert ist, was heutzutage normal ist:
<?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] hat SearchWeb in Search geändert.
Keines der oben genannten Dinge funktionierte für mich. Wenn Sie MAMP ausführen, kann dies relevant sein. Versuchen Sie das unten:
$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>';
}
}
sie können untenstehenden Code verwenden, um Bing-Suchergebnisse zu erhalten
$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
es enthält Python-Code zum Abfragen des Bing. Dies entspricht der neuesten 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()
Hier ist ein funktionierendes Beispiel für die Such-API. Ersetzen Sie einfach "XXXX" durch Ihren Zugriffsschlüssel. Ich habe sogar einige Stunden damit verschwendet, es mit cURL zum Laufen zu bringen, aber es schlug fehl, weil "CURLOPT_SSL_VERIFYPEER" auf local: (-).
$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);
Vergiss nicht, dies zu sagen:
base64_encode("ignored:".$accountKey)
anstatt:
base64_encode($accountKey . ":" . $accountKey)
Hier ist ein Beispiel für das Aufrufen der Bing/Azure-API mit Unirest library .
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;
Sie können den Parameter Source
weglassen, indem Sie ihn in der URL definieren: https://api.datamarket.Azure.com/Bing/Search/v1/Web
oder https://api.datamarket.Azure.com/Bing/Search/v1/Image
Hinweis: Parameter in der Anforderungs-URL unterscheiden zwischen Groß- und Kleinschreibung. Für Bing beginnen sie mit einem Großbuchstaben.