R: use rvest (o httr) para iniciar sesión en un sitio que requiere cookies
Estoy tratando de automatizar el proceso de inicio de sesión basado en shibboleth paraServicio de datos del Reino Unido en R. Uno puedeRegístrese para obtener una cuenta para iniciar sesión aquí. Un intento anterior de automatizar este proceso se encuentra en esta pregunta,automatizar el inicio de sesión en el sitio web del servicio de datos del Reino Unido en R con RCurl o httr.
Pensé que las excelentes respuestas a esta pregunta,cómo autenticar un sitio web shibboleth multi-hostname con httr en R, me iban a llevar allí, pero me he topado con una pared.
Y si,RSelenium
proporciona una alternativaque realmente he intentado—Pero mi experiencia conRSelenium
es que siempre se está descamando (sin mencionar que es difícil trabajar en todas las plataformas), mientras quervest
/httr
/RCurl
las soluciones no se rompen a menos o hasta que el sitio web cambie y sean fáciles de trabajar en las máquinas de otras personas.
De todos modos, el sitio requiere que haga clic en una página de inicio de sesión inicial (y obtenga una cookie), luego ingrese a su organización (haga clic y obtenga cookies), luego ingrese su nombre de usuario y contraseña (cookies), y luego (porquervest
no hace javascript) haga clic en una página más de modificación de cookies, antes de acceder a la página "su cuenta". Me parece que las cookies en todos los pasos son necesarias, la que finalmente significa que ha iniciado sesión (ASPSESSIONIDSQAQSSQA
) es el creado por la página de inicio de sesión inicial.
Así que esto es lo que tengo hasta ahora. Primero, acceda a la página de la organización e ingrese a la organización, guardando las cookies de la página de inicio de sesión inicial (usando el truco de aquí,Enviar formulario sin botón de envío en rvest, para hacer frente al hecho de que el botón de envío no se activa hasta que se ingresa una organización).
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))
Luego, ingrese el nombre de usuario y la contraseña:
# 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
dice "Dado que su navegador no es compatible con JavaScript, debe presionar el botón Continuar una vez para continuar", entonces:
# 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))
Lamentablemente, en lugar de ser finalmente "su cuenta",p3
en realidad nos hace retroceder en la página de entrada de la organizaciónp0
.
Una cuestión potencialmente importante es quec2
contiene dosJSESSIONID
cookies quecookies(p2)
Los espectáculos son para diferentes dominios. No sé qué hacer al respecto: he intentado soltar primero uno y luego el otroc2
sin suerte ¿Alguna sugerencia? ¡Gracias!