2012-08-09 98 views
9

我決定從Google的Weather API中提取信息 - 我在下面使用的代碼正常工作。Google Weather API 403錯誤

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

正如我所說的,我能夠從XML文件中提取所需的數據並顯示出來,但是如果頁面刷新或當前會話仍處於活動狀態,我收到以下錯誤:

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

我想知道這是否可以做某種訪問限制放在訪問該特定的XML文件?

進一步的研究和建議的

如後所述適應,這絕不是最好的做法,但我已經包括了抓我現在使用的除外。我在Page_Load上運行這個代碼,所以我只做一個回傳到頁面。自那以後我沒有注意到任何問題。性能方面,我並不過分擔心 - 我沒有注意到加載時間有任何增加,並且這種解決方案是暫時的,因爲這些都是爲了測試目的。我仍在使用雅虎的Weather API。

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

      } 
     } 

谷歌的文章說明API錯誤處理

Google API Handle Errors

感謝:

https://stackoverflow.com/a/12011819/1302173(捕捉403和召回)

https://stackoverflow.com/a/11883388/1302173(錯誤處理和一般谷歌API的信息)

https://stackoverflow.com/a/12000806/1302173(響應處理/ JSON緩存 - 未來的計劃)

替代

我發現這個偉大的開源替代品最近

OpenWeatherMap - Free weather data and forecast API

回答

12

這是關係到服務的變化/停運。請參閱:http://status-dashboard.com/32226/47728

enter image description here

我一直在使用谷歌的天氣API一年多了,這樣的寶利通電話接收天氣頁面養活電話服務器。它已經運行一年多了。截至2012年8月7日,經常出現間歇性403次錯誤。

我每小時打一次服務(因爲一直如此),所以我不認爲請求的頻率是問題。更有可能的是,403的間歇性與Google的配置更改或CDN更改的部分展開有關。

Google Weather API實際上並不是已發佈的API。這是一種顯然是爲在iGoogle上使用而設計的內部服務,因此支持級別不確定。我昨天推特googleapis並沒有收到任何迴應。

這可能是更好的切換到促進的天氣API如: WUnderground WeatherYahoo Weather

我已經添加了以下「另有定義的」錯誤處理Perl代碼我昨天來應對這一點,但如果問題仍然存在,我會切換到更全面的支持服務:

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

優秀的答案!我將被推測推測iGoogle的拆除正在影響這項服務。 我隱約地意識到API是「僅供Widget使用」,所以我認爲服務可靠性存在問題並不令人意外。 我會研究使用這些替代方法,並可能調整異常處理背後的想法。再次感謝! – mitchimus 2012-08-10 01:05:43

+2

Sheesh!打破你的嘗試/抓住每個人... +1 – 2012-08-10 02:08:48

+0

截至2012年8月27日,該服務正在響應一致的403錯誤,並顯示一條消息,指出您正在發送自動查詢。: – ClearCrescendo 2012-08-31 19:23:50

0

我發現,如果你在乾淨的瀏覽器中嘗試請求(例如Chrome上的新窗口隱身模式)谷歌天氣服務工作。 Cookie可能存在問題?

+3

不幸的是,新的瀏覽器似乎無法正常工作。問題是,服務本身從未打算在iGoogle使用的Weather Widget之外使用。由於許多因素,包括iGoogle正在逐漸停止使用,對於我們遇到性能問題,我並不感到驚訝。我將在第二天或第二天發佈我的雅虎API代碼。但我認爲,無論瀏覽器狀態如何,我們都不會看到任何問題的結束。 – mitchimus 2012-08-17 14:00:58

1

這是我們發現的同樣的事情。

比較差請求和工作請求中的請求頭。工作要求包括cookies。但他們從哪裏來?

從google中刪除所有瀏覽器cookie。天氣API調用將不再適用於您的瀏覽器。瀏覽到google.com,然後瀏覽到天氣api,它會再次運行。

谷歌檢查cookie以阻止多個API調用。在處理所有天氣api請求之前獲取cookie一次將解決問題。 Cookie將在一年內過期。我假設你會更頻繁地重新啓動你的應用程序,然後每年一次。所以你會得到一個新的。爲每個請求獲取Cookie將以相同的問題結束:太多不同的請求。

一個提示:天氣不會經常變化,所以緩存json信息(可能一個小時)。這將按照要求減少耗時的操作!

1

這絕不是最佳做法,但我在一些WP7和Metro應用程序中大量使用此API。我通過捕獲異常(大部分時間爲403)並簡單地重新調用服務內部的服務來處理此問題,如果Google結束時出現錯誤,它通常會短暫地執行,並且只會導致1或2個額外的調用。