2012-08-09 29 views
9

Ho deciso di estrarre le informazioni dall'API di Google Meteo: il codice che sto utilizzando di seguito funziona correttamente.Google Weather API 403 Errore

  XmlDocument widge = new XmlDocument(); 
      widge.Load("https://www.google.com/ig/api?weather=Brisbane/dET7zIp38kGFSFJeOpWUZS3-"); 
      var weathlist = widge.GetElementsByTagName("current_conditions"); 
      foreach (XmlNode node in weathlist) 
      { 

       City.Text = ("Brisbane"); 
       CurCond.Text = (node.SelectSingleNode("condition").Attributes["data"].Value); 
       Wimage.ImageUrl = ("http://www.google.com/" + node.SelectSingleNode("icon").Attributes["data"].Value); 
       Temp.Text = (node.SelectSingleNode("temp_c").Attributes["data"].Value + "°C"); 
     } 
    } 

come ho già detto, io sono in grado di tirare i dati richiesti dal file XML e visualizzarlo, se la pagina viene aggiornata o una sessione di corrente è ancora attivo, ricevo il seguente errore:

WebException was unhandled by user code - The remote server returned an error: 403 Forbidden Exception.

Mi chiedo se questo potrebbe avere a che fare con qualche tipo di limitazione dell'accesso all'accesso a quel particolare file XML?

ulteriori ricerche e l'adattamento dei suggerimenti

come indicato di seguito, questo non è affatto buone prassi, ma ho incluso la cattura io uso per l'eccezione. Eseguo questo codice su Page_Load, quindi faccio solo un postback alla pagina. Non ho notato alcun problema da allora. Per quanto riguarda le prestazioni, non sono eccessivamente preoccupato - non ho notato alcun aumento del tempo di caricamento e questa soluzione è temporanea a causa del fatto che questo è tutto a scopo di test. Sto ancora utilizzando l'API meteo di Yahoo.

 try 
     { 
      XmlDocument widge = new XmlDocument(); 
      widge.Load("https://www.google.com/ig/api?weather=Brisbane/dET7zIp38kGFSFJeOpWUZS3-"); 
      var list2 = widge.GetElementsByTagName("current_conditions"); 
      foreach (XmlNode node in list2) 
      { 

       City.Text = ("Brisbane"); 
       CurCond.Text = (node.SelectSingleNode("condition").Attributes["data"].Value); 
       Wimage.ImageUrl = ("http://www.google.com/" + node.SelectSingleNode("icon").Attributes["data"].Value); 
       Temp.Text = (node.SelectSingleNode("temp_c").Attributes["data"].Value + "°C"); 

      } 
     } 
     catch (WebException exp) 
     { 
      if (exp.Status == WebExceptionStatus.ProtocolError && 
       exp.Response != null) 
      { 
       var webres = (HttpWebResponse)exp.Response; 
       if (webres.StatusCode == HttpStatusCode.Forbidden) 
       { 
        Response.Redirect(ithwidgedev.aspx); 
       } 

      } 
     } 

articolo Google movimentazione

Google API Handle Errors

Grazie errore illustrando API per:

https://stackoverflow.com/a/12011819/1302173 (Cattura 403 e richiamo)

https://stackoverflow.com/a/11883388/1302173 (gestione degli errori e generale di Google informazioni API)

https://stackoverflow.com/a/12000806/1302173 (Response Handling/JSON caching - Progetti per il futuro)

alternativa

ho trovato questa grande alternativa open source di recente

OpenWeatherMap - Free weather data and forecast API

risposta

12

Questo è legato ad un cambiamento/interruzione del servizio . Vedere: http://status-dashboard.com/32226/47728

enter image description here

ho utilizzato di Google API Meteo per oltre un anno per alimentare un server di telefono in modo che i telefoni Polycom ricevono una pagina del tempo. Ha funzionato senza errori per oltre un anno. A partire dal 7 agosto 2012 ci sono stati frequenti errori intermittenti 403.

Rendo un hit del servizio una volta all'ora (come è sempre stato il caso) quindi non penso che la frequenza della richiesta sia il problema. È più probabile che la natura intermittente del 403 sia correlata al parziale roll-out di una modifica alla configurazione o di una modifica CDN su Google.

L'API meteo di Google non è in realtà un'API pubblicata. Era un servizio interno apparentemente progettato per essere utilizzato su iGoogle, quindi il livello di supporto è incerto. Ho twittato googleapis ieri e non ho ricevuto risposta.

Può essere meglio passare ad un clima API promosso quali: WUnderground Weather o Yahoo Weather.

ho aggiunto il seguente 'meno definita' la gestione degli errori di codice Perl me ieri per far fronte a questo, ma se il problema persiste mi passa a un servizio più pienamente supportato:

my $url = "http://www.google.com/ig/api?weather=" . $ZipCode ; 

my $tpp = XML::TreePP->new(); 
my $tree = $tpp->parsehttp(GET => $url); 

my $city = $tree->{xml_api_reply}->{weather}->{forecast_information}->{city}->{"-data"}; 

unless (defined($city)) { 
    print "The weather service is currently unavailable. \n"; 
    open (MYFILE, '>/home/swarmp/public_html/status/polyweather.xhtml'); 
    print MYFILE qq(<?xml version="1.0" encoding="utf-8"?>\n); 
    print MYFILE qq(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11.dtd">\n); 
    print MYFILE qq(<html xmlns="http://www.w3.org/1999/xhtml">\n); 
    print MYFILE qq(<head><title>Weather is Unavailable!</title></head>\n); 
    print MYFILE qq(<body>\n); 
    print MYFILE qq(<p>\n); 
    print MYFILE qq(The weather service is currently unavailable from the data vendor.\n); 
    print MYFILE qq(</p>\n); 
    print MYFILE qq(</body>\n); 
    print MYFILE qq(</html>\n); 
    close MYFILE; 
    exit(0); 
}... 
+2

Ottima risposta! Sarei spinto a ipotizzare che lo smantellamento di iGoogle stia influenzando questo servizio. Ero vagamente consapevole del fatto che l'API era "solo per uso di widget", quindi suppongo che non sia eccessivamente sorprendente che ci siano problemi con l'affidabilità del servizio. Cercherò di utilizzare queste alternative e magari di adattare le idee alla base della gestione delle eccezioni. Grazie ancora! – mitchimus

+2

Sheesh! Prova il tuo tentativo/cattura tutti ... +1 –

+0

A partire dal 27 agosto 2012 il servizio risponde con un errore 403 coerente e un messaggio che indica che stai inviando query automatiche .: – ClearCrescendo

0

ho scoperto che se si prova la richiesta in un browser pulito (come la nuova modalità di navigazione in incognito su Chrome) il servizio meteo di Google funziona. Possibile problema dei cookie?

+3

Purtroppo il nuovo browser non sembra funzionare. Il problema è che il servizio stesso non è mai stato concepito per essere utilizzato al di fuori del widget meteo utilizzato da iGoogle. A causa di una serie di fattori, tra cui iGoogle viene gradualmente eliminato, non sono sorpreso che stiamo riscontrando problemi di prestazioni. Inserirò il mio codice per l'API di Yahoo nei prossimi giorni o due. Ma non penso che nessuno di noi vedrà davvero la fine dei problemi, indipendentemente dallo stato del browser. – mitchimus

1

Questa è la stessa cosa che abbiamo scoperto.

Confrontare l'intestazione della richiesta in una richiesta errata e una richiesta di lavoro. La richiesta di lavoro include i cookie. Ma da dove vengono?

Elimina tutti i cookie del browser da google. La chiamata api meteo non funzionerà più nel tuo browser. Passare a google.com e quindi alla api meteo, funzionerà di nuovo.

Google controlla i cookie per bloccare più chiamate API. Ottenere i cookie una volta prima di gestire tutte le richieste di API meteo risolverà il problema. I cookie scadranno tra un anno. Presumo che riavvierai la tua applicazione più spesso di una volta all'anno. In modo che ne otterrai uno nuovo. Ottenere i cookie per ogni richiesta terminerà con lo stesso problema: troppe richieste diverse.

Un consiglio: le condizioni meteorologiche non cambiano spesso, quindi memorizzare le informazioni su JSON (per circa un'ora). Ciò ridurrà le operazioni lunghe come richieste!

1

Questa non è affatto una buona pratica, ma io uso questa API pesantemente in alcune app WP7 e Metro. Gestisco ciò rilevando l'eccezione (il più delle volte un 403) e semplicemente richiamando il servizio all'interno del catch, se c'è un errore sul Google end è di solito breve e si traduce solo in 1 o 2 chiamate aggiuntive.

Problemi correlati