Google Weather API 403 Error

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

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 dije, puedo extraer los datos requeridos del archivo XML y mostrarlos; sin embargo, si la página se actualiza o si una sesión actual todavía está activa, recibo el siguiente error:

WebException no fue controlada por el código de usuario: el servidor remoto devolvió un error: 403 Excepción prohibida.

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.

Investigación adicional y adaptación de sugerencias

Como se indica a continuación, esto de ninguna manera es la mejor práctica, pero he incluido la captura que ahora uso para 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 de Google que ilustra el manejo de errores de API

Errores de manejo de la API de Google

Gracias a:

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

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

https://stackoverflow.com/a/12000806/1302173 (Manejo de respuestas / caché json – Planes futuros)

Alternativa

Encontré esta gran alternativa de código abierto recientemente

OpenWeatherMap – API gratis de datos meteorológicos y pronósticos

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 Weather de Google durante más de un año para alimentar un servidor telefónico para que los teléfonos PolyCom reciban una página meteorológica. 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.

Aprovecho el servicio una vez por hora (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.

La API de Google Weather 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 meteorológica promocionada, como: WUnderground Weather o Yahoo Weather .

Ayer he agregado el siguiente error “a menos que esté definido” para el manejo del código perl para hacer frente a esto, pero si el problema persiste, cambiaré a un servicio totalmente compatible:

 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(\n); print MYFILE qq(Weather is Unavailable!\n); print MYFILE qq(\n); print MYFILE qq(

\n); print MYFILE qq(The weather service is currently unavailable from the data vendor.\n); print MYFILE qq(

\n); print MYFILE qq(\n); print MYFILE qq(\n); close MYFILE; exit(0); }...

Esto de ninguna manera es una mejor práctica, pero utilizo 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.

Eso es lo mismo que descubrimos.

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

Elimina todas las cookies de tu 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 múltiples 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 clima no cambia a menudo, así que guarde en caché la información json (por quizás una hora). ¡Esto reducirá las operaciones que consumen mucho tiempo como solicitudes!

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