R: use rvest (ou httr) para fazer login em um site que requer cookies

Estou tentando automatizar o processo de login baseado em shibboleth para oServiço de dados do Reino Unido em R. Pode-seinscreva-se para uma conta para entrar aqui. Uma tentativa anterior de automatizar esse processo é encontrada nesta pergunta,automatizando o login no site de serviço de dados do Reino Unido em R com RCurl ou httr.

Eu pensei que as excelentes respostas para esta pergunta,como autenticar um site shibboleth com vários hosts com httr em R, estavam indo me levar para lá, mas eu bati em uma parede.

E sim,RSelenium fornece uma alternativaque eu realmente tentei—Mas minha experiência comRSelenium é que ele está sempre aparecendo (sem mencionar que é difícil trabalhar em várias plataformas), enquantorvest/httr/RCurl as soluções não são interrompidas, a menos ou até que o site seja alterado e sejam fáceis de trabalhar nas máquinas de outras pessoas.

De qualquer forma, o site exige que você clique em uma página inicial de login (e obtenha um cookie), insira sua organização (clique e obtenha cookies), insira seu nome de usuário e senha (cookies) e depois (porquervest não usa javascript) clique em mais uma página de modificação de cookies antes de desembarcar na página "sua conta". Parece-me que os cookies em todas as etapas são necessários - aquele que eventualmente significa que você efetuou login (ASPSESSIONIDSQAQSSQA) é aquele criado pela página de logon inicial.

Então aqui está o que eu tenho até agora. Primeiro, acesse a página da organização e entre na organização, salvando os cookies na página de login inicial (usando o truque daqui,Enviar formulário sem botão enviar no rvest, para lidar com o fato de o botão enviar não ser ativado até que uma organização seja inserida).

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))

Em seguida, digite o nome de usuário e a senha:

# 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 diz "Como seu navegador não suporta JavaScript, você deve pressionar o botão Continuar uma vez para continuar", então:

# 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))

Infelizmente, em vez de finalmente ser "sua conta",p3 na verdade, nos coloca de volta na página de entrada da organizaçãop0.

Uma questão potencialmente importante é quec2 contém doisJSESSIONID cookies quecookies(p2) shows são para domínios diferentes. Não sei o que fazer sobre isso - tentei largar primeiro um depois o outro dec2 sem sorte. Alguma sugestão? Obrigado!

questionAnswers(0)

yourAnswerToTheQuestion