【问题标题】:How do you access the NFL's API's?您如何访问 NFL 的 API?
【发布时间】:2016-02-03 00:32:07
【问题描述】:

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

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

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

我也试过了:

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

文档说您需要发送电子邮件至 Fantasy.football@nfl.com 以获取应用程序密钥。不久前我发了一封电子邮件并进行了跟进,但我没有收到任何回复。

您可以向这些 API 发送请求,它们会响应并告诉您您的凭据无效。

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

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

【问题讨论】:

标签: api rest web oauth


【解决方案1】:

虽然我在 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 通常无法供外部使用。”

【讨论】:

  • 你是对的。理想情况下,我希望能够访问来自用户联盟的信息,我确实需要一个 Auth 令牌来做到这一点。看起来他们并不容易获得一个
  • 谢谢。如果可以的话,我会将此评论标记为答案。这就说得通了。 api 文档是公开的,这有点令人惊讶。
  • 有谁知道统计数据是什么?没有标题
【解决方案2】:

您可以复制在 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";

【讨论】:

    【解决方案3】:

    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) 使用 fetch 端点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"
        }
    ]
    

    }

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多