2012-08-09 31 views
9

Decidí obtener información de la API meteorológica de Google. El código que estoy usando a continuación funciona bien.Google Weather API 403 Error

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

Como ya he dicho, soy capaz de extraer los datos requeridos desde el archivo XML y mostrarlo, sin embargo, si se actualiza la página o una sesión todavía está en ejecución, recibo el siguiente error:

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

Me pregunto si esto podría estar relacionado con algún tipo de limitación de acceso para acceder a ese archivo XML en particular?

más investigación y adaptación de sugerencias

Como se indica más adelante, esto es de ninguna manera la mejor práctica, pero he incluido la captura ahora uso de la excepción. Ejecuto este código en Page_Load, así que solo hago una devolución posterior a la página. No he notado ningún problema desde entonces. En cuanto al rendimiento, no estoy demasiado preocupado: no he notado ningún aumento en el tiempo de carga y esta solución es temporal debido a que todo esto es para fines de prueba. Todavía estoy en el proceso de usar Weather API de 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); 
       } 

      } 
     } 

artículo Google API error que ilustra el manejo de

Google API Handle Errors

Gracias a:

https://stackoverflow.com/a/12011819/1302173 (Catch 403 y el recuerdo)

https://stackoverflow.com/a/11883388/1302173 (Control de errores y el general Google información API)

https://stackoverflow.com/a/12000806/1302173 (respuesta de manejo/JSON almacenamiento en caché - Los planes futuros)

Alternativa

me encontré con este gran alternativa de código abierto recientemente

OpenWeatherMap - Free weather data and forecast API

Respuesta

12

Esto está relacionado con un cambio/interrupción del servicio . Ver: http://status-dashboard.com/32226/47728

enter image description here

He estado usando la API de Google El tiempo durante más de un año para alimentar un servidor de teléfono para que los teléfonos Polycom reciben una página del tiempo. Se ha ejecutado sin errores durante más de un año. A partir del 7 de agosto de 2012 ha habido frecuentes 403 errores intermitentes.

Llamo una vez por hora al servicio (como siempre ha sido el caso), así que no creo que la frecuencia de la solicitud sea el problema. Es más probable que la naturaleza intermitente del 403 esté relacionada con el despliegue parcial de un cambio de configuración o un cambio de CDN en Google.

Google Weather API no es realmente una API publicada. Era un servicio interno aparentemente diseñado para su uso en iGoogle, por lo que el nivel de soporte es incierto. Tuiteé googleapis ayer y no recibí respuesta.

Puede ser mejor cambiar a una API de tiempo promovido tales como: WUnderground Weather o Yahoo Weather.

He añadido el siguiente 'menos que se defina' manejo de errores de código Perl mismo ayer para hacer frente a esto, pero si el problema persiste voy a cambiar a un servicio más plenamente compatibles:

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

¡Excelente respuesta! Me presionaría para especular que el desmantelamiento de iGoogle está afectando a este servicio. Estaba vagamente consciente de que la API era "solo para uso de widgets", así que supongo que no es demasiado sorprendente que haya problemas con la fiabilidad del servicio. Analizaré el uso de esas alternativas y, posiblemente, la adaptación de las ideas detrás de su manejo de excepciones. ¡Gracias de nuevo! – mitchimus

+2

Sheesh! Explota tu intento/atrapa a todos ... +1 –

+0

A partir del 27 de agosto de 2012, el servicio responde con un error consistente 403 y un mensaje que indica que estás enviando consultas automáticas .: – ClearCrescendo

0

He descubierto que si se prueba la solicitud en un navegador limpio (como el modo incógnito de la nueva ventana en Chrome), funciona el servicio meteorológico de Google. Posible problema de cookies?

+3

Desafortunadamente, el navegador nuevo no parece funcionar. El problema es que el servicio en sí nunca se usó fuera del Weather Widget que usó iGoogle. Debido a una serie de factores, entre los que se incluye la eliminación progresiva de iGoogle, no me sorprende que tengamos problemas de rendimiento. Publicaré mi código para la API de Yahoo en el próximo día o dos. Pero no creo que ninguno de nosotros realmente vaya a ver el final de los problemas, independientemente del estado del navegador. – mitchimus

1

Eso es lo mismo que descubrimos.

Comparar el encabezado de solicitud en una solicitud incorrecta y una solicitud de trabajo. La solicitud de trabajo incluye cookies. Pero, ¿de dónde son?

Eliminar todas las cookies de su navegador de google. La llamada de API del clima ya no funcionará en tu navegador. Navega a google.com y luego a la API del clima, funcionará nuevamente.

Google comprueba las cookies para bloquear varias llamadas de API. Obtener las cookies una vez antes de manejar todas las solicitudes de API de clima solucionará el problema. Las cookies caducarán en un año. Supongo que reiniciará su aplicación con más frecuencia que una vez al año. Para que te den una nueva. Recibir cookies para cada solicitud terminará con el mismo problema: Demasiadas solicitudes diferentes.

Un consejo: El tiempo no suele cambiar, por lo tanto, guarde en caché la información de json (durante quizás una hora). ¡Esto reducirá las operaciones que consumen mucho tiempo como solicitudes!

1

Esto no es de ninguna manera una mejor práctica, pero uso esta API en gran medida en algunas aplicaciones WP7 y Metro. Manejo esto atrapando la excepción (la mayoría de las veces un 403) y simplemente volviendo a llamar al servicio dentro de la captura, si hay un error en el final de Google, generalmente es breve y solo da como resultado 1 o 2 llamadas adicionales.