【问题标题】:ROauth on Windows using R使用 R 在 Windows 上进行 ROauth
【发布时间】:2011-12-28 16:51:31
【问题描述】:

我搜索了 SO 并看到一些关于该主题的问题,但我没有找到任何与 Windows 直接相关的内容(我之前的帖子是针对 Linux 的)。

更具体地说,我想使用 twitteR 包,但我无法让身份验证工作。到目前为止,我可以访问其他机器,但是这一次,我需要完全留在 Windows 中。我该如何解决这个问题?

这是错误:

Error in curlPerform(curl = curl, URL = url, postfields = fields, writefunction = reader$update,  : 
  SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

编辑:以及生成它的代码....来自 twitteR 包的文档

cred <- OAuthFactory$new(consumerKey = KEY, 
    consumerSecret = SECRET,
    requestURL = "https://api.twitter.com/oauth/request_token", 
    accessURL = "https://api.twitter.com/oauth/access_token", 
    authURL = "https://api.twitter.com/oauth/authorize")
cred$handshake()

【问题讨论】:

  • 产生此错误的代码是什么?

标签: r twitter oauth


【解决方案1】:

2013 年 5 月更新

我一直看到人们在 Windows 上提到这些问题,如果您在运行 R 脚本之前执行以下操作,它应该会自动解决问题,而无需您在这篇文章中执行任何其他操作:

library(RCurl) 
options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")))

这将全局设置选项并将用于所有 RCurl 调用。

我会留下下面的帖子以供参考。


注意:这不是直接的解决方案,但对于评论或#rstats 推文来说也太长了...

读取输出,问题似乎出在 cURL(以及包 RCurl)上。我可以使用 RCurl_1.6-10 为 R2.14.0 的 Windows 7 x64 Pro 上发生在我身上的不同应用程序重新创建相同的错误:

library(RCurl)
u <- "https://raw.github.com/tonybreyal/Blog-Reference-Functions/master/R/bingSearchXScraper/bingSearchXScraper."
x <- getURL(u)
#Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : 
#  SSL certificate problem, verify that the CA cert is OK. Details:
#error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

错误代码相同。在您的情况下,这意味着 Twitter 正在向您发送一个证书,告诉您它们是真正的 Twitter 网站。但你怎么知道他们说的是真话?在您的系统上的某个地方,您需要有一个可以确认它的文件,该文件是从受信任的来源获得的。

一种解决方案是获取解决问题的文件如下(注意,还有其他网站提供此类文件,我使用了官方 cURL 网站):

download.file(url="http://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem")
x <- getURL(u, cainfo = "cacert.pem")

我还没有看过 ROAuth 的内部结构(任何用 S3/S4/Reference-classes 编写的东西都吓坏了我)但在某些时候它需要设置 cainfo 参数来解决这个问题(在 Windows也就是说 - 对于我上面的示例,它似乎在 Ubuntu 上运行良好)。我不知道 ROAuth 是否允许用户以某种方式添加这些 curl 参数,但这将是解决它的方法。

希望能有所帮助。

托尼·布雷亚尔

附:另一种方法是可能的,并且避免从 cURL 下载证书,但不建议用于您正在做的事情的类型(说真的,为了您使用 twitter 的目的,我建议不要这么大的时间):

x <- getURL(u, ssl.verifypeer = FALSE)

2011 年更新:

这似乎可以跨平台工作(无论如何,Ubuntu 和 Windows),并且不需要您直接下载 SSL 证书,因为 RCurl 已经附带了它们:

 x <- getURL(u, cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))

【讨论】:

  • 感谢您的详尽回复!我实际上无法让第一部分工作。我可以复制原始错误(您复制的),但是在下载文件并将其包含在 getURL 中后,我收到以下错误。当我尝试将文件包含在 ROauth 包中的握手中时出现相同的错误: curlPerform 中的错误(curl = curl,URL = url,postfields = fields,writefunction = reader$update,:错误设置证书验证位置:CAfile : cacert.pem CApath: 无
  • @Btibert3 对不起,伙计,再试一次,“destfile=”中有错字,现在应该可以正常工作了。假设它有效,我不确定您将如何在 ROAuth 中设置 curl 选项 cainfo,因此您必须与维护者交谈。假设它的工作原理是:S
  • 太好了,效果很好。甚至使用 Twitter 包让它工作!非常感谢!
  • ROAuth 调用中有一个“...”参数,应该传递给 RCurl(或者至少我记得它是这样工作的,我几个月没看它了)所以你应该能够传递它。此外,“已经有一段时间了”的警告,应该在各种 twitteR 调用上都有一个“...”,这些调用也会传递。
  • @geoffjentry 该死的,我以前怎么没见过?!我刚刚查看了 ?searchTwitter,您说得非常正确,“...”被传递给 getURL,如果我将来需要它,知道它非常有用,出色的设计!
猜你喜欢
  • 2013-04-17
  • 1970-01-01
  • 2013-09-02
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多