Yahoo weather API, randomly returns old data?

后端 未结 3 1825
不知归路
不知归路 2021-02-03 11:39

I started using Yahoo\'s free weather API to get the weather data I need, but it seems each time I request a city weather data there is a chance that either I get updated data o

相关标签:
3条回答
  • 2021-02-03 11:48

    Yahoo dev's replied on twitter saying that they are investigating this issue. You can follow it up and upvote (for speeding the process) it here:

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

    0 讨论(0)
  • 2021-02-03 11:52

    I have a workaround: repeatedly call the api until you get a valid result. Here is the code I used to make my own custom weather widget: (when you test the code, it sometimes returns data not available even after 30 tries!)

    I also tweeted on #YDN a few days back, but did not get any response.

    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>

    0 讨论(0)
  • 2021-02-03 12:07

    I have used the Yahoo Weather API XML format for years and noticed in that last couple of weeks this new bug. I tried to report the bug to https://developer.yahoo.com/weather/support but get a 404 page not found. I decided to parse the returned date if equal to current date to continue if not equal to re-call sub. this way I always get current weather but unfortunately that's a lot of unnecessary traffic / request maybe YDN will realize and fix. but without being able to report I don't know. I know this is not a fix but more a Band-Aid good luck!

    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
    
    0 讨论(0)
提交回复
热议问题