R-身份验证问题中来自职责调用API的API调用

R-身份验证问题中来自职责调用API的API调用,r,node.js,api,authentication,R,Node.js,Api,Authentication,我正在尝试调用任务调用API中球员列表的统计信息。此API首先需要登录网站。登录后,用户可以使用职责调用API查看玩家的统计信息。例如,可以通过以下链接查看战区拖缆90的统计信息: 如果我从该网站登录并尝试查看玩家的统计数据和相关的json,我可以通过浏览器进行操作。然而,在R中这似乎并不简单 我尝试使用httr包中的GET功能登录,如下所示 respo <- GET('https://profile.callofduty.com/cod/login', authenticate('USE

我正在尝试调用任务调用API中球员列表的统计信息。此API首先需要登录网站。登录后,用户可以使用职责调用API查看玩家的统计信息。例如,可以通过以下链接查看战区拖缆90的统计信息:

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

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

respo <- GET('https://profile.callofduty.com/cod/login', authenticate('USER', 'PWD'))
data <- fromJSON('https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/psn/gamer/savyultras90/profile/type/wz')
我收到错误消息“不允许:未验证”


我如何在一个网站上进行身份验证,并保持登录状态以从依赖该身份验证的API调用?

我昨天对此进行了尝试,但最终取得了一些进展。问题是您必须获得身份验证令牌。这里可以遵循以下步骤:但在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)


#领取代币---------------------------------------------------------------

resp看到我最近不得不为战区开发一个PHPAPI,我也许能够指导您如何处理这个问题。但首先要说几句话:

  • 如果您想要请求每个玩家的数据,您需要使用适当的平台对每个用户进行单独的身份验证
  • API请求的数量有限制
  • 职责召唤API遵循严格的使用指南,只能由注册合作伙伴使用。使用API可能导致索赔,最终导致诉讼:
  • 没有公开的API文档,API在过去也发生了变化,打破了一些第三方工具
然而,该过程涉及以下几个步骤:

注册拨打电话的设备

json正文的格式为
{“deviceId”:“INSERT_ID_HERE”}
这将返回一个带有authHeader的响应,我们将在下一次调用中将其用作令牌

使用Activision凭据登录

设置以下标题:

Authorization: "INSERT_AUTHHEADER_HERE"
x_cod_device_id: "INSERT_PREVIOUSLY_USED_DEVICEID_HERE"
这将生成一个数据集,我们将从中保存以下数据: rtkn,表演SSO和atkn

为数据调用所需的API

我们现在拥有进行API调用所需的所有数据

对于每个请求,我们将提交3个标题:

  • 授权:“在此处插入\u AUTHHEADER\u”
  • x_cod_device_id:“在此插入以前使用过的设备id”
  • Cookie:
    ACT\u SSO\u LOCALE=en\u GB;国家=GB;API_CSRF_令牌=**生成_CSRF_令牌**;rtkn=**rtkn_此处**;ACT_SSO_COOKIE=**此处ACT_SSO_COOKIE**;atkn=**atkn_此处**

  • 如需更多参考,您可以随时查看成功实现API的or。

    如果登录步骤不适用于尝试此操作的任何人,那是因为身份验证头需要是
    授权:“承载身份验证头\u令牌”