首页 > 解决方案 > 在 R 中调用 REST API

问题描述

我最近发现了 dataforseo api 并尝试通过 R 调用它

library(httr)

username <- 'mygmailadress@gmail.com'
password <- 'mypassword'

dataforseo_api <- POST('https://api.dataforseo.com/v2/op_tasks_post/$data', 
                authenticate(username,password), 
                body = list(grant_type = 'client_credentials'),
                type = "basic",
                verbose()
               )

这是我收到的消息:

<- HTTP/1.1 401 Unauthorized
<- Server: nginx/1.14.0 (Ubuntu)
<- Date: Sun, 08 Jul 2018 13:31:34 GMT
<- Content-Type: application/json
<- Transfer-Encoding: chunked
<- Connection: keep-alive
<- WWW-Authenticate: Basic realm="Rest Server"
<- Cache-Control: no-cache, must-revalidate
<- Expires: 0
<- Access-Control-Allow-Origin: *
<- Access-Control-Allow-Methods: POST, GET, OPTIONS
<- Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With

你知道我的问题应该出在哪里吗?你能帮忙吗?

标签: rrest

解决方案


看起来你配置不正确configconfig=我在您的代码中没有看到 a 。body也没有正确编码。

此外,在API 文档中,我没有看到任何关于grant_type. 看起来应该有一系列任务,例如:

   {882394209:  {'site': 'ranksonic.com', 'crawl_max_pages': 10}}

回复:

{'results_count': 1, 'results_time': '0.0629 sec.', 'results': {'2308949': {'post_id': 2308949, 'post_site': 'ranksonic.com',
 'task_id': 882394209, 'status': 'ok'}}, 'status': 'ok'}

好的,所以首先我们需要set_configor config=

username <- 'Hack-R@stackoverflow.com' # fake email
password <- 'vxnyM9s7FAKESeIO' # fake password

set_config(authenticate(username,password), override = TRUE)

GET("https://api.dataforseo.com/v2/cmn_se")
Response [https://api.dataforseo.com/v2/cmn_se]
  Date: 2018-07-08 16:20
  Status: 200
  Content-Type: application/json
  Size: 551 kB
{
    "status": "ok",
    "results_time": "0.0564 sec.",
    "results_count": 2187,
    "results": [
        {
            "se_id": 37,
            "se_name": "google.com.af",
            "se_country_iso_code": "AF",
            "se_country_name": "Afghanistan",
...
GET("https://api.dataforseo.com/v2/cmn_se/$country_iso_code")
Response [https://api.dataforseo.com/v2/cmn_se/$country_iso_code]
  Date: 2018-07-08 15:48
  Status: 200
  Content-Type: application/json
  Size: 100 B
{
    "status": "ok",
    "results_time": "0.0375 sec.",
    "results_count": 0,
    "results": []
GET("https://api.dataforseo.com/v2/cmn_se/$op_tasks_post")
Response [https://api.dataforseo.com/v2/cmn_se/$op_tasks_post]
  Date: 2018-07-08 16:10
  Status: 200
  Content-Type: application/json
  Size: 100 B
{
    "status": "ok",
    "results_time": "0.0475 sec.",
    "results_count": 0,
    "results": []

那是一回事。对于POST数据,他们需要您将其指定为json,例如encode = "json"。从他们的文档中:

所有 POST 数据都应以 JSON 格式(UTF-8 编码)发送。关键字通过 POST 方法传递任务数组发送。数据应在此 POST 数组的数据字段中指定。我们建议一次最多发送 100 个任务。

更远:

当任务数组发送到数据字段时,使用 POST 方法完成任务设置。每个数组元素具有以下结构:

然后它继续列出 2 个必填字段和许多可选字段。

另请注意,您可以使用reset_config()after 作为更好的做法。如果您要经常运行它、共享它或使用超过 1 台计算机,我还建议将您的凭据放在环境变量中,而不是脚本中,以确保安全性和易用性。

最后一点建议是,您可能只想利用他们发布的 Python 客户端库和大量示例汇编。由于每个新的 API 请求都是您在没有他们支持的情况下在 R 中开拓的东西,因此仅在 Python 中进行数据收集可能会有所回报。

这是一个有趣的 API。如果您使用 Open Data Stack Exchange,您应该考虑与该社区共享它。


推荐阅读