ROauth в Windows с использованием R

Я искал 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 ответ

Решение

ОБНОВЛЕНИЕ МАЙ 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, но это был бы способ решить эту проблему.

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

Тони Бреял

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

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

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

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

 x <- getURL(u, cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))
Другие вопросы по тегам