API调用来自使命召唤API的R身份验证问题



我正在尝试从API调用一个玩家列表的统计数据。此API要求首先登录网站https://profile.callofduty.com/cod/login.登录后,用户可以使用API调用查看玩家的统计数据。例如,Warzone的拖缆savyultras90的统计数据可以通过以下链接查看:https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/psn/gamer/savyultras90/profile/type/wz.

如果我从网站登录并尝试查看玩家的统计数据和相关的json,我可以通过浏览器进行查看。然而,这在R.中似乎并不简单

我尝试使用httr包中的GET功能登录,如下所示

respo <- GET('https://profile.callofduty.com/cod/login', authenticate('USER', 'PWD'))

但是,当我尝试访问api并使用函数fromJSON从包jsonlite下载JSON文件时,如下所示

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在过去发生了变化,破坏了几个第三方工具

然而,该过程涉及以下几个步骤:

注册进行呼叫的设备

https://profile.callofduty.com/cod/mapp/registerDevice

带有{"deviceId":"INSERT_ID_HERE"}形式的json主体这将返回一个带有authHeader的响应,我们将在下一次调用时将其用作令牌

使用动视凭据登录

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个标题:

  1. 授权:"INSERT_AUTHHEADER_HERE">
  2. x_ cod_;INSERT_PREVIOUSLYUSED_DEVICEID_HERE">
  3. Cookie: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**

如需更多参考,您可以查看成功实现API的Python库或NodeJS库。

我昨天很挣扎,但最终取得了一些进展。问题是您必须获得身份验证令牌。步骤如下:https://documenter.getpostman.com/view/7896975/SW7aXSo5#a37a2e5b-84bb-441d-b978-0fd8d42ffd29,但在R中不可用。

我的代码一开始是有效的,只要你不再进行身份验证(仍在努力找出原因(。基本上,我所做的是翻译链接中的步骤,并从GET:中提取响应中的内容


# Get token ---------------------------------------------------------------
resp <- GET('https://profile.callofduty.com/cod/login')
cookies = c(
'XSRF-TOKEN' = resp$cookies$value[1]
,'new_SiteId' = resp$cookies$value[2]
,'comid' = resp$cookies$value[3]
,'bm_sz' = resp$cookies$value[4]
,'_abck' = resp$cookies$value[5]
# ,'ACT_SSO_COOKIE' = resp$cookies$value[6]
# ,'ACT_SSO_COOKIE_EXPIRY' = resp$cookies$value[7]
# ,'atkn' = resp$cookies$value[8]
# ,'ACT_SSO_REMEMBER_ME' = resp$cookies$value[9]
# ,'ACT_SSO_EVENT' = resp$cookies$value[10]
# ,'pgacct' = resp$cookies$value[11]
# ,'CRM_BLOB' = resp$cookies$value[12]
# ,'tfa_enrollment_seen' = resp$cookies$value[13]
)
headers = c(

)
params = list(
`new_SiteId` = 'cod',
`username` = 'USER',
`password` = 'PWD',
`remember_me` = 'true',
`_csrf` = resp$cookies$value[1]
)
# Authenticate ------------------------------------------------------------
resp_post <- POST('https://profile.callofduty.com/do_login?new_SiteId=cod',
httr::add_headers(.headers=headers),
query = params,
httr::set_cookies(.cookies = cookies))

cookies = c(
'XSRF-TOKEN' = resp_post$cookies$value[1]
,'new_SiteId' = resp_post$cookies$value[2]
,'comid' = resp_post$cookies$value[3]
,'bm_sz' = resp_post$cookies$value[4]
,'_abck' = resp_post$cookies$value[5]
,'ACT_SSO_COOKIE' = resp_post$cookies$value[6]
,'ACT_SSO_COOKIE_EXPIRY' = resp_post$cookies$value[7]
,'atkn' = resp_post$cookies$value[8]
,'ACT_SSO_REMEMBER_ME' = resp_post$cookies$value[9]
,'ACT_SSO_EVENT' = resp_post$cookies$value[10]
,'pgacct' = resp_post$cookies$value[11]
,'CRM_BLOB' = resp_post$cookies$value[12]
,'tfa_enrollment_seen' = resp_post$cookies$value[13]
)
headers = c(

)
params = list(
`new_SiteId` = 'cod',
`username` = 'USER',
`password` = 'PWD',
`remember_me` = 'true',
`_csrf` = resp_post$cookies$value[1]
)
# Get data:
resp_psn <- httr::GET(url = 'https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/psn/gamer/savyultras90/profile/type/wz',
httr::add_headers(.headers=headers),
query = params,
httr::set_cookies(.cookies = cookies))
resp_psn_json <- content(resp_psn)

如果你已经设法解决了这个问题,请告诉我!

最新更新