2012-07-12 63 views
8

El propio ejemplo PHP de Microsoft para la nueva API Bing no funciona. He intentado de muchas maneras, sólo se muestra:El nuevo ejemplo PHP API Bing no funciona

error de servidor
401 - No autorizado: acceso denegado debido a credenciales no válidas.
No tiene permiso para ver este directorio o la página utilizando las credenciales que ha proporcionado.

Ejemplo codificación en la documentación oficial está por debajo, se rompe en

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

estoy 100% seguro de que mi clave es correcta, y cuando acaba de entrar en la URL del navegador funciona bien , es decir

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

(que necesita para poner la clave de API como su contraseña y nombre de usuario puede ser cualquier 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> 

He intentado tanto la API de Google como la API de Yahoo, ninguno de ellos fue tan difícil como este.

+0

No sea tan rápido para culpar a la EM. Hay * muchas * personas que usan la API, si se rompiera de forma inherente, estoy seguro de que * alguien * ya lo habría notado. – JJJ

+1

¿Está ejecutando un proxy local que requiere autenticación? Su clave api BING va a significar absolutamente nada para un proxy local. –

+0

no sé cuántas personas tienen este problema, sin embargo, la codificación de ejemplo dada en google, yahoo api es mucho más limpia y funciona perfectamente ... puede ser que intencionalmente no quieren php desarrolladores para usarlo .. de todos modos .. – mahen3d

Respuesta

9

después de días de discusión con el apoyo techinchal Microsoft que accpeted que no trabajó

aquí es la correcta codificación que utiliza CURL hacer esto en la API de Bing, aplicar el método CURL en lugar de los file_get_contents que no puede pasar la información de autenticación correcta del cliente de Linux al servicio 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='; 

Esto es parte del prob

Esto suele dar los Bing url está buscando

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

sería

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

mientras que desea una web no es una la búsqueda de imágenes y también el formato y otros parámetros serán después de la consulta

"imagen" debería ser "web"

Acabo de pasar 3 días tratando de hacer que esto funcione.

+0

esto no es la solución en realidad lo que estoy diciendo es establecer la url como https: //api.datamarket. azure.com/Bing/SearchWeb/Web?Query=%27love+message%27 funcionará y establecerá la otra URL de la imagen ... etc. todo correcto, pero esto incluso el evento de soporte técnico de Microsoft no puede entender el envío de la parte del encabezado no es trabajando – mahen3d

+0

¿Cuál es el código completo para hacer una búsqueda de imágenes?/* Tengo este problema en este momento, y necesito esta solución, a lo grande, y no puedo encontrarla en otro lado * / –

3

he tenido que añadir

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

con el fin de hacer que funcione, al menos en mi copia local (WAMP).

Espero que ayude, he estado jugando con esto todo el día.