Автоматизация входа на веб-сайт службы данных 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)
Но я думаю, что страница будет ждать...
Ответы
Ответ 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. Надеюсь, кто-то поможет нам получить остальную часть пути.