it-swarm.com.de

Bing-Such-API und Azure

Ich versuche, programmgesteuert eine Suche in der Microsoft Bing-Suchmaschine durchzuführen.

Hier ist mein Verständnis:

  • Es gab eine Bing Search API 2.0, die bald ersetzt wird (1. Aug 2012).
  • Die neue API heißt Windows Azure Marketplace.
  • Sie verwenden unterschiedliche URLs für beide.

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.

27
Gapton

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):

Verwendung von file_get_contents

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>");
}

CURL verwenden

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.

37
John C

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>';
  }



}

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

6
Jim

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>";
5

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()
4
Ritesh

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);
3
Kailash Yadav

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/Weboder 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.

1
Websirnik