Как настроить пакет curl в R с настройками веб-прокси по умолчанию?

Я использую R в коммерческой среде, где все внешние подключения проходят через веб-прокси, поэтому нам нужно указать адрес прокси-сервера и убедиться, что мы подключаемся к нему с аутентификацией Windows.

У меня уже есть код, который настроит пакеты RCurl и httr для использования этих параметров по умолчанию, т.е.

httr::set_config(config(
  proxy = "my.proxy.address", 
  proxyuserpwd = ":", 
  proxyauth = 4
   ))

or

opts <- list(
  proxy = "my.proxy.address",
  proxyuserpwd = ":", 
  proxyauth = 4
)
RCurl::options(RCurlOptions = opts)

Однако в последнее время я обнаружил несколько пакетов, которые зависят от пакета curl для создания веб-сайтов. запросы - например xml2::read_xml - и я не могу найти способ установить те же параметры прокси-сервера, чтобы они подбирались по умолчанию и использовались curl.

Если я сам использую curl, я могу установить параметры для нового дескриптора, и для успешной работы достаточно следующего кода:

  h = new_handle(proxy = "my.proxy.address",
                 proxyuserpwd = ":")
  con = curl(url,handle = h)
  page = xml2::read_xml(con)

... но это не поможет, когда использование curl скрыто в чужой функции!

В качестве альтернативы я знаю, что могу настроить переменную среды для прокси-адреса, например:

Sys.setenv(https_proxy = "https://my.proxy.address")

... и libcurl его подхватывает. Но если я сделаю именно это, то получу ошибку аутентификации прокси-сервера HTTP 407. Есть ли способ указать пустое имя пользователя / пароль (как это делает настройка proxyuserpwd), чтобы мы аутентифицировались с учетными данными Windows? Также не представляется возможным указать параметр proxyauth в качестве переменной среды.

Может ли кто-нибудь предложить решение или какие-либо предложения, пожалуйста?


person djb72    schedule 26.10.2018    source источник
comment
Поскольку у меня такая же проблема: вы нашли какое-либо решение этой проблемы?   -  person Roman    schedule 04.06.2021


Ответы (2)


У меня были похожие проблемы. Вот шаги, которые сработали для меня:

  1. Загрузите файл автоматической настройки прокси-сервера моей компании (файл PAC). Для IE: щелкните значок шестеренки --> параметры Интернета --> Подключения --> Настройки локальной сети --> скопируйте http-адрес в новое окно браузера, чтобы загрузить текстовый файл.
  2. Найдите строку в PAC-файле, указывающую прокси-сервер (например: "auth-proxy.xxxxxxx.com:9999").
  3. В новом сеансе R проверьте эти параметры прокси-сервера, временно установив их с помощью команды, подобной приведенной ниже, заменив ваши значения из вашего PAC-файла:

    Sys.setenv(http_proxy = "auth-proxy.xxxxxxx.com:9999")
    Sys.setenv(https_proxy = "auth-proxy.xxxxxxx.com:9999")
    
  4. Повторно запустите свой код в том же сеансе, чтобы увидеть, решают ли эти новые настройки проблему. Это тест, который я использовал.

    read_html(curl('http://google.com', handle = curl::new_handle("useragent" = "Mozilla/5.0")))
    

Настройка прокси-сервера с помощью Sys.setenv сохранится только до конца вашего текущего сеанса. Чтобы сделать более постоянное изменение, вы можете добавить его в свой R_PROFILE как объяснено здесь.

person Stan    schedule 06.02.2020
comment
Это не работает для меня. Я продолжаю получать 407. Кажется, это работает, но это не помогает, так как я не нашел способа установить PROXYUSERPWD по умолчанию: handle = new_handle() handle_setopt(handle, .list = list(PROXYUSERPWD = ":")) curl_download("http://orf.at", "test.html", handle = handle) - person Roman; 04.06.2021

Это не красота, на самом деле это совсем наоборот. Но все же этот хак заставил меня работать:

library(curl)

new_handle_plain = curl::new_handle

new_handle_ntlm = function(){
  handle = new_handle_plain()
  handle_setopt(handle, .list = list(PROXYUSERPWD = ":"))
  return(handle)
}

rlang::env_unlock(env = asNamespace('curl'))
rlang::env_binding_unlock(env = asNamespace('curl'))
assign('new_handle', new_handle_ntlm, envir = asNamespace('curl'))
rlang::env_binding_lock(env = asNamespace('curl'))
rlang::env_lock(asNamespace('curl'))


Sys.setenv("http_proxy" = curl::ie_get_proxy_for_url("http://orf.at"))
Sys.setenv("https_proxy" = curl::ie_get_proxy_for_url("http://orf.at"))
curl_download("http://orf.at", "test.html")

Мне все равно хотелось бы увидеть чистое решение, поскольку изменение внутренней функции библиотеки - это не то, что нужно делать...

person Roman    schedule 04.06.2021