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!

Respuestas a la pregunta(0)

Su respuesta a la pregunta