9

GoogleのWeatherAPIから情報を取得することにしました-以下で使用しているコードは正常に機能します。

            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がユーザーコードによって処理されませんでした-リモートサーバーがエラーを返しました:403ForbiddenException。

これは、その特定のXMLファイルへのアクセスに課せられたある種のアクセス制限と関係があるのではないかと思います。

提案のさらなる調査と適応

以下に説明するように、これは決してベストプラクティスではありませんが、現在例外として使用しているキャッチを含めました。このコードはPage_Loadで実行するので、ページにポストバックするだけです。それ以来、問題は発生していません。パフォーマンスに関しては、あまり心配していません。ロード時間の増加には気づいていません。このソリューションはすべてテスト目的であるため、一時的なものです。私はまだYahooのWeatherAPIを使用しているところです。

        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の記事

GoogleAPIはエラーを処理します

おかげで:

https://stackoverflow.com/a/12011819/1302173(403をキャッチしてリコール)

https://stackoverflow.com/a/11883388/1302173(エラー処理と一般的なGoogle API情報)

https://stackoverflow.com/a/12000806/1302173(応答処理/ jsonキャッシング-将来の計画)

私は最近、この素晴らしいオープンソースの代替案を見つけました

OpenWeatherMap-無料の天気データと予報API

4

4 に答える 4

12

これは、サービスの変更/停止に関連しています。参照:http ://status-dashboard.com/32226/47728

ここに画像の説明を入力してください

私はGoogleのWeatherAPIを1年以上使用して電話サーバーにフィードし、PolyCom電話が天気ページを受信できるようにしています。1年以上エラーなしで実行されています。2012年8月7日の時点で、断続的な403エラーが頻繁に発生しています。

私は1時間に1回サービスを利用しているので(いつものように)、リクエストの頻度は問題ではないと思います。403の断続的な性質は、Googleでの構成変更またはCDN変更の部分的なロールアウトに関連している可能性があります。

Google Weather APIは、実際には公開されたAPIではありません。これは明らかにiGoogleで使用するために設計された内部サービスであったため、サポートのレベルは不明です。昨日googleapisをツイートしましたが、応答がありませんでした。

WUndergroundWeatherや YahooWeatherなどのプロモートされた天気APIに切り替える方がよい場合があります 。

私は昨日、これに対処するために次の「定義されていない」エラー処理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);
}...
于 2012-08-09T12:23:56.577 に答える
1

それは私たちが見つけたのと同じことです。

不良リクエストと動作中のリクエストのリクエストヘッダーを比較します。作業リクエストにはCookieが含まれています。しかし、彼らはどこから来たのですか?

GoogleからすべてのブラウザCookieを削除します。天気API呼び出しは、ブラウザで機能しなくなります。google.comにアクセスしてから、天気APIにアクセスすると、再び機能します。

GoogleはCookieをチェックして、複数のAPI呼び出しをブロックします。すべての天気APIリクエストを処理する前にCookieを1回取得すると、問題が修正されます。クッキーは1年で期限切れになります。1年に1回よりも頻繁にアプリケーションを再起動すると思います。あなたが新しいものを手に入れるように。リクエストごとにCookieを取得すると、同じ問題が発生します。異なるリクエストが多すぎます。

ヒント:天気はあまり変わらないので、json情報をキャッシュします(おそらく1時間)。これにより、リクエストとしての時間のかかる操作が削減されます。

于 2012-08-17T06:30:36.193 に答える
1

これは決してベストプラクティスではありませんが、一部のWP7およびMetroアプリでこのAPIを頻繁に使用しています。私はこれを例外(ほとんどの場合403)をキャッチし、キャッチ内でサービスを再度呼び出すことでこれを処理します。Google側でエラーが発生した場合、通常は短時間で、追加の呼び出しは1つか2つだけになります。

于 2012-08-17T19:11:29.687 に答える
0

クリーンなブラウザ(Chromeの新しいウィンドウシークレットモードなど)でリクエストを試してみると、Googleの天気予報サービスが機能することがわかりました。クッキーの問題の可能性はありますか?

于 2012-08-16T09:00:28.063 に答える