Yahoo weather API, случайно возвращает старые данные?
Я начал использовать бесплатный API погоды Yahoo, чтобы получать данные о погоде, которые мне нужны, но каждый раз, когда я запрашиваю данные о погоде в городе, есть вероятность, что либо я получу обновленные данные, либо старые данные обратно до 1 до 8 дней.
Вот простой URL-адрес, по которому я делаю свой запрос:
Нажмите здесь, чтобы просмотреть образец запроса
Запрос YQL прост, который запрашивает данные о погоде для Нью-Йорка:
select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="New York")
Но каждый раз, когда я обновляю этот URL-адрес, я могу получить совершенно другой результат. например, я обновил его сейчас пару раз (сейчас 13 ноября 2015 года, около 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 дней назад!
- Использование функций SORT для YQL не устраняет проблему, так как сортировка применяется после выбора запрошенной записи/записей.
-
Сегодня (25 ноября 2015 года), я пробовал более 20 обновлений и кажется, что возвращаемые данные всегда правильные, кажется, проблема исправлена.
-
26 ноября 2015 года Yahoo объявила, что проблема исправлена: спасибо за ваши отзывы. Эта проблема исправлена. Проверьте сайт снова. Если у вас все еще есть эта проблема, отправьте новую идею на этом форуме.
Ответы
Ответ 1
Я использовал формат Yahoo Weather API XML в течение многих лет и за последние пару недель заметил эту новую ошибку. Я попытался сообщить об ошибке в https://developer.yahoo.com/weather/support, но не нашел 404 страницы. Я решил проанализировать возвращенную дату, если она равна текущей дате, чтобы продолжить, если не равна повторному вызову. таким образом, я всегда получаю текущую погоду, но, к сожалению, много ненужного трафика/запроса, возможно, YDN поймет и исправит. но, не имея возможности сообщить, я не знаю. Я знаю, что это не исправить, но больше удачи в Band-Aid!
Private Sub btnWeather_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWeather.Click
If InternetConnection() = False Then
MsgBox("No internet connection!", vbExclamation, "Oops!")
Exit Sub
Else
'MsgBox("Internet connection detected!", vbInformation, "Huray!")
btnWeather.Enabled = False
lblWorking.Text = "Working ..."
tbTries.Text = "1"
Try
Dim t As New clsWeather(Format(Me.TxtBoxZIP.Text), "f")
lblTodaysDate.Text = FormatDateTime(Now.Date, DateFormat.ShortDate)
tbHigh.Text = t.high & "°"
lblCity.Text = TxtBoxZIP.Text & " Weather "
tbLow.Text = t.Low & "°"
tbDay.Text = t.day
tbDate.Text = t.date1
tbCurrenttemp.Text = t.currenttemp & "°"
tbCurrentCode.Text = t.currentcode
tbForcastCode.Text = t.ForcastCode
tbSunrise.Text = t.Sunrise
tbSunset.Text = t.Sunset
tbWind.Text = CInt(Val(t.Wind)) & " mph"
tbHumidity.Text = CInt(Val(t.humidity))
imgWeather.Image = Image.FromFile(t.GetImage)
CodeName()
If t.currenttemp < 85 And t.currenttemp > 45 Then
lblFeelsLike.Text = ""
tbFeelsLike.Text = ""
End If
If t.currenttemp > 85 Then
lblFeelsLike.Text = "Heat Index:"
Dim Temp = t.currenttemp
Dim RH = CInt(Val(t.humidity))
tbFeelsLike.Text = (-42.379 + 2.04901523 * Temp) + (10.14333127 * RH) - (0.22475541 * Temp * RH) - (0.00683783 * Temp * Temp) - (0.05481717 * RH * RH) + (0.00122874 * Temp * Temp * RH) + (0.00085282 * Temp * RH * RH) - (0.00000199 * Temp * Temp * RH * RH)
Dim num As Decimal = CType(tbFeelsLike.Text, Decimal)
Me.tbFeelsLike.Text = String.Format("{0:n0}", num)
tbFeelsLike.Text = tbFeelsLike.Text & "°"
End If
If t.currenttemp < 45 Then
lblFeelsLike.Text = "Wind Chill:"
tbFeelsLike.Text = CInt(Val(t.Chill)) & "°"
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
Dim day As String = DateTime.Now.ToString("dd")
If day = tbDate.Text = True Then
tbDate1.Text = tbDate.Text
btnWeather.Enabled = True
lblWorking.Text = ""
Else
btnWeather_Click(sender, e)
tbTries.Text = tbTries.Text + 1
End If
End Sub
Ответ 2
Yahoo dev ответил на твиттер, сказав, что они расследуют эту проблему. Вы можете следить за ним и повышать (для ускорения процесса) здесь:
https://yahoo.uservoice.com/forums/207813/suggestions/10740099
Ответ 3
У меня есть обходное решение: повторно вызывайте 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 +"°</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="#" onclick="location.href='https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css'; return false;" 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>