2012-07-12 9 views
8

Microsofts eigenes PHP-Beispiel für neue Bing-API funktioniert nicht. Ich habe versucht, in vielerlei Hinsicht, es zeigt nur:New Bing API PHP-Beispiel funktioniert nicht

Server Error
401 - nicht autorisiert: Zugriff aufgrund ungültiger Anmeldeinformationen verweigert.
Sie sind nicht berechtigt, dieses Verzeichnis oder diese Seite mithilfe der von Ihnen angegebenen Anmeldeinformationen anzuzeigen.

Beispiel in der offiziellen Dokumentation gegeben Codierung ist unten, bricht es bei

'proxy' => 'tcp://127.0.0.1:8888', 

up Ich bin 100% sicher, dass mein Schlüssel korrekt ist, und wenn ich URL im Browser eingeben es nur funktioniert es gut , dh

https://api.datamarket.azure.com/Bing/SearchWeb/Web?Query=%27love+message%27 

(Sie müssen die API-Schlüssel als Passwort und Benutzernamen setzen kann alles sein)

<html> 
    <head> 
     <link href="styles.css" rel="stylesheet" type="text/css" /> 
     <title>PHP Bing</title> 
    </head> 
    <body> 
     <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> 
      Type in a search: 

      <input type="text" id="searchText" name="searchText" 
       value="<?php 
         if (isset($_POST['searchText'])) 

            { 
          echo($_POST['searchText']); 
         } 
         else 
         { 
          echo('sushi'); 
         } 
         ?>" 
      /> 

      <input type="submit" value="Search!" name="submit" id="searchButton" /> 
      <?php 
       if (isset($_POST['submit'])) 
       { 
        // Replace this value with your account key 
        $accountKey = 'BKqC2hIKr8foem2E1qiRvB5ttBQJK8objH8kZE/WJVs='; 

        $ServiceRootURL = 'https://api.datamarket.azure.com/Bing/Search/'; 

        $WebSearchURL = $ServiceRootURL . 'Image?$format=json&Query='; 

        $context = stream_context_create(array(
         'http' => array(
          //'proxy' => 'tcp://127.0.0.1:8888', 
          'request_fulluri' => true, 
          'header' => "Authorization: Basic " . base64_encode($accountKey . ":" . $accountKey) 
         ) 
        )); 

        $request = $WebSearchURL . urlencode('\'' . $_POST["searchText"] . '\''); 

        echo($request); 

        $response = file_get_contents($request, 0, $context); 

        print_r($response); 

        $jsonobj = json_decode($response); 

        echo('<ul ID="resultList">'); 

        foreach($jsonobj->d->results as $value) 
        { 
         echo('<li class="resultlistitem"><a href="' . $value->MediaURL . '">'); 

         echo('<img src="' . $value->Thumbnail->MediaUrl. '"></li>'); 
        } 

        echo("</ul>"); 
       } 
      ?> 
     </form> 
    </body> 
</html> 

Ich habe beide Google API und Yahoo API beide versucht, keiner von denen war so schwierig wie diese.

+0

Seien Sie nicht so schnell schuld MS. Es gibt * eine Menge * Leute, die die API benutzen, wenn es von Natur aus kaputt wäre, hätte ich * bestimmt * jemanden bemerkt. – JJJ

+1

Führen Sie einen lokalen Proxy aus, der eine Authentifizierung erfordert? Ihr BING api-Schlüssel bedeutet für einen lokalen Proxy absolut nichts. –

+0

Ich weiß nicht, wie viele Menschen dieses Problem hat, aber Beispiel Coding in Google geben, yahoo api sind viel sauberer und funktioniert perfekt .. es kann sein, dass sie absichtlich nicht php Entwickler wollen, um es zu verwenden .. jedenfalls .. – mahen3d

Antwort

9

nach Tagen der Auseinandersetzung mit Unterstützung von Microsoft techinchal sie accpeted, dass es hat nicht

hier ist die richtige Codierung

arbeiten, die CURL dies in der BING API tun verwendet, gelten ROTATION Methode anstelle der file_get_contents, die nicht passieren kann die korrekten Authentifizierungsinformationen vom Linux-Client zum BING-Service.

<html> 
    <head> 
     <title>PHP Bing</title> 
    </head> 
    <body> 
     <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> 
      Type in a search: 

      <input type="text" id="searchText" name="searchText" 
       value="<?php 
         if (isset($_POST['searchText'])) 

            { 
          echo($_POST['searchText']); 
         } 
         else 
         { 
          echo('sushi'); 
         } 
         ?>" 
      /> 

      <input type="submit" value="Search!" name="submit" id="searchButton" /> 
      <?php 


       if (isset($_POST['submit'])) 
       { 

      $credentials = "username:xxx"; 

       $url= "https://api.datamarket.azure.com/Bing/SearchWeb/Web?Query=%27{keyword}%27";   
       $url=str_replace('{keyword}', urlencode($_POST["searchText"]), $url); 
       $ch = curl_init(); 

      $headers = array(
        "Authorization: Basic " . base64_encode($credentials) 
       ); 

       $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $url); 
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
       curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,5); 
       curl_setopt($ch, CURLOPT_FAILONERROR, true); 
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
       curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
       curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

       $rs = curl_exec($ch); 
      echo($rs); 
       curl_close($ch); 
       return $rs; 

     } 

      ?> 
     </form> 
    </body> 
</html> 
2
$WebSearchURL = $ServiceRootURL . 'Image?$format=json&Query='; 

Dieser Teil des prob ist

Dies wird nicht die URL bing geben sucht

e.g. https://api.datamarket.azure.com/Bing/SearchWeb/Web?Query=%27love+message%27 

es

https://api.datamarket.azure.com/Bing/Search/Image?$format=json&Query=%27love+message%27 

sein würde, während Sie einen Web will kein Bildsuche und auch Format und andere Parameter werden nach der Abfrage

sein

"image" sollte "web" sein

Ich habe gerade 3 Tage damit verbracht, dies zur Arbeit zu bringen.

+0

das ist nicht die Lösung tatsächlich, was ich sage, setzt die URL als https: //api.datamarket. azure.com/Bing/SearchWeb/Web?Query=%27love+message%27 wird funktionieren und die andere Bild-URL einstellen ... usw. alles korrekt, aber dieses noch nicht einmal Microsoft technische Unterstützungsereignis kann nicht herausfinden, das Senden des Header-Teils ist nicht funktioniert – mahen3d

+0

Was ist der vollständige Code für eine Bildsuche?/* Ich habe dieses Problem gerade, und ich brauche diese Lösung, große Zeit, und kann es nirgendwo anders finden * / –

3

Ich hatte

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

hinzuzufügen, um es, zumindest in meiner lokalen Kopie (WAMP) arbeiten zu lassen.

Ich hoffe, es hilft, ich habe den ganzen Tag damit zu tun gehabt.