TwitteR、ROAuth 和 Windows:注册成功,但证书验证失败

Posted

技术标签:

【中文标题】TwitteR、ROAuth 和 Windows:注册成功,但证书验证失败【英文标题】:TwitteR, ROAuth and Windows: register OK, but certificate verify failed 【发布时间】:2012-04-12 13:30:51 【问题描述】:

我正在尝试使用twitteR 获取大量 Twitter 用户的关注者数量。很多otherquestions 发布的内容对我走到这一步非常有用,但据我所知,似乎没有一个与我的问题直接相关。

我可以将我的 OAuth 凭据注册到 twitter R 会话,但我似乎什么也做不了,我只收到这条消息:

Error in function (type, msg, asError = TRUE) : SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify fail

当我在不使用 OAuth 的情况下使用 twitteR 函数时,它们可以正常工作,没有错误或警告,但是我遇到了限制和受保护的帐户,我认为使用 OAuth 可以避免这些。

以下是详细信息:

library(twitteR)
library(ROAuth)
library(RCurl)
#
# Here's how I register my credentials
#
requestURL <-  "https://api.twitter.com/oauth/request_token"
accessURL =    "https://api.twitter.com/oauth/access_token"
authURL =      "https://api.twitter.com/oauth/authorize"
consumerKey =   "------------"
consumerSecret = "-----------"
twitCred <- OAuthFactory$new(consumerKey=consumerKey,
                             consumerSecret=consumerSecret,
                             requestURL=requestURL,
                             accessURL=accessURL,
                             authURL=authURL)
download.file(url="http://curl.haxx.se/ca/cacert.pem",
              destfile="cacert.pem")
twitCred$handshake(cainfo="cacert.pem")
To enable the connection, please direct your web browser to: 
https://api.twitter.com/oauth/authorize?oauth_token=xxxx
When complete, record the PIN given to you and provide it here: xxxxxx
registerTwitterOAuth(twitCred)
[1] TRUE
# so the OAuth bit appears to be ok...
#
# save it for a future sessions...
save(list="twitCred", file="twitteR_credentials")
# works, in future I can just
load("twitteR_credentials")
registerTwitterOAuth(twitCred)
#
# try to get follower numbers, here's where it goes south
me <- getUser("Rbloggers")
me$followersCount
Error in function (type, msg, asError = TRUE)  :
SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
#
# another method, same problem
getUser("Rbloggers")$followersCount
Error in function (type, msg, asError = TRUE)  : 
SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
# 
# Here are the packages and versions I'm using
sessionInfo() 
R version 2.14.1 (2011-12-22)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Australia.1252  LC_CTYPE=English_Australia.1252   
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Australia.1252    

attached base packages:
[1] stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ROAuth_0.9.2      digest_0.5.1      twitteR_0.99.19   rjson_0.2.6       RCurl_1.91-1.1   
 [6] bitops_1.0-4.1    igraph_0.5.5-4    topicmodels_0.1-4 tm_0.5-7          slam_0.1-23      
[11] modeltools_0.2-18 lasso2_1.2-12    

loaded via a namespace (and not attached):
[1] tools_2.14.1

注册凭据后如何使twitteR 功能正常工作?

更新:尝试@Btibert3 的建议会出现同样的错误:

> ## Authenticate with Twitter = this is an important peice of code
> registerTwitterOAuth(cred)
[1] TRUE
> ##########################################################################
> ## lets test out what our session limits look like
> ##########################################################################
> rate.limit <- getCurRateLimitInfo()
Error in function (type, msg, asError = TRUE)  : 
  SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

更新遵循@flz 的建议在任何地方添加cainfo="cacert.pem" 解决了我的问题:

rate.limit <- getCurRateLimitInfo( cainfo="cacert.pem")
rate.limit
                             resource limit remaining               reset
1                  /lists/subscribers   180       180 2013-03-27 09:35:37
2                         /lists/list    15        15 2013-03-27 09:35:37
3                  /lists/memberships    15        15 2013-03-27 09:35:37
4                   /lists/ownerships    15        15 2013-03-27 09:35:37
5                /lists/subscriptions    15        15 2013-03-27 09:35:37
6                      /lists/members   180       180 2013-03-27 09:35:37
7             /lists/subscribers/show    15        15 2013-03-27 09:35:37
8                     /lists/statuses   180       180 2013-03-27 09:35:37
9                         /lists/show    15        15 2013-03-27 09:35:37
10                /lists/members/show    15        15 2013-03-27 09:35:37
11     /application/rate_limit_status   180       179 2013-03-27 09:35:37 (etc)

会话信息:

sessionInfo()
R version 2.15.3 (2013-03-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ROAuth_0.9.2   digest_0.6.3   twitteR_1.1.0  rjson_0.2.12   RCurl_1.95-4.1 bitops_1.0-5  

loaded via a namespace (and not attached):
[1] tools_2.15.3

【问题讨论】:

你有没有在你的系统上解决过这个问题?我很想知道我发布的解决方案是否适用于您的系统(因为我正在贡献to a function,这需要它才能工作并保持稳健)。 谢谢,是的,通过在所有功能中添加cainfo="cacert.pem" 来实现。 【参考方案1】:

我过去曾收到您在上面描述的错误,但这对我有用。

#=======================================================================================
## ON windows, we need to dowload the certificate for OAUTH
## NOTE:  you will need to setup an app on Twitter
## dev.twitter.com <- get your KEY/SECRET
#=======================================================================================


##########################################################################
## Load packages
##########################################################################

library(twitteR)
library(ROAuth)

## set the directory
setwd("~/your/directory/here")


## Windows users need to get this file
download.file(url="http://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem")



##########################################################################
## Authenticate with Twitter
##########################################################################

## authenticate with the API
## requires that you have registered an app
KEY <- "KEY"
SECRET <-"SECRET"


## create an object that will save the authenticated onbject -- we can for later sessions
## will need to navigate to website and type in data to generate the file
## NOTE:  Only need to do this part once!!!
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(cainfo="cacert.pem")


## load the cred object in later sessions and simply pass to the registerTwitterOAuth
## After this file is saved, you only need to load the cred object back into memory
save(cred, file="twitter authentication.Rdata")


## Authenticate with Twitter = this is an important peice of code
registerTwitterOAuth(cred)


##########################################################################
## lets test out what our session limits look like
##########################################################################
rate.limit <- getCurRateLimitInfo()

## If return 350, Authenticated session = more API calls allowed / hour
rate.limit$hourlyLimit
rate.limit$remainingHits
rate.limit$resetTime

【讨论】:

感谢您分享您的脚本,这对我来说似乎没有任何区别......也许这是R之外的问题? 当您运行 registerTwitterOAuth(cred) 行时,您是否返回 False? 不管怎样,即使您没有进行身份验证,您仍然可以从 Twitter API 中查询大量数据元素。 是的,registerTwitterOAuth() 使用你的方法和我的方法返回 TRUE。作为替代方案,我目前正在运行一个具有 60 秒睡眠间隔的循环。可能需要几天时间才能得到我想要的东西!【参考方案2】:

试试:

getUser("Rbloggers")$followersCount
Error in function (type, msg, asError = TRUE)  : 
  SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
getUser("Rbloggers",cainfo="cacert.pem")$followersCount
[1] 2752

每个获取/更新操作都需要在后面附加一个cainfo="cacert.pem"。好烦啊。

【讨论】:

这似乎已经完成了,谢谢。当我执行s &lt;- searchTwitter('#caa2013') 时出现错误,但是当我执行s &lt;- searchTwitter('#caa2013', cainfo="cacert.pem") 时它工作正常。 只是为了补充@Ben 所说的内容,直到我通过该链接更新cacert.pem 并将其保存在我的工作目录中之前,此解决方案对我不起作用。 @zap2008 我应该把 cacert.pem 文件放在哪里? @zap2008 也不起作用,我终于用 curl_setopt($feed, CURLOPT_SSL_VERIFYHOST, 0) 和 curl_setopt($feed, CURLOPT_SSL_VERIFYPEER, 0) 禁用了安全性;【参考方案3】:

更新这是一个临时解决方案,请参阅@flz 的回答和我为最终解决方案编辑的问题。

自从我发布问题以来,我一直使用这个简单的循环作为解决方法(仍然欢迎适当的解决方案!)。这需要很长时间,但至少它会给我数据。也许其他人也会发现它也很有用。

# load library
library(twitteR)
#
# Search Twitter for your term
s <- searchTwitter('#rstats', n=1500) 
# convert search results to a data frame
df <- do.call("rbind", lapply(s, as.data.frame)) 
# extract the usernames
users <- unique(df$screenName)
users <- sapply(users, as.character)
# make a data frame for the loop to work with 
users.df <- data.frame(users = users, 
                       followers = "", stringsAsFactors = FALSE)
#
# loop to populate users$followers with follower 
# count obtained from Twitter API
for (i in 1:nrow(users.df)) 
    
    # tell the loop to skip a user if their account is protected 
    # or some other error occurs  
    result <- try(getUser(users.df$users[i])$followersCount, silent = TRUE);
    if(class(result) == "try-error") next;
    # get the number of followers for each user
    users.df$followers[i] <- getUser(users.df$users[i])$followersCount
    # tell the loop to pause for 60 s between iterations to 
    # avoid exceeding the Twitter API request limit
    print('Sleeping for 60 seconds...')
    Sys.sleep(60); 
    
#
# Now inspect users.df to see the follower data

【讨论】:

【参考方案4】:

ROauth 0.9.1 似乎有问题,如果你使用那个版本,你应该看看 twitteR 开发者的这篇文章(它对我有用): http://lists.hexdump.org/pipermail/twitter-users-hexdump.org/2012-March/000075.html

【讨论】:

你可以在我上面的sessionInfo 看到我已经在使用 0.9.2【参考方案5】:

其他答案集中在download.file() 以更新cacert 文件。应该没什么区别,但是您可以尝试下载最新的 Curl 二进制文件并使用它来更新 cacert 文件,就像这样...

url <- "http://curl.askapache.com/download/curl-7.23.1-win64-ssl-sspi.zip"
tmp <- tempfile( fileext = ".zip" )
download.file(url,tmp)
unzip(tmp, exdir = tempdir())

system( paste0( tempdir() , "/curl http://curl.haxx.se/ca/cacert.pem -o " , tempdir() , "/cacert.pem" ) )

# You can use this freshly downloaded cacert file and you can also set ssl.verifypeer = FALSE
twitCred$handshake( cainfo = paste0( tempdir() , "/cacert.pem" ) , ssl.verifypeer = FALSE )
registerTwitterOAuth(Cred)

【讨论】:

感谢您的建议。我已经尝试过了,它似乎没有任何区别。 @Ben 你能粘贴你的sessionInfo() 吗?可能有助于诊断? 当然,我已经在 Q 中弹出了它。【参考方案6】:

我不确定我是否只是看错了,但我认为这会导致您的文件保存到 cacert.perm 但您告诉握手查看 cacert.pem ?

> 下载.file(url="http://curl.haxx.se/ca/cacert.pem", > destfile="cacert.perm") > twitCred$handshake(cainfo="cacert.pem")

【讨论】:

很好,绝对是一个错字!但我认为这不是主要问题。【参考方案7】:

您是否尝试过在握手时使用 cacert.pem 的完整路径?以下解决了我在 Ubuntu 中的问题:

twitCred$handshake(cainfo="/etc/ssl/certs/cacert.pem")

【讨论】:

【参考方案8】:

即使在我的电脑上,此错误也相当持久,但在所有功能中使用 cainfo="cacert.pm" 可以消除或解决此问题。不太确定

【讨论】:

【参考方案9】:

终于找到解决办法了,请试试这个方法

library(devtools)
install_github("twitteR", username="geoffjentry")
library(twitteR)

api_key = "aaa"
api_secret = "bbb"
access_token = "ccc"
access_token_secret = "ddd"
setup_twitter_oauth(api_key,api_secret,access_token,access_token_secret)

【讨论】:

【参考方案10】:

我认为最快的方法:

0) 在 Api.Twitter 上设置您的 api 密钥 1) 使用 hadley httr Twitter oauth 2) 将 twitter_token 保存到 RDS 3) 上传到服务器或您想使用的任何地方 4) 只需将此令牌与 GET 命令一起使用 5) 你可以合法地从 Twitter 每小时获得 300 000 个 id

【讨论】:

如果限制不够.. 创建 10 个用户和 RDS 令牌文件。 (在令牌之间切换)。有了它,您每小时可以达到 300 万个 ID。或联系 Twitter DEV 团队。但我认为,3M/小时够远了。 ;)

以上是关于TwitteR、ROAuth 和 Windows:注册成功,但证书验证失败的主要内容,如果未能解决你的问题,请参考以下文章

从Windows Phone 8.1应用程序打开LinkedIn和Twitter应用程序的Uri方案是什么?

SandboxEscaper第三次在Twitter上披露未修复的Windows 0day

Javascript - WinRT - 如何与 twitter 或 Facebook 分享分数?

ImportError:没有名为“twitter”的模块

运行 Flume 代理获取 Twitter 数据

(Twitter) 引导按钮输入在悬停时闪烁