标签: httr

从R连接到azure blob存储API时出错

我试图通过R中的REST API使用Azure存储.我正在使用httr覆盖Curl 的包.

建立

您可以使用R-fiddle:http://www.r-fiddle.org/#/fiddle?id = vh8uqGmM

library(httr)
requestdate<-format(Sys.time(),"%a, %d %b %Y %H:%M:%S GMT")
url<-"https://preconstuff.blob.core.windows.net/pings?restype=container&comp=list"
sak<-"Q8HvUVJLBJK+wkrIEG6LlsfFo19iDjneTwJxX/KXSnUCtTjgyyhYnH/5azeqa1bluGD94EcPcSRyBy2W2A/fHQ=="
signaturestring<-paste0("GET",paste(rep("\n",12),collapse=""),
"x-ms-date:",requestdate,"
x-ms-version:2009-09-19
/preconstuff/pings
comp:list
restype:container")

headerstuff<-add_headers(Authorization=paste0("SharedKey preconstuff:",
                         RCurl::base64(digest::hmac(key=sak,
                         object=enc2utf8(signaturestring),
                         algo= "sha256"))),
                    `x-ms-date`=requestdate,
                    `x-ms-version`= "2009-09-19")
Run Code Online (Sandbox Code Playgroud)

试图列出blob:

content(GET(url,config = headerstuff, verbose() ))
Run Code Online (Sandbox Code Playgroud)

错误

顶级消息

在HTTP请求'Q8HvUVJLBJK + wkrIEG6LlsfFo19iDjneTwJxX /KXSnUCtTjgyyhYnH/5azeqa1bluGD94EcPcSRyBy2W2A/fHQ =='中找到的MAC签名与任何计算签名不同.

回复内容

[1] "<?xml version=\"1.0\" encoding=\"utf-8\"?><Error>
<Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.\nRequestId:1ab26da5-0001-00dc-6ddb-15e35c000000\nTime:2015-03-26T17:51:42.7190620Z</Message>
<AuthenticationErrorDetail>The MAC signature found in …
Run Code Online (Sandbox Code Playgroud)

r azure-storage httr

6
推荐指数
1
解决办法
3271
查看次数

如何使用httr GET命令刷新或重试特定网页?

我需要使用不同的"密钥"访问同一网页,以获取它提供的特定内容.

我有一个键列表,x我使用包中的GET命令httr来访问网页,然后检索我需要的信息y.

library(httr)
library(stringr)
library(XML)

for (i in 1:20){
    h1 = GET ( paste0("http:....categories=&query=", x[i]),timeout(10))
    par = htmlParse(file = h1)

    y[i]=xpathSApply(doc = par, path = "//h3/a" , fun=xmlValue)

}
Run Code Online (Sandbox Code Playgroud)

问题是经常会达到超时,并且会中断循环.

因此,如果达到超时,我想刷新网页或重试GET命令,因为我怀疑问题出在我试图访问的网站的互联网连接上.

我的代码工作方式,超时打破了循环.我需要忽略错误并转到下一次迭代或重试访问该网站.

timeout get r httr

6
推荐指数
2
解决办法
1338
查看次数

使用httr对github私有存储库进行身份验证

我正在尝试使用Github访问私有存储库httr.如果我添加我的github令牌(存储为环境变量GITHUB_TOKEN),我可以毫无问题地执行此操作:

httr::GET("https://api.github.com/repos/aammd/miniature-meme/releases/assets/2859674",
                 httr::write_disk("test.rds", overwrite = TRUE),
                 httr::progress("down"),
                 httr::add_headers(Authorization = paste("token", Sys.getenv("GITHUB_TOKEN"))))
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试指定另一个标头,我会收到错误.在这种情况下,我想下载与发布相关联的二进制文件("资产",在github术语中):

httr::GET("https://api.github.com/repos/aammd/miniature-meme/releases/assets/2859674",
                 httr::write_disk("test.rds", overwrite = TRUE),
                 httr::progress("down"),
                 httr::add_headers(Authorization = paste("token", Sys.getenv("GITHUB_TOKEN"))),
                 httr::add_headers(Accept = "application/octet-stream"))


?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidArgument</Code><Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message>
Run Code Online (Sandbox Code Playgroud)

这只是消息的一部分(其余包括我的令牌).

显然我的授权被发送了两次!我怎么能阻止这个?它与...有关httr::handle_pool()

编辑 - 连接信息

看来原始请求收到一个包含签名的回复.然后将此签名与我的令牌一起发回,从而导致错误.这些人也发生了类似的事情

-> GET /repos/aammd/miniature-meme/releases/assets/2859674 HTTP/1.1
-> Host: api.github.com
-> User-Agent: libcurl/7.43.0 r-curl/2.3 httr/1.2.1.9000
-> Accept-Encoding: gzip, deflate
-> Authorization: …
Run Code Online (Sandbox Code Playgroud)

r github httr

6
推荐指数
1
解决办法
570
查看次数

从瑞典统计局下载数据。查询中的瑞典语字符

我设法使用网站 api 从瑞典统计局检索了一些数据。这个问题的答案解决了我的大部分问题。

如何以不太详细的方式发布 JSON 格式的请求以从 R 中的 URL 获取 JSON 数据到 data.frame 中?

但我仍然有两个问题。

如果我的 json 问题中有带有变音符号的字符(如“Å”、“Ä”、“Ö”),我会从服务器收到“404”响应。

我正在尝试从此表下载数据:

按地区、就业、年龄和性别划分的 16 岁以上人口 (RAMS)。2004 - 2015 年

(点击“Continue”,然后点击“api for this table”就可以查询到网站上的api,但是必须把响应格式从“px”改为“json”。)

此代码有效:

library(jsonlite)
library(httr)

bodytxt <- '{
  "query": [
{
  "code": "Region",
  "selection": {
  "filter": "vs:RegionKommun07",
  "values": [
  "0114",
  "1280"
  ]
  }
},
  {
  "code": "Alder",
  "selection": {
  "filter": "item",
  "values": [
  "16-19"
  ]
  }
  },
  {
  "code": "Tid",
  "selection": {
  "filter": "item",
  "values": [
  "2015"
  ]
  }
  }
  ],
  "response": …
Run Code Online (Sandbox Code Playgroud)

r httr

5
推荐指数
1
解决办法
297
查看次数

使用R进行网页抓取时如何处理验证码

我试图从这个网站上抓取数据,使用httrrvest。经过多次抓取(大约 90 - 100 次),该网站会自动将我转移到另一个带有验证码的网址。

这是正常的网址: "https://fs.lianjia.com/ershoufang/pg1"

这是验证码网址: "http://captcha.lianjia.com/?redirect=http%3A%2F%2Ffs.lianjia.com%2Fershoufang%2Fpg1"

当我的蜘蛛遇到验证码网址时,它会告诉我停止并在浏览器中解决它。然后我在浏览器中手动解决它。但是当我运行蜘蛛并发送GET请求时,蜘蛛仍然被转移到验证码网址。同时在浏览器中,一切正常,即使我输入验证码网址,它也会将我转回浏览器中的正常网址。

即使我使用代理,我仍然遇到同样的问题。在浏览器中,我可以正常浏览网站,而蜘蛛一直在转移到验证码网址。

我想知道,

  1. 我使用代理的方式正确吗?
  2. 为什么蜘蛛不断被传输而浏览器没有。他们来自同一个IP。

谢谢。

这是我的代码:

a <- GET(url, use_proxy(proxy, port), timeout(10),
          add_headers('User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
                      'Connection' = 'keep-alive',
                      'Accept-Language' = 'en-GB,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,en-US;q=0.2,fr;q=0.2,zh-TW;q=0.2',
                      'Accept-Encoding' = 'gzip, deflate, br',
                      'Host' = 'ajax.api.lianjia.com',
                      'Accept' = '*/*',
                      'Accept-Charset' = 'GBK,utf-8;q=0.7,*;q=0.3',
                      'Cache-Control' = 'max-age=0'))
b <- a %>% read_html %>% html_nodes('div.leftContent') %>% html_nodes('div.info.clear') %>% 
            html_nodes('div.title') %>% html_text() …
Run Code Online (Sandbox Code Playgroud)

captcha r web-crawler web-scraping httr

5
推荐指数
1
解决办法
3271
查看次数

使用 httr 为 Trello 创建 oauth 令牌时如何修复“无效的 return_url”错误?

我想使用 trelloR 包管理我的 Trello 卡和板,但是当我尝试使用该get_token功能创建令牌时,我在浏览器上收到一条错误消息:“无效的 return_url”。

my_token <- get_token(key = my_key, secret = my_secret)
Run Code Online (Sandbox Code Playgroud)

my_key是我的个人 Trello API 密钥,my_secret是我的 OAuth 秘密。我在 Trello 页面上找到了它们,该页面会在登录后为您提供身份验证代码:https : //trello.com/app-key

要使用 Trello API 并访问板,我需要一个令牌。此令牌由 httr 包使用 OAuth1.0 生成。事实上,功能get_token做这样的事情,根据的Jakub Chromec,作者和trelloR的维护者在这里

my_token <- get_token(key = my_key, secret = my_secret)
Run Code Online (Sandbox Code Playgroud)

当我get_token用我的个人密钥和秘密执行这段代码或函数时,我被重定向到我的浏览器,这是正常的。如本页所述,应该会出现一个屏幕,要求我允许进行身份验证。但相反,我在浏览器中只有一条错误消息:“无效的 return_url”。

在 RStudio 控制台中,这仍然显示:

trello.app = httr::oauth_app(
  appname = "trello-app",
  key = my_key,
  secret = my_secret)

trello.urls = httr::oauth_endpoint(
  request = "OAuthGetRequestToken",
  authorize ="OAuthAuthorizeToken?scope=read&expiration=30days&name=trello-app", …
Run Code Online (Sandbox Code Playgroud)

r oauth trello httr

5
推荐指数
1
解决办法
2029
查看次数

发出 API 请求时使用 httr 包进行身份验证

我正在学习如何使用 R 中的 API 获取数据。我知道其目的httr是为curl 包提供一个包装器。\n我为了向 API 发出请求而遵循的文档具有以下 HTTP 请求格式。下面的代码将用于生成令牌

\n\n
curl -s \\\n     -d "client_id=clientid\xe2\x80\x9d \\\n     -d "username=user\xe2\x80\x9d \\\n     -d "password=pwd\xe2\x80\x9d \\\n     -d "grant_type=password" \\\n     -d "scope=openid email" \\\n     "https://auth.com/token"\n
Run Code Online (Sandbox Code Playgroud)\n\n

之后,我将使用令牌通过此请求与 API 进行通信

\n\n
curl --header "Content-Type: application/json" \\\n     --header "Accept: application/+json" \\\n     --header "Authorization: Bearer token_goes_here\xe2\x80\x9c \\\n     --request GET \\\n     --url "https://api-sitename.org/sections?parent_id=0"\n
Run Code Online (Sandbox Code Playgroud)\n\n

最初,我在终端中运行这两个请求,它们成功了,我收到了 JSON 格式的响应。我的问题是,如何在 R 脚本中运行这些请求,以便获得响应并将它们存储在 R studio 全局环境中?我的目标是最终将数据集从API加载到Rstudio工作环境中。\nT

\n

api r httr jsonlite

5
推荐指数
1
解决办法
5531
查看次数

如何使用 R 执行 EUR-Lex API 的 SOAP 请求?

您将如何SOAP使用 R 请求 EUR-Lex 的 API?

EUR-Lex 是一个包含许多法律行为的欧盟数据库。在他们的 Web 服务手册中,他们描述了他们的SOAP系统,但没有描述如何使用 R。我已经尝试了一段时间就业httrRCurl但没有成功。我想使用 R 而不是 SOAPUI。

这里有人有这方面的经验吗?

从下面的链接中,我应该按如下方式定义正文吗?

body <- "<sear:searchRequest>
<sear:expertQuery>${expert query}</sear:expertQuery> <sear:page>${page}</sear:page>
<sear:pageSize>${pageSize}</sear:pageSize> <sear:searchLanguage>${search language
</sear:searchLanguage>
          </sear:searchRequest>"
Run Code Online (Sandbox Code Playgroud)

然后我如何将其与 结合起来headerfields使用RCurlhttr包?

以下三个答案似乎相关,但我不知道如何将它们应用到我的 EUR-Lex 示例中:

  1. 如何将 SOAP 请求curl 转换为 RCurl
  2. 带有 WSDL for R 的 SOAP 客户端
  3. R 中的 SOAP 请求

EUR-Lex API 链接:

  1. WSDL: https: //eur-lex.europa.eu/eurlex-ws?wsdl
  2. 手册:https ://eur-lex.europa.eu/content/tools/webservices/SearchWebServiceUserManual_v2.00.pdf

soap web-services r rcurl httr

5
推荐指数
1
解决办法
960
查看次数

将curl OAuth2令牌请求转换为httr

我正在尝试使用 r 和 httr 访问domain.com.au api。我可以使用 API 密钥来实现此目的,但不能使用 OAuth2

该文档表明:

通过客户端凭证获取访问令牌 使用您的 client_id 和 client_secret 以及您需要的范围列表向https://auth.domain.com.au/v1/connect/token端点发出 POST 请求。请参阅 API 参考,了解每个端点所需的范围列表。尝试使用计划中未包含的范围将导致 400 invalid_scope 错误。该请求必须使用基本身份验证进行身份验证,其中 client_id 和 client_secret 分别对应于用户名和密码。

https://developer.domain.com.au/docs/v2/authentication/oauth/client-credentials-grant

卷曲的实现很简单:

curl -X POST -u 'clientid:secret' -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=client_credentials&scope=api_listings_read%20api_agencies_read' 'https://auth.domain.com.au/v1/connect/token'
Run Code Online (Sandbox Code Playgroud)

它返回令牌而不进行任何重定向。

但是,我无法将其转换为等效的 httr POST 请求来获取令牌。我目前拥有的是:

oep <- oauth_endpoint(base_url = "https://auth.domain.com.au/v1/connect/token", 
                      request = NULL, 
                      access = "access_token" )

myapp <- oauth_app("domain",
     key = "client_id_here",
     # The secret isn't secrete. A user still has to authenticate when redirected.
     secret = …
Run Code Online (Sandbox Code Playgroud)

curl r oauth oauth-2.0 httr

5
推荐指数
1
解决办法
1140
查看次数

使用 imfr 查询 IMF API - 错误无结果/不接受过滤器

我目前正在尝试从国际货币基金组织的贸易统计方向下载特定系列,以计算国家之间的贸易量。有一个 r-packageimfr在这方面做得非常出色。然而,当我选择特定的一组时,我遇到了问题。

\n

这段代码工作得很好,并为我提供了我感兴趣的五个国家的完整数据系列:

\n
library(imfr)\n\n# get the list of imf datasets \nimf_ids()\n\n# I am interested in direction of trade "DOT", so check the list of codes that are in the datastructure\nimf_codelist(database_id = "DOT")\n\n# I want the export and import data between countries FOB so "TXG_FOB_USD" and "TMG_FOB_USD"\nimf_codes("CL_INDICATOR_DOT")\n\n# works nicely for exports:\ndata_list_exports <- imf_data(database_id = "DOT", indicator = c("TXG_FOB_USD"), \n                      country = c("US","JP","KR"), \n                      start = "1995",\n                      return_raw = TRUE, \n                      freq = "A")\n\n# however the same code …
Run Code Online (Sandbox Code Playgroud)

api r economics httr

5
推荐指数
1
解决办法
902
查看次数