R: используйте rvest (или httr) для входа на сайт, требующий куки.

Я пытаюсь автоматизировать процесс входа на основе 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. Какие-либо предложения? Спасибо!


person Frederick Solt    schedule 09.03.2017    source источник
comment
Ты прав. RSelenium не всегда заслуживает доверия. Но когда я попытался зарегистрироваться, он попросил меня подождать три дня, чтобы предоставить мне учетные данные имени пользователя и пароля. Это интересно. Я работал над несколькими другими сайтами для поиска паролей, файлов cookie и сеансов. Так что я попробую   -  person Bharath    schedule 10.03.2017
comment
Здорово! Я очень ценю это!   -  person Frederick Solt    schedule 10.03.2017
comment
RSelenium реализует API базовых проектов. По моему опыту, это проблемы с базовыми проектами, которые вызывают проблемы преимущественно у пользователей.   -  person jdharrison    schedule 10.03.2017
comment
Это достаточно справедливо.   -  person Frederick Solt    schedule 10.03.2017
comment
Эпилог. В конце концов я преодолел свои опасения по поводу RSelenium — помогло использование Chrome и раздельное управление файлами — и написал свое решение в виде пакета, ukds.   -  person Frederick Solt    schedule 24.05.2017