ukds
аюсь автоматизировать процесс входа в систему на основе Shibboleth дляСлужба данных Великобритании в R. Можнозарегистрируйтесь для входа в систему здесь, Предыдущая попытка автоматизировать этот процесс находится в этом вопросе,автоматизировать вход на веб-сайт службы данных Великобритании в R с помощью RCurl или httr.
Я думал, что отличные ответы на этот вопрос,как аутентифицировать сайт с несколькими именами хостов с помощью httr в Rсобирались отвезти меня туда, но я врезался в стену.
И да,RSelenium
предоставляет альтернативукоторый я на самом деле пытался- но мой опыт сRSelenium
является то, что он всегда отваливается (не говоря уже о том, что трудно работать на разных платформах), в то время какrvest
/httr
/RCurl
решения не ломаются до тех пор, пока не изменится веб-сайт, и их легко начать работать на машинах других людей.
В любом случае, сайт требует, чтобы вы щелкнули по начальной странице входа (и получили куки), затем вошли в свою организацию (кликните и получите куки), затем введите ваше имя пользователя и пароль (куки), а затем (потому чтоrvest
не поддерживает javascript) нажмите еще одну страницу для изменения файлов cookie, прежде чем попасть на страницу "Ваша учетная запись". Мне кажется, что куки на всех этапах необходимы - тот, который в конечном итоге означает, что вы вошли (ASPSESSIONIDSQAQSSQA
) - это страница, созданная начальной страницей входа.
Так вот что у меня так далеко. Сначала перейдите на страницу организации и войдите в организацию, сохранив куки-файлы с начальной страницы входа (используя трюк здесь,Отправить форму без кнопки отправки в 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
содержит дваJSESSIONID
куки, которыеcookies(p2)
шоу для разных доменов. Я не знаю, что с этим делать - я пытался сбросить сначала одну, а затем другую изc2
без удачи Какие-либо предложения? Спасибо!