2012-08-16 16 views
5

Recentemente ho ricevuto un'email da Microsoft che diceva che l'API Bing si stava spostando nel Marketplace di Windows Azure. Sembrava che la principale differenza tra la nuova richiesta fosse l'autenticazione.Autorizzazione API Bing non funzionante

Dopo aver letto molti post sul forum, ho trovato questo:

$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); 

Tuttavia, ho ancora ottenere l'errore "Il tipo di autorizzazione che hai fornito non è supportato sono supportati solo di base e OAuth.".

Qualcuno sa come posso risolvere questo problema. Ho anche provato cURL e questo non funziona. Grazie a chiunque possa trovarmi una soluzione.

+0

Forse si UrlEncode la variabile $ q –

+0

Microsoft è stata in grado di fornire indicazioni – Matt

+0

@Sandrino di Mattia ho provato urlencode, ma che non ha aiutato. Ho ricevuto il codice sopra dalla Microsoft Migration Guide: www.bing.com/webmaster/content/developers/ADM_MIGRATION_GUIDE.docx Ho trovato lo stesso codice su un altro post su StackOverflow ma entrambi sembrano dare lo stesso errore –

risposta

3

Penso che gli URL siano cambiati. Questo codice funziona. Notare l'URL nella prima riga:

$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

Purtroppo anche questo codice non funziona, dando comunque lo stesso errore. Mi chiedo se potrebbe essere qualcosa a che fare con il mio server ma non la penso così. –

+0

Interessante. Forse c'è un proxy che interferisce in qualche modo? A parte la mancanza di una riga '$ accountKey = ...' all'inizio, quel codice è esattamente ciò che ho appena eseguito con successo. – smarx

+0

È possibile che la chiave del tuo account sia sbagliata? Doppio controllo su https://datamarket.azure.com/account/keys? – smarx

-1

Ho avuto lo stesso problema che si è verificato quando ho distribuito un sito Web in un nuovo server. Penso che la mia società di hosting abbia disabilitato alcune funzionalità con file_get_contents verso collegamenti esterni.

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

Questo funziona per me quando si utilizza cURL.

2

Ecco un esempio funzionante dell'API di ricerca, basta sostituire la chiave di accesso con "XXXX". Anche ho sprecato un bel paio di ore per farlo funzionare utilizzando cURL ma stava fallendo causa di "CURLOPT_SSL_VERIFYPEER" sul locale :(

$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

Sono stato in grado di risolvere questo stesso problema grazie al codice CURL. Grazie. – woodgate

+1

Questa immagine funziona. Posso confermarlo. –