r - 来自 R 中使命召唤 API 的 API 调用 - 身份验证问题
问题描述
我正在尝试从使命召唤 API 中调用玩家列表的统计信息。该 API 需要首先登录网站https://profile.callofduty.com/cod/login。登录后,用户可以使用 call-of-duty API 查看玩家的统计数据。例如,来自 Warzone 的流光savyultras90的统计数据可以通过以下链接查看:https ://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/psn/gamer /savyultras90/profile/type/wz。
如果我从网站登录并尝试查看玩家的统计数据和相关的 json,我可以通过浏览器进行操作。然而,这在 R 中似乎并不简单。
我尝试使用包中的GET
功能登录httr
如下
respo <- GET('https://profile.callofduty.com/cod/login', authenticate('USER', 'PWD'))
但是当我尝试访问 api 并使用fromJSON
包中的函数下载 JSON 文件时jsonlite
,如下所示
data <- fromJSON('https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/psn/gamer/savyultras90/profile/type/wz')
我收到错误消息“不允许:未通过身份验证”。
如何在一个网站中进行身份验证并保持登录状态以从依赖该身份验证的 API 调用?
解决方案
看到我最近不得不为 Warzone 开发一个 PHP API,我也许可以指导您如何处理这个问题的正确方向。但首先要注意几点:
- 如果您想请求该玩家的数据,您需要使用适当的平台单独验证每个用户
- API 请求数量有限制
- 《使命召唤》的 API 遵循严格的使用指南,只能由注册合作伙伴使用。使用 API 可能会导致索赔并最终引发诉讼: 链接
- 没有 API 的公开文档,并且 API 过去发生了变化,破坏了几个 3rd 方工具。
然而,该过程涉及如下所述的几个步骤:
注册拨打电话的设备
https://profile.callofduty.com/cod/mapp/registerDevice
带有格式为的 json 正文,{"deviceId":"INSERT_ID_HERE"}
这将返回带有 authHeader 的响应,我们将在接下来的调用中将其用作 Token
使用动视凭据登录
https://profile.callofduty.com/cod/mapp/login
设置以下标题:
Authorization: "INSERT_AUTHHEADER_HERE"
x_cod_device_id: "INSERT_PREVIOUSLY_USED_DEVICEID_HERE"
这将生成一个数据集,我们将从中保存以下数据:rtkn、ACT_SSO_COOKIE 和 atkn。
对数据进行所需的 API 调用
我们现在拥有进行 API 调用所需的所有数据。
对于每个请求,我们将提交 3 个标头:
- 授权:“INSERT_AUTHHEADER_HERE”
- x_cod_device_id:“INSERT_PREVIOUSLY_USED_DEVICEID_HERE”
- 曲奇饼:
ACT_SSO_LOCALE=en_GB;country=GB;API_CSRF_TOKEN=**GENERATE_CSRF_TOKEN**;rtkn=**RTKN_HERE**;ACT_SSO_COOKIE=**ACT_SSO_COOKIE_HERE**;atkn=**ATKN_HERE**
推荐阅读
- python - 将 YAML 文件与列表元素中的覆盖值合并
- html - 将列线添加到 CSS 网格系统
- android - FacebookSdk.sdkInitialize 是在创建的每个活动上调用还是仅在 mainActivity 上调用
- react-native - React-Native setState 不是函数
- android - 不要在打开时自动构建 Android 项目
- arrays - 如何在 Lua 中对多维表进行排序?
- visual-studio - Frameworks\Microsoft.AspNetCore.App 上方的黄色三角形
- selenium - 显示错误 - 未知错误:DevToolsActivePort 文件不存在 - 它是电子应用程序(我使用的是 Windows 操作系统)
- java - 用户输入 - 扫描仪跳过用户输入
- google-apps-script - 使用 GAS,如何在将 TAB 从工作表复制到文档时保持列宽?