2016-03-29 3 views
2

Я не могу пройти аутентификацию с помощью API погоды Yahoo через следующий код. Что я делаю неправильно? Я получаю 401 - Несанкционирован. Пробовал через xml.weather.yahoo.com - то же самое. Я немного устал от этого, поэтому любая помощь будет оценена по достоинству.Yahoo API API API, использующий Oauth C# или VB.net

КОД:

Public Function getData() As String 
    Dim resp As String = "" 
    Try 
     Dim consumerKey As String = "MY PRIVATE API KEY STRING GOES HERE" 
     Dim consumerSecret As String = "SECRET WAS PLACED HERE" 
     Dim uri = New Uri("https://query.yahooapis.com/v1/yql?q=SELECT%20*%20FROM%20weather.bylocation%20WHERE%20location%3D%27Kefar-Weradim%27%20AND%20unit%3D%22c%22&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys") 
     Dim url As String, param As String 
     Dim oAuth = New OAuthBase() 
     Dim nonce = oAuth.GenerateNonce() 
     Dim timeStamp = oAuth.GenerateTimeStamp() 
     Dim signature = oAuth.GenerateSignature(uri, consumerKey, consumerSecret, String.Empty, String.Empty, "GET", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, url, param) 
     Using _webResponse As WebResponse = WebRequest.Create(String.Format("{0}?{1}&oauth_signature={2}", url, param, signature)).GetResponse() 
      Using reader As StreamReader = New StreamReader(_webResponse.GetResponseStream()) 
       resp = reader.ReadToEnd() 
      End Using 
     End Using 
    Catch ex As Exception 
     resp = "Error: " & ex.Message 
    End Try 
    Return resp 
End Function 
+0

Я вижу странное поведение с сайта apiahoo. С похожим кодом мой код возвращает 401 - Несанкционирован в ~ 80% случаях. В ~ 10% случаев он получает данные. (остальные 10% для других случайных сбоев) – jing

ответ

0

ОК, так что я решил это сам. Решение немного отличается и не требует аутентификации. То, что я и многие другие пытались сделать, - это заставить «погоду за местоположением» работать после того, как Yahoo изменила свою политику аутентификации. Однако «прогноз погоды» не требует этого. Итак, вот обходной путь для проблемы выше.

 Private Function GetDSfromYH() As DataSet 
    Dim surl As String = "" 
    Dim ds As New DataSet 
    Dim sbResult As New StringBuilder 
    Try 
     'surl = "https://query.yahooapis.com/public/v1/yql?q=SELECT%20*%20FROM%20weather.bylocation%20WHERE%20location%3D%27Kefar-Weradim%27%20AND%20unit%3D%22c%22&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"' 
     surl = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%3D1967578%20and%20u%3D%27c%27&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" 
     ds.ReadXml(surl) 
     Return ds 

    Catch ex As Exception 
     sbResult.Append("<div>Exception in function 'GetDSfromYH': " & ex.Message & " </div>") 
     sbResult.Append("<div style='max-width: 200px;'>Oops, there is a problem with the service. Please refresh the page or try later.</div>") 
     divResults.Controls.Add(New LiteralControl(sbResult.ToString())) 
    End Try 


End Function 

Как вы можете видеть, я оставил старую строку URL, прокомментированную для справки. Новая строка URL содержит другой подход, с вызовом метода weather.forecast и с использованием WOID. Вы можете найти ваш here. Важно: нет необходимости использовать какие-либо методы для кодирования URL-адреса перед его отправкой. Вы можете использовать его «As-Is». URL-адрес, используемый в моей функции, содержит celsius в разделе% 20u% 3D% 27c% 27, а «u» - как единицы, а «c» - цели. Вы можете заменить «c» на «f», если это необходимо. Функция возвращает DataSet, содержащий все части прогноза, каждый из которых является собственным, который может использоваться по мере необходимости. Удачи друзьям.