2015-09-28 6 views
3

Я пытаюсь вытащить детали из Yahoo! Fantasy Sports API с использованием OAuth2.0. Я получил access_token для запроса с использованием YQL. Мой кодНе удалось запросить Yahoo! Fantasy Sports API

using (var client = new System.Net.WebClient()) 
{ 
    client.Headers.Add("Authorization", "Bearer " + response.access_token); 
    var query = "select%20*%20from%20fantasysports.games%20where%20game_key%3D'nfl'"; 
    Response.Write(query); 
    var url = String.Format("https://query.yahooapis.com/v1/yql?q={0}&format=json&diagnostics=true&callback=", query); 
    output = client.DownloadString(url); 
} 

Мой ответ

{ 
    "query": { 
     "count": 0, 
     "created": "2015-09-27T17:39:48Z", 
     "lang": "en-US", 
     "diagnostics": { 
      "publiclyCallable": "true", 
      "url": { 
       "execution-start-time": "4", 
       "execution-stop-time": "137", 
       "execution-time": "133", 
       "http-status-code": "401", 
       "http-status-message": "Authorization Required", 
       "content": "http://fantasysports.yahooapis.com/fantasy/v2/games;game_keys=nfl" 
      }, 
      "user-time": "138", 
      "service-time": "133", 
      "build-version": "0.2.240" 
     }, 
     "results": null 
    } 
} 

Я получаю сообщение о состоянии требуется авторизация.

Я думаю, что он должен что-то сделать с моим заголовком запроса. Может кто-нибудь помочь мне понять, почему мой запрос отклонен здесь?

+0

'Response.Write (query);' выглядит очень изворотливым. –

+0

@ RichardSchneider: нет другого более простого способа Yahoo! не позволяйте мне тестировать локально для API Fantasy Sports – naveen

+0

@naveen, вы получили это, чтобы работать, чтобы вы могли публиковать данные из Yahoo Sports с помощью C#? Я работаю над этим, но считаю это очень сложным. Я пытаюсь запустить эту команду YQL: выберите * из fantasysports.players, где game_key = 371, и это предполагается как команда RESTful, которую я использую: https://query.yahooapis.com/v1/public/yql?q=select % 20 *% 20from% 20fantasysports.players% 20where% 20game_key% 3D371 & diagnostics = true до сих пор ваш пост здесь кажется самым перспективным, но я чувствую, что вы не указали весь свой код, только фрагмент, и поэтому я не уверен, как для продолжения – dave317

ответ

2

Yahoo! имеет два OAuth авторизация Потоки

  1. Two турецкий поток
  2. Три ноги поток

Yahoo отмечает,

Большинство данных API Фантазии опирается на 3 ножках OAuth, как много данных относится к определенному Yahoo! пользователь. Тем не менее, вы можете использовать 2-legged OAuth для запроса чисто публичных данных. 2-legged OAuth эффективно сводится к запросу без установки доступа к токенам через библиотеку PHP OAuth по умолчанию или эффективно используя ваш ключ/секретный ключ/ .

Поэтому мы должны пойти за three-legged flow of OAuth authorization, как это описано в Yahoo! документация. В конце потока авторизации вы получите oauth_token и oauth_token_secret.

Yahoo предоставил этот код в C# (Link here).

public static string GetUserDataFromYahoo(string requestEndPoint, string token, string tokenSecret) 
{ 
    var data = String.Empty; 
    var uri = new Uri(requestEndPoint); 
    string url, param; 
    var oAuth = new OAuthBase(); 
    var nonce = oAuth.GenerateNonce(); 
    var timeStamp = oAuth.GenerateTimeStamp(); 
    var signature = oAuth.GenerateSignature(
     uri, 
     consumerKey, 
     consumerSecret, 
     token, 
     tokenSecret, 
     "GET", 
     timeStamp, 
     nonce, 
     OAuthBase.SignatureTypes.HMACSHA1, 
     out url, 
     out param); 
    data = String.Format("{0}?{1}&oauth_signature={2}", url, param, signature); 
    var requestParametersUrl = String.Format("{0}?{1}&oauth_signature={2}", url, param, signature); 
    var request = WebRequest.Create(requestParametersUrl); 
    using (var response = request.GetResponse()) 
    using (Stream dataStream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(dataStream)) 
    { 
     data = reader.ReadToEnd(); 
    } 
    return data; 
} 

Этот код использует этот OAuthBase.cs class.

И когда вы используете этот код, вы получите

OST_OAUTH_SIGNATURE_INVALID_ERROR

Это происходит потому, OAuthBase.cs имеет bug that's been noted here. Чтобы исправить это, вам нужно это сделать.

Line 199 (в NormalizeRequestParameters метод) должен измениться от:

sb.AppendFormat("{0}={1}", p.Name, p.Value); 

в

sb.AppendFormat("{0}={1}", UrlEncode(p.Name), UrlEncode(p.Value)); 

Счастливый кодирования!

+0

, разместив это для других кодеров, которые могут столкнуться с этими проблемами, вытаскивая данные из yahoo. – naveen

+0

Ссылка OAuthBase.cs мертва, попробуйте https://code.google.com/archive/p/oauth/issues/138#c4 –

+1

Пожалуйста, объясните, как использовать GetUserDataFromYahoo. Вы говорите, что используете его в сочетании с кодом Yahoo? Как третий этап? –

2

Я предлагаю вам не правильно получить access_token. Вот почему вы получаете Authorization Required при звонке на сервер.

Вы должны проверить свой код, который получает access_token

+0

Я получаю access_token, refresh_token все это. Это что-то с призывом. – naveen

+0

Да. отчасти это было связано с этим. спасибо – naveen