ROauth в Windows с использованием R - PullRequest
7 голосов
/ 14 ноября 2011

Я искал 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()

1 Ответ

12 голосов
/ 15 ноября 2011

ОБНОВЛЕНИЕ МАЙ 2013

Поскольку я все время вижу, как люди упоминают об этих проблемах в 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-классах, чертовски пугает меня), но в какой-то момент ему потребуется установить параметр cainfo, чтобы преодолеть эту проблему (в Windows то есть - кажется, работает нормально на Ubuntu для моего примера выше). Я не знаю, позволяет ли ROAuth пользователю каким-либо образом добавлять эти параметры curl, но это был бы способ решить эту проблему.

Надеюсь, это немного поможет.

Тони Бреял

P.S. возможен другой способ, позволяющий избежать загрузки сертификата из cURL, но он не рекомендуется для того, что вы делаете (серьезно, для вашей цели использования твиттера я бы рекомендовал против этого большого времени):

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

ОБНОВЛЕНИЕ 2011:

Похоже, что это работает на разных платформах (ну, во всяком случае, в Ubuntu и Windows) и не требует от вас прямой загрузки сертификатов SSL, поскольку RCurl уже поставляется с ними:

 x <- getURL(u, cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...