2012-08-09 47 views
9

Tôi quyết định lấy thông tin từ API thời tiết của Google - Mã tôi đang sử dụng bên dưới hoạt động tốt.Lỗi thời tiết Google 403 Lỗi

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

Như tôi đã nói, tôi có thể để kéo dữ liệu cần thiết từ các tập tin XML và hiển thị nó, tuy nhiên nếu trang được làm mới hoặc một phiên hiện tại vẫn còn hoạt động, tôi nhận được lỗi sau:

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

Tôi đang tự hỏi liệu điều này có thể liên quan đến một số loại giới hạn truy cập được đưa vào quyền truy cập vào tệp XML cụ thể đó không?

Nghiên cứu sâu hơn và thích ứng gợi ý

Như đã trình bày dưới đây, điều này là do không có phương tiện thực hành tốt nhất, nhưng tôi đã bao gồm đánh bắt bây giờ tôi sử dụng cho ngoại lệ. Tôi chạy mã này trên Page_Load vì vậy tôi chỉ làm một post-back cho trang. Tôi đã không nhận thấy bất kỳ vấn đề kể từ đó. Hiệu suất khôn ngoan Tôi không quá lo lắng - Tôi đã không nhận thấy bất kỳ sự gia tăng thời gian tải và giải pháp này là tạm thời do thực tế này là tất cả cho mục đích thử nghiệm. Tôi vẫn đang trong quá trình sử dụng API thời tiết của 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); 
       } 

      } 
     } 

bài viết của Google minh họa API xử lý lỗi

Google API Handle Errors

Nhờ:

https://stackoverflow.com/a/12011819/1302173 (Catch 403 và thu hồi)

https://stackoverflow.com/a/11883388/1302173 (Xử lý lỗi và Tổng Google thông tin API)

https://stackoverflow.com/a/12000806/1302173 (Phản ứng Xử lý/json bộ nhớ đệm - Dự định sắp tới)

Alternative

Tôi thấy điều này rất tốt thay thế mã nguồn mở gần đây

OpenWeatherMap - Free weather data and forecast API

Trả lời

12

này liên quan đến một sự thay đổi/cúp của dịch vụ . Xem: http://status-dashboard.com/32226/47728

enter image description here

tôi đã được sử dụng API của Google Thời tiết trong hơn một năm để nuôi một máy chủ điện thoại để điện thoại Polycom nhận được một trang thời tiết. Nó đã chạy lỗi miễn phí trong hơn một năm. Tính đến ngày 7 tháng 8 năm 2012, đã có nhiều lỗi liên tục 403 lần.

Tôi thực hiện một lần truy cập dịch vụ một lần mỗi giờ (Như đã luôn luôn xảy ra) vì vậy tôi không nghĩ tần suất yêu cầu là vấn đề. Nhiều khả năng bản chất liên tục của 403 có liên quan đến việc thực hiện một phần thay đổi cấu hình hoặc thay đổi CDN tại Google.

API thời tiết của Google không thực sự là API được xuất bản. Đó là một dịch vụ nội bộ được thiết kế rõ ràng để sử dụng trên iGoogle nên mức độ hỗ trợ là không chắc chắn. Tôi đã tweet googleapis hôm qua và không nhận được phản hồi.

Có thể chuyển sang API thời tiết được quảng bá tốt hơn như: WUnderground Weather hoặc Yahoo Weather.

Tôi đã thêm sau 'trừ khi định nghĩa' lỗi xử lý mã perl bản thân mình ngày hôm qua để đối phó với điều này nhưng nếu vấn đề vẫn còn, tôi sẽ chuyển sang một dịch vụ hơn hỗ trợ đầy đủ:

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

Câu trả lời hay! Tôi sẽ bị đẩy để suy đoán rằng việc tháo gỡ iGoogle đang ảnh hưởng đến dịch vụ này. Tôi đã mơ hồ nhận thấy rằng API là "chỉ dành cho tiện ích con" nên tôi cho rằng không quá ngạc nhiên khi có vấn đề về độ tin cậy của dịch vụ. Tôi sẽ xem xét sử dụng các lựa chọn thay thế đó và có thể điều chỉnh các ý tưởng đằng sau xử lý ngoại lệ của bạn. Cảm ơn một lần nữa! – mitchimus

+2

Sheesh! Break out try của bạn/bắt tất cả mọi người ... +1 –

+0

Tính đến ngày 27 tháng 8 năm 2012, dịch vụ phản hồi với lỗi 403 nhất quán và thông báo cho biết bạn đang gửi truy vấn tự động .: – ClearCrescendo

0

Tôi thấy rằng nếu bạn thử yêu cầu trong trình duyệt sạch (như chế độ ẩn danh cửa sổ mới trên chrome) dịch vụ thời tiết của google hoạt động. Có thể có vấn đề về cookie?

+3

Rất tiếc, trình duyệt mới dường như không hoạt động. Vấn đề là, bản thân dịch vụ không bao giờ được dự định sử dụng bên ngoài Tiện ích thời tiết iGoogle được sử dụng. Do một số yếu tố, bao gồm cả iGoogle đang dần bị loại bỏ, tôi không ngạc nhiên khi chúng tôi gặp sự cố về hiệu suất. Tôi sẽ đăng mã của tôi cho Yahoo API trong một hoặc hai ngày tới. Nhưng tôi không nghĩ rằng bất kỳ người trong chúng ta thực sự sẽ thấy một kết thúc cho các vấn đề, bất kể trạng thái trình duyệt. – mitchimus

1

Đó là điều tương tự chúng tôi đã phát hiện ra.

So sánh tiêu đề yêu cầu trong yêu cầu không hợp lệ và yêu cầu hoạt động. Yêu cầu làm việc bao gồm cookie. Nhưng họ đến từ đâu?

Xóa tất cả cookie trình duyệt của bạn khỏi google. Cuộc gọi api thời tiết sẽ không hoạt động trong trình duyệt của bạn nữa. Duyệt đến google.com và sau đó đến api thời tiết, nó sẽ hoạt động trở lại.

Google kiểm tra cookie để chặn nhiều cuộc gọi api. Lấy cookie một lần trước khi xử lý tất cả các yêu cầu api thời tiết sẽ khắc phục được sự cố. Các cookie sẽ hết hạn sau một năm. Tôi cho rằng bạn sẽ khởi động lại ứng dụng của bạn thường xuyên hơn sau đó mỗi năm một lần. Vì vậy, bạn sẽ nhận được một cái mới. Nhận cookie cho mỗi yêu cầu sẽ kết thúc trong cùng một vấn đề: Quá nhiều yêu cầu khác nhau.

Một mẹo: Thời tiết thường không thay đổi, do đó hãy lưu thông tin json (có thể là một giờ). Điều đó sẽ giảm các hoạt động tốn thời gian theo yêu cầu!

1

Đây không phải là phương pháp hay nhất, nhưng tôi sử dụng API này rất nhiều trong một số ứng dụng WP7 và Metro. Tôi xử lý điều này bằng cách bắt ngoại lệ (phần lớn thời gian là 403) và chỉ cần gọi lại dịch vụ bên trong phần bắt, nếu có lỗi trên đầu Google, nó thường ngắn gọn và chỉ dẫn đến 1 hoặc 2 cuộc gọi bổ sung.

Các vấn đề liên quan