我正在使用Jsoup尝试登录this网站。我使用以下代码:
Connection.Response res = Jsoup.connect("https://www.interpals.net/")
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
.method(Connection.Method.GET)
.followRedirects(true)
.execute();
Document doc = res.parse();
Map<String, String> cookies = res.cookies();
System.out.println("cookies: "+cookies.size());
for (String key : cookies.keySet())
System.out.println(key);
Elements metaTags = doc.getElementsByTag("meta");
String csrf_token = "";
for (Element metaTag : metaTags) {
String content = metaTag.attr("content");
String name = metaTag.attr("name");
if("csrf-token".equals(name)) {
csrf_token = content;
}
}
System.out.println("csrf_cookieV2 = "+cookies.get("csrf_cookieV2"));
res = Jsoup.connect("https://www.interpals.net/")
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
.data("username", mEmailView.getText().toString())
.data("password", mPasswordView.getText().toString())
.data("csrf_token", csrf_token)
.followRedirects(true)
.cookies(cookies)
.method(Connection.Method.POST)
.execute();
doc = res.parse();
}
我注意到登录表单中有一个名为csrf_token
的隐藏元素。此值写在头HTML中,但它使用JavaScript添加到表单中。 Jsoup不支持JavaScript所以我自己从头部提取了这个值,并将它放在POST
方法参数中。发生的事情是我无法登录,每次重定向到登录页面。我尝试从禁用JavaScript的浏览器登录,如果我添加csrf_token
输入字段,那么我就能成功登录。我还尝试更改一些cookie,看看我是否可以在我的PC上复制Android行为。当我更改csrf_cookieV2
cookie的值时,我能够复制它。问题是,当我执行POST
请求时,我发送此cookie,因此问题应该在其他地方。我究竟做错了什么?任何的想法?
目前,只有在Android中使用WebView,我才能登录网站。
答案 0 :(得分:0)
首先,您的帖子网址应为https://www.interpals.net/app/auth/login,因为它位于表单标记的操作属性中。
此页面需要推荐人(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer)
所以你的第二个请求应该是这样的:
Connection.Response res = Jsoup.connect("https://www.interpals.net/app/auth/login")
.userAgent( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
.referrer("https://www.interpals.net")
.data("csrf_token", token)
.data("username", "your-login")
.data("password", "your-password")
.cookies(cookies)
.method(Method.POST).execute();
您将获得授权。