Исключение неавторизованного доступа при использовании Yahoo Weather API

Получил это, модуль должен быть импортирован по его полному пути, а также для политики выполнения как для 64-разрядной PowerShell, так и для 32-разрядной PowerShell необходимо установить значение Unrestricted (или что-то другое, кроме ограниченного в зависимости от вашего случая) , Вот код:

static void Main(string[] args)
{
    InitialSessionState initial = InitialSessionState.CreateDefault();
    initial.ImportPSModule(new string[] {"C:\\Program Files\\Common Files\\Microsoft Lync Server 2010\\Modules\\Lync\\Lync.psd1"} );
    Runspace runspace = RunspaceFactory.CreateRunspace(initial);
    runspace.Open();     
    PowerShell ps = PowerShell.Create();
    ps.Runspace = runspace;
    ps.Commands.AddCommand("Get-csuser");

    foreach (PSObject result in ps.Invoke())
    {
        Console.WriteLine(result.Members["Identity"].Value);
    }
}
0
задан Tejashri Sawashe 17 January 2019 в 07:50
поделиться

5 ответов

//Here Is The Working Code :

public class YWSample
{
    const string cURL = "https://weather-ydn-yql.media.yahoo.com/forecastrss";
    const string cAppID = "Your-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";

    //Code to get timestamp
    static string _get_timestamp()
    {
        var lTS = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        return Convert.ToInt64(lTS.TotalSeconds).ToString();
    }  

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

    static string _get_auth()
    {
        var lNonce = _get_nonce();
        var lTimes = _get_timestamp();
        var lCKey = string.Concat(cConsumerSecret, "&");
        var lSign = $"format={cFormat}&" + $"oauth_consumer_key={cConsumerKey}&" + $"oauth_nonce={lNonce}&" +
                       $"oauth_signature_method={cOAuthSignMethod}&" + $"oauth_timestamp={lTimes}&" +
                       $"oauth_version={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("Yahoo-App-Id", cAppID);
        lClt.Headers.Add("Authorization", _get_auth());

        Console.WriteLine("Downloading Yahoo weather report . . .");

        var lDataBuffer = lClt.DownloadData(lURL);

        var lOut = Encoding.ASCII.GetString(lDataBuffer);

        Console.WriteLine(lOut);

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }//end of Main

}  // end YWSample 
0
ответ дан Tejashri Sawashe 17 January 2019 в 07:50
поделиться

Я думаю, твой код в порядке. Проблема заключается в плохо реализованном декодировании URL на стороне Yahoo. Java URL Encode кодируется прописными буквами, а .net HTTPUtility.URLEncode - строчными. Я создал метод расширения для строки, которая исправит проблему и закодирует URL так, чтобы API-интерфейс Yahoo мог справиться с этим. После этого все работало хорошо (у меня была та же проблема, что и у вас).

  <Extension>
    Public Function UppercaseURLEncode(ByVal sourceString As String) As String

        Dim temp As Char() = HttpUtility.UrlEncode(sourceString).ToCharArray()

        For i As Integer = 0 To temp.Length - 2

            If temp(i).ToString().Equals("%", StringComparison.OrdinalIgnoreCase) Then

                temp(i + 1) = Char.ToUpper(temp(i + 1))
                temp(i + 2) = Char.ToUpper(temp(i + 2))

            End If

        Next

        Return New String(temp)

    End Function
0
ответ дан DonnieDarko 17 January 2019 в 07:50
поделиться
public string appId = "Your app-id";
        public string consumerKey = "Your-consumer key";
        public string consumerSecret = "Your Consumer Secret key";

        // GET: api/Random
        [HttpGet("{CityName}")]
        public async Task<IActionResult> GetAsync([FromUri] string CityName)
        {




        string urlss = "https://weather-ydn-yql.media.yahoo.com/forecastrss?location=";
            string url = urlss + CityName+ "&format=json&u=c";
            JObject jresult;
            using (var client = new HttpClient())
            {
                try
                {

                    var webClient = new WebClient();
                    webClient.Headers.Add(AssembleOAuthHeader());
                    var d = webClient.DownloadString(url);
                    jresult = JObject.Parse(d);
                    var json_jsonstring = Newtonsoft.Json.JsonConvert.SerializeObject(jresult);
                    return Ok(json_jsonstring);

                }
                catch (HttpRequestException httpRequestException)
                {
                    return BadRequest($"Error getting weather from Yahoo Weather: {httpRequestException.Message}");
                }


            }


        }

        public string AssembleOAuthHeader()
        {
            return "Authorization: OAuth " +
                   "realm=\"yahooapis.com\"," +
                   "oauth_consumer_key=\"" + consumerKey + "\"," +
                   "oauth_nonce=\"" + Guid.NewGuid() + "\"," +
                   "oauth_signature_method=\"PLAINTEXT\"," +
                   "oauth_timestamp=\"" + ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / (1000 * 10000)) +
                   "\"," +
                   "oauth_version=\"1.0\"," +
                   "oauth_signature=\"" + consumerSecret + "%26\"," +
                   "oauth_callback=\"oob\"";

        }
0
ответ дан TheOfficeGamer 17 January 2019 в 07:50
поделиться

Для новой аутентификации Yahoo вы можете использовать эту библиотеку Python Yahoo-погода

0
ответ дан Hongarc 17 January 2019 в 07:50
поделиться

В какой строке вы получаете сообщение об ошибке? GetResponse () возвращает его? Я думаю, что учетные данные, которые вы используете (appId, consumerKey, consumerSecret), являются недействительными!

0
ответ дан Dr. K 17 January 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: