【问题标题】:API call from Call of Duty API in R - authentication problem来自 R 中使命召唤 API 的 API 调用 - 身份验证问题
【发布时间】:2021-02-02 02:36:52
【问题描述】:

我正在尝试从使命召唤 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 中似乎并不简单。

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

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

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

data <- fromJSON('https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/psn/gamer/savyultras90/profile/type/wz')

我收到错误消息“不允许:未通过身份验证”。

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

【问题讨论】:

    标签: r node.js api authentication


    【解决方案1】:

    我昨天为此苦苦挣扎,但最终取得了一些进展。问题是您必须获取身份验证令牌。可以在此处执行这些步骤: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)
    
    

    如果您已经设法解决此问题,请告诉我!

    【讨论】:

      【解决方案2】:

      看到我最近不得不为 Warzone 开发一个 PHP API,我或许可以指导您正确处理这个问题。但首先要说几句:

      • 如果您想请求该玩家的数据,您需要使用适当的平台分别对每个用户进行身份验证
      • API 请求数量有限制
      • 使命召唤 API 遵循严格的使用指南,只能由注册合作伙伴使用。使用 API 可能会导致索赔并最终引发诉讼: link
      • 没有关于 API 的公开文档,而且 API 过去发生了变化,破坏了几个第 3 方工具。

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

      注册拨打电话的设备

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

      带有{"deviceId":"INSERT_ID_HERE"}形式的json主体 这将返回带有 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 个标头:

      1. 授权:“INSERT_AUTHHEADER_HERE”
      2. x_cod_device_id: "INSERT_PREVIOUSLY_USED_DEVICEID_HERE"
      3. 饼干: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 libraryNodeJS library

      【讨论】:

      • 如果登录步骤对尝试此操作的任何人都不起作用,这是因为身份验证标头需要为 Authorization: "bearer AUTHHEADER_TOKEN"
      猜你喜欢
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2017-07-14
      • 2019-08-24
      • 2011-01-18
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多