Skip to content

Instantly share code, notes, and snippets.

@VerizonMediaOwner
Last active March 6, 2022 20:39
Show Gist options
  • Save VerizonMediaOwner/eea82f47f3d688e466feac494696ca9e to your computer and use it in GitHub Desktop.
Save VerizonMediaOwner/eea82f47f3d688e466feac494696ca9e to your computer and use it in GitHub Desktop.
Yahoo Weather API C# Example
// Yahoo Weather API C# Sample Code
// Code sample offered under the terms of the CC0 Public Domain designation. See https://creativecommons.org/publicdomain/zero/1.0/legalcode/ for terms.
// Author: Eugene Plotnikov
using System;
using System.Net;
using System.Security.Cryptography;
using System.Text;
class YWSample {
const string cURL = "https://weather-ydn-yql.media.yahoo.com/forecastrss";
const string cAppID = "test-app-id";
const string cConsumerKey = "your-consumer-key";
const string cConsumerSecret = "your-consumer-secret";
const string cOAuthVersion = "1.0";
const string cOAuthSignMethod = "HMAC-SHA1";
const string cWeatherID = "woeid=727232"; // Amsterdam, The Netherlands
const string cUnitID = "u=c"; // Metric units
const string cFormat = "xml";
static string _get_timestamp () {
TimeSpan lTS = DateTime.UtcNow - new DateTime ( 1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc );
return Convert.ToInt64 ( lTS.TotalSeconds ).ToString ();
} // end _get_timestamp
static string _get_nonce () {
return Convert.ToBase64String (
new ASCIIEncoding ().GetBytes (
DateTime.Now.Ticks.ToString ()
)
);
} // end _get_nonce
// NOTE: whenever the value of a parameter is changed, say cUnitID "u=c" => "location=sunnyvale,ca"
// The order in lSign needs to be updated, i.e. re-sort lSign
// Please don't simply change value of any parameter without re-sorting.
static string _get_auth () {
string retVal;
string lNonce = _get_nonce ();
string lTimes = _get_timestamp ();
string lCKey = string.Concat ( cConsumerSecret, "&" );
string lSign = string.Format ( // note the sort order !!!
"format={0}&" +
"oauth_consumer_key={1}&" +
"oauth_nonce={2}&" +
"oauth_signature_method={3}&" +
"oauth_timestamp={4}&" +
"oauth_version={5}&" +
"{6}&{7}",
cFormat,
cConsumerKey,
lNonce,
cOAuthSignMethod,
lTimes,
cOAuthVersion,
cUnitID,
cWeatherID
);
lSign = string.Concat (
"GET&", Uri.EscapeDataString ( cURL ), "&", Uri.EscapeDataString ( lSign )
);
using ( var lHasher = new HMACSHA1 ( Encoding.ASCII.GetBytes( lCKey ) ) ) {
lSign = Convert.ToBase64String (
lHasher.ComputeHash ( Encoding.ASCII.GetBytes ( lSign ) )
);
} // end using
return "OAuth " +
"oauth_consumer_key=\"" + cConsumerKey + "\", " +
"oauth_nonce=\"" + lNonce + "\", " +
"oauth_timestamp=\"" + lTimes + "\", " +
"oauth_signature_method=\"" + cOAuthSignMethod + "\", " +
"oauth_signature=\"" + lSign + "\", " +
"oauth_version=\"" + cOAuthVersion + "\"";
} // end _get_auth
public static void Main ( string[] args ) {
const string lURL = cURL + "?" + cWeatherID + "&" + cUnitID +"&format=" + cFormat;
var lClt = new WebClient ();
lClt.Headers.Set ( "Content-Type", "application/" + cFormat );
lClt.Headers.Add ( "X-Yahoo-App-Id", cAppID );
lClt.Headers.Add ( "Authorization", _get_auth () );
Console.WriteLine( "Downloading Yahoo weather report . . ." );
byte[] lDataBuffer = lClt.DownloadData ( lURL );
string lOut = Encoding.ASCII.GetString ( lDataBuffer );
Console.WriteLine ( lOut );
Console.Write ( "Press any key to continue . . . " );
Console.ReadKey ( true );
} // end Main
} // end YWSample
@turgaybudak
Copy link

if you wanna use nuget api
https://www.nuget.org/packages/SimpleYahooWeatherForecast/1.0.4 download and install

SimpleYahooWeatherApi
Weather forecast for Yahoo Weather Apps api Sing in https://developer.yahoo.com/ and create App

Your Project // add using using SimpleYahooWeatherForecast;

//info cWeatherID search in http://woeid.rosselliot.co.nz/lookup/nevsehir //get Get Forecast

// This Code var Forecasts = new WeatherForecast().GetWeatherForecast("your-cAppID", "your-cConsumerKey", "your-cApcConsumerSecretpID", "cWeatherID");

@Oncorporation
Copy link

Why does this not work with location?

@kebingyu
Copy link

kebingyu commented Feb 7, 2019

Please note line 41 as the order of the parameters matter. So if for instance you are replacing woeid with location, please make sure the parameters in lSign is in the right order, i.e., you can't just simply use location=sunnyvale,ca for the value of cWeatherID and hope it works. lSign needs to be re-ordered whenever a new parameter is added or an old parameter is replaced.

@abdulkhaliqsixlogics
Copy link

Please note line 41 as the order of the parameters matter. So if for instance you are replacing woeid with location, please make sure the parameters in lSign is in the right order, i.e., you can't just simply use location=sunnyvale,ca for the value of cWeatherID and hope it works. lSign needs to be re-ordered whenever a new parameter is added or an old parameter is replaced.

I resort the order for "location=sunnyvale,ca" but it can't works for me. can you share correct resort order for location?

@nawabanjum
Copy link

nawabanjum commented Mar 12, 2019

I have test this with location name.
please check my sample code.

public class CheckWeatherDetail
{

    public static string TestWeather()
    {
        const string url = cURL + "?location=sunnyvale" + "&" + cUnitID + "&format=" + cFormat;
        using (var client = new WebClient())
        {
            string responseText = string.Empty;                 try
            {
                string headerString = _get_auth();

                WebClient webClient = new WebClient();
                webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
                webClient.Headers[HttpRequestHeader.Authorization] = headerString;
                webClient.Headers.Add("X-Yahoo-App-Id", cAppID);                   
                byte[] reponse = webClient.DownloadData(url);
                string lOut = Encoding.ASCII.GetString(reponse);
            }
            catch (WebException exception)
            {
                if (exception.Response != null)
                {
                    var responseStream = exception.Response.GetResponseStream();
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseText = reader.ReadToEnd();
                           
                            
                            return responseText;
                        }
                    }
                }

            }
            return string.Empty;
        }
    }

    const string cURL = "https://weather-ydn-yql.media.yahoo.com/forecastrss";
    const string cAppID = "YOurKEY";
    const string cConsumerKey = "YourcConsumerKey";
    const string cConsumerSecret = "YourcConsumerSecret";
    const string cOAuthVersion = "1.0";
    const string cOAuthSignMethod = "HMAC-SHA1";
    const string cWeatherID = "sunnyvale";  // Amsterdam, The Netherlands
    const string cUnitID = "u=c";           // Metric units
    const string cFormat = "json";

    static string _get_timestamp()
    {
        TimeSpan lTS = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        return Convert.ToInt64(lTS.TotalSeconds).ToString();
    }  // end _get_timestamp

    static string _get_nonce()
    {
        return Convert.ToBase64String(
         new ASCIIEncoding().GetBytes(
          DateTime.Now.Ticks.ToString()
         )
        );
    }  // end _get_nonce

    // NOTE: whenever the value of a parameter is changed, say cUnitID "u=c" => "location=sunnyvale,ca"
    // The order in lSign needs to be updated, i.e. re-sort lSign
    // Please don't simply change value of any parameter without re-sorting.
    static string _get_auth()
    {
        string retVal;
        string lNonce = _get_nonce();
        string lTimes = _get_timestamp();
        string lCKey = string.Concat(cConsumerSecret, "&");
        string lSign = string.Format(  // note the sort order !!!
         "format={0}&" +
         "location={1}&"+
         "oauth_consumer_key={2}&" +
         "oauth_nonce={3}&" +
         "oauth_signature_method={4}&" +
         "oauth_timestamp={5}&" +
         "oauth_version={6}&" +
         "{7}",
         cFormat,
         cWeatherID,
         cConsumerKey,
         lNonce,
         cOAuthSignMethod,
         lTimes,
         cOAuthVersion,
         cUnitID
        
        );

        lSign = string.Concat(
         "GET&", Uri.EscapeDataString(cURL), "&", Uri.EscapeDataString(lSign)
        );

        using (var lHasher = new HMACSHA1(Encoding.ASCII.GetBytes(lCKey)))
        {
            lSign = Convert.ToBase64String(
             lHasher.ComputeHash(Encoding.ASCII.GetBytes(lSign))
            );
        }  // end using

        return "OAuth " +
               "oauth_consumer_key=\"" + cConsumerKey + "\", " +
               "oauth_nonce=\"" + lNonce + "\", " +
               "oauth_timestamp=\"" + lTimes + "\", " +
               "oauth_signature_method=\"" + cOAuthSignMethod + "\", " +
               "oauth_signature=\"" + lSign + "\", " +
               "oauth_version=\"" + cOAuthVersion + "\"";

    }  // end _get_auth
}

@abdulkhaliqsixlogics
Copy link

here is the complete example of Yahoo weather by location name.

https://github.com/abdulkhaliqsixlogics/Yahoo-Weather-/blob/master/YahooWeatherSample.cs

@mcstar007
Copy link

Hi, maybe someone knows how to download weather data by parameters lat and lon?

@praveendotnet
Copy link

how to download weather data by ZIP and LatLong?

@zandiarash
Copy link

retVal is not used here
So we do not need it.
You may update from my fork

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment