在Windows操作系统中使用R进行ROauth

7

我在 Stack Overflow 上搜索了一下,看到了一些关于此主题的问题,但没有找到与 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()

你的代码是什么,导致了这个错误? - Andrie
1个回答

12

2013年5月更新

考虑到我一直看到人们在Windows上提到这些问题,如果在运行R脚本之前做以下操作,它应该会自动解决问题,而无需进行此帖子中的其他任何操作:

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

这将在所有RCurl调用中全局设置选项。

我会保留下面的帖子作为参考。


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

从输出中看,问题似乎出现在cURL(因此包括RCurl)上。我可以为另一个应用程序重新创建相同的错误,该错误在我使用Windows 7 x64 Pro与R2.14.0和RCurl_1.6-10时发生:

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参数,但这将是解决问题的方法。

希望这可以有所帮助。

Tony Breyal

P.S.还有另一种方法可行,可以避免从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:none - Btibert3
@Btibert3 抱歉,再试一次,"destfile=" 中有一个拼写错误,现在应该可以正常工作了。假设它能够正常工作,我不确定你如何在ROAuth中设置curl选项cainfo,所以你需要与维护者交谈。假设它能够正常工作的话 :S - Tony Breyal
太好了,完美地解决了问题。甚至使用Twitter包也成功了!非常感谢! - Btibert3
1
ROAuth调用中有一个“...”参数,应该传递给RCurl(或者至少我记得是这样工作的,我已经几个月没看过了),所以你应该能够传递它。还有一个警告:“已经有一段时间了”,各种twitteR调用中也应该有一个“...”被传递。 - geoffjentry
@geoffjentry 真是该死,我以前怎么没发现这个?我刚刚看了一下?searchTwitter,你说得很对,“…”被传递到getURL,这非常有用,以防将来需要使用它,设计得非常好! - Tony Breyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接