10

Yahoo の無料の天気 API を使用して必要な天気データを取得し始めましたが、都市の天気データを要求するたびに、更新されたデータまたは 1 ~ 8 日前の古いデータを取得する可能性があるようです。

これは、私がリクエストを行う簡単な URL です: ここをクリックして、サンプルリクエストを表示します。

YQL クエリは単純で、ニューヨーク市の気象データを要求します。

select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="New York")

しかし、その URL を更新するたびに、まったく異なる結果が得られる可能性があります。たとえば、私は今それを数回更新しました (現在は 2015 年 11 月 13 日、GMT 時間の 22:45 頃です) query.results.channel.item.condition.date

"date":"Fri, 13 Nov 2015 4:49 pm EST"
"date":"Thu, 12 Nov 2015 2:13 am EST"
"date":"Wed, 11 Nov 2015 1:49 am EST"
"date":"Fri, 13 Nov 2015 1:49 am EST"

これは非常に複雑です。リクエストを行うたびに API がランダムな日付の気象データを返す場合、このような現在の気象データを取得するにはどうすればよいでしょうか?

ここで何か間違っているか、何かが欠けていますか?

ノート:

  • この動作は、私が試した多くの異なる都市で同じです。
  • YQL コンソールで同じクエリを使用しても、同じ問題は発生していないようです。( YQL コンソール)実際に同じ問題がそこにも発見されています
  • この XML/RSS リクエスト メソッドでも同じことが起こっています: http://weather.yahooapis.com/forecastrss?w=2459115

アップデート:

  • 8 日前のデータが返されたケースに遭遇しました!
  • 要求されたレコードを選択した後にソートが適用されるため、YQL の SORT 関数を使用しても問題は解決しません。
  • 今日 (2015 年 11 月 25 日)、20 回以上の更新を試みましたが、返されるデータは常に正しいようで、問題は修正されたようです。

  • 2015 年 11 月 26 日、Yahoo は問題が修正されたことを発表しました。フィードバックをお寄せいただきありがとうございます。この問題は修正されました。もう一度サイトをチェックしてください。それでも問題が解決しない場合は、このフォーラムに新しいアイデアを投稿してください。

4

3 に答える 3

3

Yahoo の開発者は、この問題を調査していると twitter で返信しました。あなたはそれをフォローアップし、ここで(プロセスをスピードアップするために)賛成票を投じることができます:

https://yahoo.uservoice.com/forums/207813/suggestions/10740099

于 2015-11-21T00:51:52.423 に答える
0

回避策があります。有効な結果が得られるまで、API を繰り返し呼び出します。独自のカスタム天気ウィジェットを作成するために使用したコードは次のとおりです (コードをテストすると、30 回試行しても利用できないデータが返されることがあります!)

数日前に #YDNでもツイートしましたが、反応がありませんでした。

var ydnwthr={};
var ydnStaleness=100000; //YDN weather api is f'ed up and returns stale data, so hammer it repeatedly and then test for data staleness
var abortydn=30; //abort after these many calls
var delayBetweencalls=200; //in milliseconds
var ydncounter=0;
var ydnInterval;
var apiquery=escape('select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="lansing, mi")');
var ydnapiurl='https://query.yahooapis.com/v1/public/yql?q='+apiquery+'&format=json&env='+escape("store://datatables.org/alltableswithkeys");
$(function() { 
   function markupWeather(){
     if(ydnStaleness>1.5) $("#weather").html('weather data not available..');
     else{ 
       /****************THIS IS WHERE YOU DO WHATEVER YOU WANT WITH THE "GOOD" ydnwthr OBJECT ***********/
      var wthrMarkup = "<div id='swHead'>" + ydnwthr.title.replace(/Conditions for | e[sd]t/ig,"") +  "<sub style='font-size:6pt;color:silver'>" +ydncounter+"</sub>"+"</div>";
  	  wthrMarkup += "<div id='swBody' title='updated:" + ydnwthr.pubDate + ". click for details'><div id='swBodyBg'></div><div id='swCurrent'>";
  	  wthrMarkup += ydnwthr.condition.text + ", " + ydnwthr.condition.temp +"&deg;</div></div>";
  	  $("#weather").html(wthrMarkup);
  	  $("#swBodyBg").css('background-image', 'url(' + /".*"/.exec(ydnwthr.description) + ')');
  	  for (i=0;i<5;i++){ //get 5 day weather and fit to container - (done without jquery for convenience)
  	   var el = document.createElement("div");
  	   el.innerText = ydnwthr.forecast[i].day.substr(0,2) + ": " + ydnwthr.forecast[i].text + ", " + ydnwthr.forecast[i].high + "/"+ ydnwthr.forecast[i].low;
  	   $("#swBody")[0].appendChild(el);
  	   while(parseInt(window.getComputedStyle(el, null).getPropertyValue('height')) > 42) {
  		   var fontSize = parseFloat(window.getComputedStyle(el, null).getPropertyValue('font-size'));
  		   el.style.fontSize = (fontSize - 1) + 'px';
  		 }
  	   }
     }
   }//end markupWeather
   ydnInterval=setInterval(function(){
     if(ydnStaleness<=2 || ydncounter>=abortydn) {
	   clearInterval(ydnInterval);
	   markupWeather();
	 }
     $.ajax({url:ydnapiurl}).done(function(data){
	   ydnwthr = data.query.results.channel.item;
	   if(ydnwthr.pubDate) ydnStaleness=(new Date()-new Date(ydnwthr.pubDate))/3600000;
	 });
	 ydncounter++;
   },delayBetweencalls);
});
#weather {border:3px ridge silver;border-radius:5px;cursor:pointer;width:180px;font:10pt/28px arial,sans-serif}
  #swHead {background:#bddeff;font-weight:bold;text-align:center;border-bottom:1px solid silver}
  #swBodyBg{position:absolute;background-position:center;background-size:100px 100px;background-repeat:no-repeat;opacity: 0.5;height:100%;width:100%;z-index:-1}
  #swBody{margin:0px 3px;position:relative;}
  #swCurrent{padding:5px;font:bold 1.1em arial; width:100%;text-align:center}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="weather" 
  onclick="self.open('http://www.wunderground.com/cgi-bin/findweather/getForecast?brand=wxmap&query=42.74461,-84.47283&lat=42.74461&lon=-84.47283&zoom=11&type=terrain&units=english&rad=0&sat=0&svr=0&cams=0&tor=0&wxsn=1&wxsn.mode=tw&wxsn.opa=50&wxsn.bcdgtemp=0&wxsn.rf=0')">
  <i class="fa fa-spinner fa-spin fa-2x" style="margin:40px 65px"></i>
  <div style="margin:30px">getting weather...</div>
  </div>

于 2015-11-24T19:32:14.677 に答える