2012-08-16 13 views
5

Recientemente recibí un correo electrónico de Microsoft que decía que Bing API se estaba moviendo al Mercado de Windows Azure. Parecía que la principal diferencia entre la nueva solicitud era la autenticación.Autorización de API de Bing no funciona

Después de leer muchos mensajes en los foros, encontré esto:

$accountKey = '#########'; 
$api = 'https://api.datamarket.azure.com/Bing/Search/Web?$format=json&$top=8&Query='; 
$context = stream_context_create(array(
    'http' => array(
     'request_fulluri' => true, 
     'header' => "Authorization: Basic " . base64_encode($accountKey . ":" . $accountKey) 
    ) 
)); 
$request = $api.'%27'.$q.'%27&$skip='.$start; 
$result = file_get_contents($request, 0, $context); 

Sin embargo, todavía consigo el error "El tipo de autorización que ha proporcionado no es compatible Sólo Básica y OAuth son compatibles.".

¿Alguien sabe cómo puedo solucionar esto. También probé cURL y eso no funciona. Gracias a todos los que puedan encontrarme una solución.

+0

Did que urlencode la variable $ q –

+0

Microsoft no fue capaz de dar una idea de – Matt

+0

@Sandrino Di Mattia me trató urlencode pero eso no ha ayudado. Obtuve el código anterior de la Guía de migración de Microsoft: www.bing.com/webmaster/content/developers/ADM_MIGRATION_GUIDE.docx Encontré el mismo código en otra publicación en StackOverflow, pero ambos parecen dar el mismo error –

Respuesta

3

Creo que las URL han cambiado. Este código funciona Tenga en cuenta la URL en la primera línea:

$api = 'https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Web?$format=json&$top=8&Query='; 
$context = stream_context_create(array(
    'http' => array(
     'request_fulluri' => true, 
     'header' => "Authorization: Basic " . base64_encode($accountKey . ":" . $accountKey) 
    ) 
)); 
$q = 'test'; 
$request = $api.'%27'.$q.'%27'; 

echo file_get_contents($request, 0, $context); 
+0

Lamentablemente, ese código tampoco funciona, sigue dando el mismo error. Me pregunto si podría ser algo relacionado con mi servidor, pero no lo creo. –

+0

Interesante. Tal vez hay un proxy que de alguna manera está interfiriendo? Aparte de una línea '$ accountKey = ...' faltante en la parte superior, ese código es literalmente lo que acabo de ejecutar con éxito. – smarx

+0

¿Es posible que su clave de cuenta esté equivocada? Verifíquelo en https://datamarket.azure.com/account/keys? – smarx

-1

Tuve el mismo problema que ocurrió cuando implementé un sitio web en un nuevo servidor. Creo que mi empresa de alojamiento ha desactivado algunas funciones con file_get_contents a enlaces externos.

$url = 'https://api.datamarket.azure.com/Data.ashx/Bing/MicrosoftTranslator/v1/Translate?Text=%27'.urlencode($text).'%27&To=%27' . $to . '%27&From=%27' . $from . '%27&$top=100&$format=json'; 

    $accountKey = 'APIKEY'; 
    $handle = curl_init ($url); 
    if ($handle) { 
     $curlOptArr = array(
      CURLOPT_HTTPAUTH => CURLAUTH_BASIC, 
      CURLOPT_USERPWD => $accountKey . ':' . $accountKey, 
      CURLOPT_RETURNTRANSFER => TRUE 

     ); 
     curl_setopt_array($handle, $curlOptArr); 
     $response = curl_exec($handle); 
     $data = json_decode($response,true); 
     if (is_array($data)) { 
      if (isset($data['d']['results'][0]['Text'])) { 
       print $data['d']['results'][0]['Text']; 
      } else { 
       print false; 
      } 
     } else { 
      print $text; 
     } 
     $errRet = curl_error($handle); 
     curl_close($handle); 
    } 

Esta me funciona cuando uso cURL.

2

Este es un ejemplo de la API de búsqueda simplemente reemplace su clave de acceso con "XXXX". Incluso me tirado unas cuantas horas para que funcione usando cURL pero estaba fallando causa de "CURLOPT_SSL_VERIFYPEER" en locales :(

$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, "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); 
+1

He podido solucionar este problema gracias a tu código CURL. Gracias. – woodgate

+1

Este stills funciona. Puede confirmarlo –

Cuestiones relacionadas