Подтвердить что ты не робот

Автоматизация входа на веб-сайт службы данных uk в R с помощью RCurl или httr

Я собираюсь написать сборник свободно загружаемых R-скриптов для http://asdfree.com/, чтобы помочь людям проанализировать сложный выборочный опрос данные, размещенные служба данных Великобритании. Помимо предоставления множества статистических руководств для этих наборов данных, я также хочу автоматизировать загрузку и импорт данных опроса. Для этого мне нужно выяснить, как программно войти в этот веб-сайт служб данных Великобритании.

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

Этот веб-сайт требует логина и пароля, но я считаю, что делаю ошибку, прежде чем я даже попаду на страницу входа.

Здесь, как работает веб-сайт:

Стартовая страница должна быть: https://www.esds.ac.uk/secure/UKDSRegister_start.asp

Эта страница автоматически перенаправит ваш веб-браузер на длинный URL-адрес, который начинается с: https://wayf.ukfederation.org.uk/DS002/uk.ds?[blahblahblah]

(1) По какой-то причине сертификат SSL не работает на этом веб-сайте. Здесь вопрос SO, который я опубликовал относительно этого. Обходной путь, который я использовал, просто игнорирует SSL:

library(httr)
set_config( config( ssl.verifypeer = 0L ) )

а затем моя первая команда на стартовом веб-сайте:

z <- GET( "https://www.esds.ac.uk/secure/UKDSRegister_start.asp" )

это возвращает мне z$url, который очень похож на страницу https://wayf.ukfederation.org.uk/DS002/uk.ds?[blahblahblah], к которой перенаправляет мой браузер.

В браузере вы должны ввести "архив данных uk" и нажать кнопку continue. Когда я это сделаю, он перенаправляет меня на веб-страницу https://shib.data-archive.ac.uk/idp/Authn/UserPassword

Я думаю, что это то место, где я застрял, потому что я не могу понять, как иметь cURL followlocation и приземляться на этом сайте. Примечание: имя пользователя/пароль еще не введено.

Когда я использую команду httr GET на странице wayf.ukfederation.org.uk следующим образом:

 y <- GET( z$url , query = list( combobox = "https://shib.data-archive.ac.uk/shibboleth-idp" ) )

строка y$url очень похожа на z$url (за исключением того, что она получила combobox = в конце). Есть ли способ пройти эту страницу аутентификации uk data archive с помощью RCurl или httr?

Я не могу сказать, что я просто что-то пропускаю или если я абсолютно должен использовать сертификат SSL, описанный в мой предыдущий SO сообщение или что?

(2) В тот момент, когда я перехожу к этой странице, я считаю, что остальная часть кода будет следующей:

values <- list( j_username = "your.username" , 
                j_password = "your.password" )
POST( "https://shib.data-archive.ac.uk/idp/Authn/UserPassword" , body = values)

Но я думаю, что страница будет ждать...

4b9b3361

Ответ 1

Соответствующие переменные данных, возвращаемые формой, action и origin, а не combobox. Дайте action значение selection и origin значение из соответствующей записи в combobox

y <- GET( z$url, query = list( action="selection", origin = "https://shib.data-archive.ac.uk/shibboleth-idp") )
> y$url
[1] "https://shib.data-archive.ac.uk:443/idp/Authn/UserPassword"

Edit

Похоже, что пул ручек не поддерживает вашу сессию правильно. Поэтому вам необходимо передать дескрипторы напрямую, а не автоматически. Также для команды POST вам нужно установить multipart=FALSE, поскольку это default для HTML-форм. Команда R имеет другое значение по умолчанию, поскольку оно в основном предназначено для загрузки файлов. Итак:

y <- GET( handle=z$handle, query = list( action="selection", origin = "https://shib.data-archive.ac.uk/shibboleth-idp") )
POST(body=values,multipart=FALSE,handle=y$handle)
Response [https://www.esds.ac.uk/]
  Status: 200
  Content-type: text/html

...snipped...    


                <title>

                        Introduction to ESDS

                </title>

                <meta name="description" content="Introduction to the ESDS, home page" />

Ответ 2

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

library(tidyverse)
library(rvest)
library(stringr)

org <- "your_organization"
user <- "your_username"
password <- "your_password"

signin <- "http://esds.ac.uk/newRegistration/newLogin.asp"
handle_reset(signin)

# get to org page and enter org
p0 <- html_session(signin) %>% 
    follow_link("Login")
org_link <- html_nodes(p0, "option") %>% 
    str_subset(org) %>% 
    str_match('(?<=\\")[^"]*') %>%
    as.character()

f0 <- html_form(p0) %>%
    first() %>%
    set_values(origin = org_link)
fake_submit_button <- list(name = "submit-btn",
                           type = "submit",
                           value = "Continue",
                           checked = NULL,
                           disabled = NULL,
                           readonly = NULL,
                           required = FALSE)
attr(fake_submit_button, "class") <- "btn-enabled"
f0[["fields"]][["submit"]] <- fake_submit_button

c0 <- cookies(p0)$value
names(c0) <- cookies(p0)$name
p1 <- submit_form(session = p0, form = f0, config = set_cookies(.cookies = c0))

К сожалению, это не решает всей проблемы - (2) сложнее, чем кажется. У меня есть больше того, что я думаю, это решение, размещенное здесь: R: использовать rvest (или httr) для входа на сайт, требующий файлов cookie. Надеюсь, кто-то поможет нам получить остальную часть пути.