无法查询Yahoo! Fantasy Sports API

时间:2015-09-28 04:10:50

标签: c# asp.net yql

我试图从雅虎提取细节!使用OAuth2.0的Fantasy Sports API。我使用YQL查询access_token。我的代码

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
    }
}

我收到需要授权状态消息。

我认为必须对我的请求标题执行某些操作。有人可以帮我理解为什么我的请求在这里被拒绝了吗?

2 个答案:

答案 0 :(得分:3)

雅虎!有两个OAuth授权流程

  1. 双腿流
  2. 三条腿流程
  3. 雅虎注意到,

      

    大多数Fantasy API数据都依赖于三脚架OAuth   数据特定于某个Yahoo!用户。但是,你可以使用   两条OAuth,用于请求纯粹的公共数据。双腿OAuth   有效地归结为在不设置访问权限的情况下发出请求   令牌通过默认的PHP OAuth库,或有效地使用您的   消费者密钥/秘密作为令牌。

    所以我们应该按照Yahoo!中的描述进行three-legged flow of OAuth authorization文档。在授权流程结束时,您将获得oauth_tokenoauth_token_secret

    雅虎已在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。要纠正你必须这样做。

      

    第199行(在NormalizeRequestParameters方法中)必须从:

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

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

    快乐的编码!

答案 1 :(得分:2)

我建议你没有正确收到access_token。这就是你在服务器上调用Authorization Required的原因。

您需要检查获得access_token

的代码