雅虎幻想体育API

时间:2018-07-20 18:24:28

标签: oauth-2.0 yahoo yahoo-api

有人还在使用Yahoo Fantasy Sports API吗?我有一个去年使用过的应用程序,根本没有更改我的代码,现在当我尝试运行它时,它返回500内部错误。

我以前是通过YQL控制台测试事物的,但现在不再可用。

https://developer.yahoo.com/yql/

任何人都知道如何在上方的该网站上进行身份验证的请求吗?

我的感觉是,雅虎刚刚停止对他们的FantasySports API的支持,我将不得不寻找我认为的其他解决方案。

想知道那里是否还有其他人以前曾使用过此API,现在是否成功使用它。

1 个答案:

答案 0 :(得分:0)

我弄清楚了如何使用C#核心和Yahoo的API。非常感谢this guy

  1. 从yahoo获取您的api密钥等。

进行控制器操作,将其重定向到请求URL,如下所示:

public IActionResult Test()
        {
            yo.yKey = {your Yahoo API key};
            yo.ySecret = {your Yahoo API secret};
            yo.returnUrl = {your return URL as set in the API setup, example "https://website.com/home/apisuccess"};

            var redirectUrl = "https://api.login.yahoo.com/oauth2/request_auth?client_id=" + yo.yKey + "&redirect_uri=" + yo.returnUrl + "&response_type=code&language=en-us";
            return Redirect(redirectUrl);
        }

这会将您发送到通过Yahoo进行身份验证的网站。身份验证成功后,它将使用名为code的字符串参数将您发送到重定向站点,在示例中为home / apisuccess,因此控制器操作应如下所示:

public async Task<IActionResult> ApiSuccess(string code)
        {        
            List<string> msgs = new List<string>();     //This list just for testing
            /*Exchange authorization code for Access Token by sending Post Request*/
            Uri address = new Uri("https://api.login.yahoo.com/oauth2/get_token");                

            HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            byte[] headerByte = System.Text.Encoding.UTF8.GetBytes(_yKey + ":" + _ySecret);
            string headerString = System.Convert.ToBase64String(headerByte);
            request.Headers["Authorization"] = "Basic " + headerString;

            /*Create the data we want to send*/
            StringBuilder data = new StringBuilder();
            data.Append("client_id=" + _yKey);
            data.Append("&client_secret=" + _ySecret);
            data.Append("&redirect_uri=" + _returnUrl);
            data.Append("&code=" + code);
            data.Append("&grant_type=authorization_code");

            //Create a byte array of the data we want to send
            byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());

            // Set the content length in the request headers  
            request.ContentLength = byteData.Length;

            // Write data  
            using (Stream postStream = await request.GetRequestStreamAsync())
            {
                postStream.Write(byteData, 0, byteData.Length);
            }
            // Get response
            var vM = new yOauthResponse();
            string responseFromServer = "";
            try
            {
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    msgs.Add("Into response");
                    // Get the response stream  
                    StreamReader reader = new StreamReader(response.GetResponseStream());
                    responseFromServer = reader.ReadToEnd();
                    msgs.Add(responseFromServer.ToString());
                    vM = JsonConvert.DeserializeObject<yOauthResponse>(responseFromServer.ToString());
                }
            }
            catch (Exception ex)
            {
                msgs.Add("Error Occured");
            }
            ViewData["Message"] = msgs;
            return View(vM);
        }

请注意,我使用了此模型的json解串器,但是您可以对响应执行任何操作,以从中获取所需的数据。这是我的json模型:

public class yOauthResponse
    {
        [JsonProperty(PropertyName = "access_token")]
        public string accessToken { get; set; }

        [JsonProperty(PropertyName = "xoauth_yahoo_guid")]
        public string xoauthYahooGuid { get; set; }

        [JsonProperty(PropertyName = "refresh_token")]
        public string refreshToken { get; set; }

        [JsonProperty(PropertyName = "token_type")]
        public string tokenType { get; set; }

        [JsonProperty(PropertyName = "expires_in")]
        public string expiresIn { get; set; }
    }

一旦有了这些数据,您需要的主要是access_token,并在控制器操作中按以下方式使用它:

//simple code above removed
    var client = new HttpClient()
                {
                    BaseAddress = new Uri({your request string to make API calls})
                };
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);

                HttpResponseMessage response = await client.GetAsync(requestUri);
                if (response.IsSuccessStatusCode)
                {
                   //do what you will with the response....
                }
                //rest of simple code

希望这对某人有所帮助。编码愉快!