如何访问 NFL 的 API?

问题描述 投票:0回答:3

我一直在尝试访问或设法访问 NFL.com 的数据,但尚未找到。这些网站上有公共文档:

https://api.nfl.com/docs/identity/oauth2/index.html

但是这些文档没有告诉您如何获取客户端 ID 或客户端密钥。

我也尝试过:

http://api.fantasy.nfl.com/v2/docs

文档显示您需要发送电子邮件至 [email protected] 才能获取应用密钥。我不久前发送了一封电子邮件并进行了跟进,但没有收到任何回复。

您可以向这些 API 发送请求,他们会回复告诉您您的凭据无效。

您在这方面取得了成功吗?难道我做错了什么?这些网站已经过时了吗?

编辑:我于 2015 年 10 月 30 日给他们发了电子邮件

rest oauth
3个回答
26
投票

虽然我在 api.nfl.com 方面没有取得任何成功,但我可以从 api.fantasy.nfl.com 获取一些数据。您应该具有对所有 /players/* 端点的读取访问权限(例如 http://api.fantasy.nfl.com/v1/players/stats?statType=seasonStats&season=2010&week=1&format=json)。我认为您需要联盟端点和写入端点的身份验证令牌。

您多久前给他们发电子邮件了?

编辑: 我给 NFL 发了电子邮件,他们是这样说的:“我们已将您的 API 请求传递给我们的产品和战略团队。NFL.com Fantasy API 可根据 NFL 的每次使用情况而提供。合作伙伴。我们的团队会审核其他请求,但我们的 API 通常无法供外部使用。”


0
投票

您可以复制在 Nfl.com 中生成客户端 JWT 令牌的体验,方法是打开 chrome 检查器并转到 nfl.com,然后清除应用程序本地存储和网络控制台,刷新页面,然后仅观看线路上的响应以及它如何发行代币。

我认为他们在发行令牌的方式上可能存在一些安全漏洞,因为他们将 clientId 和 clientSecret 发送给最终用户,然后将其发布回服务器创建 JWT,而他们可能应该有某种生成令牌的终点,并且还具有一些站点来源保护,但是嘿,这使得 API 的使用变得更容易一些。

用途:

        using (var client = await WebClientFactory.Create())
        {
            foreach (var week in all)
            {
                var url = $"https://api.nfl.com/football/v1/games?season={year}&seasonType=REG&week={week}&withExternalIds=true";
                var content = await client.DownloadStringTaskAsync(url);

                var obj = JsonConvert.DeserializeObject<SeasonStripV2>(content);

               // do so0mething here
            }
        }

肉和土豆:

public class WebClientFactory
{
    static WebClientFactory()
    {
        ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) =>
        {
            Console.WriteLine(er);
            // I had some cert troubles you may need to fiddle with this if you get a 405
            // if (c.Subject?.Trim() == "CN=clubsweb.san1.nfl.com")
            // {
            //     return true;
            // }
            
            Console.WriteLine(c);
            return false;
        };
    }
    public static async Task<WebClient> Create()
    {
        var clientInfo = new
                         {
                             clientId = "e535c7c0-817f-4776-8990-56556f8b1928",
                             clientKey = "4cFUW6DmwJpzT9L7LrG3qRAcABG5s04g",
                             clientSecret = "CZuvCL49d9OwfGsR",
                             deviceId = "1259aca6-3793-4391-9dc3-2c4b4c96abc5",
                             useRefreshToken = false
                         };

        var clientUploadInfo = JsonConvert.SerializeObject(clientInfo);
        var webRequest = WebRequest.CreateHttp("https://api.nfl.com/identity/v1/token/client");
        webRequest.Accept = "*/*";
        webRequest.ContentType = "application/json";
        webRequest.Method = WebRequestMethods.Http.Post;
        await WriteBody(webRequest, clientUploadInfo);
        var result = await GetResult(webRequest);
        var tokenWrapper = JsonConvert.DeserializeObject<RootV2>(result);

        var client = new WebClient();
        client.Headers.Add("Authorization", $"Bearer {tokenWrapper.accessToken}");
        return client;
    }

    private static async Task WriteBody(HttpWebRequest webRequest, string clientUploadInfo)
    {
        using (var stream = webRequest.GetRequestStream())
        {
            using (var sw = new StreamWriter(stream))
            {
                await sw.WriteAsync(clientUploadInfo);
            }
        }
    }

    private static async Task<string> GetResult(HttpWebRequest webRequest)
    {
        using (var response = await webRequest.GetResponseAsync())
        {
            return await GetResult((HttpWebResponse) response);
        }
    }

    private static async Task<string> GetResult(HttpWebResponse webResponse)
    {
        using (var stream = webResponse.GetResponseStream())
        {
            using (StreamReader sr = new StreamReader(stream))
            {
                return await sr.ReadToEndAsync();
            }
        }
    }
    private class RootV2
    {
        public string accessToken { get; set; }
        public int expiresIn { get; set; }
        public object refreshToken { get; set; }
    }
}

请注意,您还可以通过调用此端点来获取令牌:

POST "https://api.nfl.com/v1/reroute"
BODY: "device_id=5cb798ec-82fc-4ba0-8055-35aad432c492&grant_type=client_credentials"

并添加这些标题:

 client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
 client.Headers["X-Domain-Id"] = "100";

-4
投票

Hooks Data 为包括 NFL 在内的美国主要体育赛事提供实时 API。

1)在这里获取 API KEY:https://www.hooksdata.io/signup?invite=SM4555

2)订阅足球比赛:

curl -H "Content-type: application/json" -d '{
"query": "SELECT * FROM NFLGames WHERE away_team.team_name = 'New England Patriots' OR home_team.team_name = 'New England Patriots' AND start_datetime.countdown = 3600"}' 'http://api.hooksdata.io/v1/subscriptions'

文档:https://www.hooksdata.io/docs/api/datasources/nflgames/

3) 可选:添加要获取数据的 Webhooks URL:https://www.hooksdata.io/webhooks

4)使用获取端点拉取数据https://www.hooksdata.io/docs/api/api-reference/#query-datasource

5)获取JSON格式的所有数据:

{
"matches_count": 1,
"results": [
    {
        "_entity_type": "NFLGame",
        "_id": "NFLGame_400999173",
        "away_score": null,
        "away_team": {
            "_entity_type": "NFLTeam",
            "_id": "NFLTeam_NE",
            "acronym": "NE",
            "division": "AFC East",
            "id": "NFLTeam_NE",
            "team_name": "New England Patriots"
        },
        "game_id": "400999173",
        "home_score": null,
        "home_team": {
            "_entity_type": "NFLTeam",
            "_id": "NFLTeam_PHI",
            "acronym": "PHI",
            "division": "NFC East",
            "id": "NFLTeam_PHI",
            "team_name": "Philadelphia Eagles"
        },
        "link": "http://espn.go.com/nfl/game?gameId=400999173",
        "start_datetime": null,
        "status": "FUTURE"
    }
]

}

© www.soinside.com 2019 - 2024. All rights reserved.