我一直在尝试访问或设法访问 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 日给他们发了电子邮件
虽然我在 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 通常无法供外部使用。”
您可以复制在 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";
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"
}
]
}