Я пытаюсь автоматизировать процесс входа на основе shibboleth для UK Data Service в R. Можно зарегистрируйте учетную запись, чтобы войти здесь. Предыдущая попытка автоматизировать этот процесс найдена в этом вопросе, r-with-rcurl-or-httr"> автоматизация входа на веб-сайт службы данных Великобритании в R с помощью RCurl или httr.
Я думал, что отличные ответы на этот вопрос, как аутентифицировать веб-сайт с несколькими хостами shibboleth с помощью httr в R, собирался привести меня туда, но я наткнулся на стену.
И да, RSelenium
предоставляет альтернативу — которую я действительно пробовал — но мой опыт с RSelenium
заключается в том, что он всегда дает сбои (не говоря уже о том, что его трудно заставить работать на разных платформах), в то время как решения rvest
/httr
/RCurl
не ломаются до тех пор, пока не изменится веб-сайт и легко заставить работать на чужих машинах.
В любом случае, сайт требует, чтобы вы щелкнули начальную страницу входа (и получили файл cookie), затем вошли в свою организацию (щелкнули и получили файлы cookie), затем ввели свое имя пользователя и пароль (файлы cookie), а затем (поскольку rvest
не сделать javascript) щелкните еще одну страницу, изменяющую файлы cookie, прежде чем перейти на страницу «вашей учетной записи». Мне кажется, что файлы cookie необходимы на всех этапах — тот, который в конечном итоге означает, что вы вошли в систему (ASPSESSIONIDSQAQSSQA
), создается на начальной странице входа.
Итак, вот что у меня есть до сих пор. Сначала перейдите на страницу организации и войдите в организацию, сохранив файлы cookie с начальной страницы входа (используя прием отсюда, Отправить форму без кнопки отправки в rvest, чтобы справиться с тем фактом, что кнопка отправки не активируется, пока не будет введена организация).
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))
Затем введите имя пользователя и пароль:
# enter user and password
f1 <- html_form(p1) %>%
first() %>%
set_values("j_username" = user,
"j_password" = password)
c1 <- cookies(p1)$value
names(c1) <- cookies(p1)$name
p2 <- submit_form(session = p1, form = f1, config = set_cookies(.cookies = c1))
p2$response
говорит: «Поскольку ваш браузер не поддерживает JavaScript, вы должны один раз нажать кнопку «Продолжить», чтобы продолжить», поэтому:
# click through
f2 <- p2 %>%
html_form() %>%
first()
c2 <- cookies(p2)$value
names(c2) <- cookies(p2)$name
p3 <- submit_form(p2, f2, config = set_cookies(.cookies = c2))
К сожалению, вместо того, чтобы наконец стать «вашей учетной записью», p3
на самом деле возвращает нас обратно на страницу входа в организацию p0
.
Одна потенциально важная проблема заключается в том, что c2
содержит два файла cookie JSESSIONID
, которые, как показывает cookies(p2)
, относятся к разным доменам. Я не знаю, что с этим делать — я безуспешно пытался сбросить сначала одно, а затем другое из c2
. Какие-либо предложения? Спасибо!
RSelenium
реализует API базовых проектов. По моему опыту, это проблемы с базовыми проектами, которые вызывают проблемы преимущественно у пользователей. - person jdharrison   schedule 10.03.2017RSelenium
— помогло использование Chrome и раздельное управление файлами — и написал свое решение в виде пакета, ukds. - person Frederick Solt   schedule 24.05.2017