我正在尝试为R中的UK Data Service自动执行基于shibboleth的登录过程。一个人sign up for an account to login here。此问题automating the login to the uk data service website in R with RCurl or httr中可以找到先前尝试自动执行此过程。
我认为这个问题的优秀答案,how to authenticate a shibboleth multi-hostname website with httr in R,会让我在那里,但我已经撞墙了。
而且,是的,RSelenium
提供了另一种选择 - which I've actually tried - 但我对RSelenium
的体验是它总是剥落(更不用说它很难开始工作了)跨平台),虽然rvest
/ httr
/ RCurl
解决方案不会中断,除非或直到网站发生变化并且很容易在其他人的计算机上工作。
无论如何,该网站要求您点击初始登录页面(并获取cookie),然后进入您的组织(点击并获取cookie),然后输入您的用户名和密码(cookies),然后(因为{ {1}}没有javascript)点击另一个Cookie修改页面,然后登陆"您的帐户"页。在我看来,所有步骤中的cookie都是必要的 - 最终表示您已登录(rvest
)的cookie是由初始登录页面创建的。
所以这就是我到目前为止所拥有的。首先,进入组织页面并进入组织,从初始登录页面保存cookie(使用此处的技巧Submit form with no submit button in rvest),以应对提交按钮未激活的事实,直到进入组织)。
ASPSESSIONIDSQAQSSQA
然后,输入用户名和密码:
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))
说&#34;由于您的浏览器不支持JavaScript,您必须按“继续”按钮一次以继续&#34;,所以:
p2$response
可悲的是,# 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
上重新启动,而不是最终成为&#34;您的帐户&#34;。
一个可能很重要的问题是,p0
包含两个c2
Cookie,JSESSIONID
显示的Cookie适用于不同的域。我不知道该怎么做 - 我已经尝试从cookies(p2)
先放弃第一个而没有运气。有什么建议?谢谢!