2012-07-12 10 views
8

L'esempio PHP di Microsoft per la nuova API Bing non funziona. Ho provato in molti modi, mostra solo:Il nuovo esempio PHP Bing API non funziona

Server Error
401 - Unauthorized: Accesso negato a causa di credenziali non valide.
Non si dispone dell'autorizzazione per visualizzare questa directory o pagina utilizzando le credenziali fornite.

Esempio di codificazione indicato nella documentazione ufficiale è al di sotto, si rompe a

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

Sono sicuro al 100% la mia chiave è corretta, e quando ho appena entro nel URL del browser funziona benissimo , vale a dire

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

(è necessario mettere la chiave API come password e nome utente può essere qualsiasi cosa)

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

Ho provato entrambe le API di google e le API di Yahoo entrambe, nessuna di queste era difficile come questa.

+0

Non essere così pronti a dare la colpa di MS. Ci sono * molte * persone che usano l'API, se fossero intrinsecamente rotte sono sicuro che * qualcuno * lo avrebbe notato ormai. – JJJ

+1

Stai eseguendo un proxy locale che richiede l'autenticazione? La tua chiave API BING non significherà assolutamente nulla per un proxy locale. –

+0

non so quante persone hanno questo problema, tuttavia, codice di esempio fornito in google, yahoo api è molto più pulito e funziona perfettamente .. potrebbe essere intenzionalmente non volere sviluppatori PHP per usarlo .. comunque .. – mahen3d

risposta

9

dopo giorni di discussione con supporto techinchal Microsoft hanno accpeted che non ha funzionato

ecco la codifica corretta che utilizza ARRICCIATURA fare questo in API BING, applicare il metodo ARRICCIATURA invece dei file_get_contents che non possono passare le informazioni di autenticazione corrette dal client Linux al servizio BING.

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

Questo fa parte del prob

Questa abitudine dare l'bing url è alla ricerca di

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

sarebbe

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

, mentre si vuole un web non un ricerca di immagini e anche il formato e altri parametri shld essere dopo la query

"image" deve essere "web"

Ho appena trascorso 3 giorni cercando di farlo funzionare.

+0

questa non è la soluzione in realtà quello che sto dicendo è l'impostazione dell'URL come https: //api.datamarket. azure.com/Bing/SearchWeb/Web?Query=%27love+message%27 funzionerà e impostando l'altro URL immagine ... ecc. tutto corretto ma questo ancora anche l'evento di supporto tecnico Microsoft non riesce a capire che l'invio della parte dell'intestazione non è funzionante – mahen3d

+0

Qual è il codice completo per eseguire una ricerca di immagini?/* Sto riscontrando questo problema in questo momento, e ho bisogno di questa soluzione, molto tempo, e non riesco a trovarlo altrove * / –

3

ho dovuto aggiungere

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

al fine di farlo funzionare, almeno nella mia copia locale (WAMP).

Spero che sia d'aiuto, ho continuato a fare tutto questo giorno.