JSoup模拟登录网站(以校园内网为例)

x33g5p2x  于2021-12-28 转载在 其他  
字(3.8k)|赞(0)|评价(0)|浏览(237)

我们先给出登录界面以及界面的URL:

URL:https://webvpn.ncepu.edu.cn/users/sign_in

主要步骤:

  1. 填好用户名以及登录密码,按下F12,并在Elements中搜索action:

可以看到,我们输入的表单数据最终被提交到了"/users/sign_in"里。

  1. 点击登录,在Network里面找到sign_in,可以看到我们模拟登录需要的各种信息:

  1. 开始写代码。
  • 第一步主要是获取表单信息以及cookie,可能有的网站这里必须动态请求网页数据来获得form data,具体原因请参考:Exception in thread “main“ org.jsoup.HttpStatusException: HTTP error fetching URL. Status=422, URL=
Connection connection = Jsoup.connect(URL);
connection.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36");
Response res = connection.execute();   //获取res.cookies(),后面要用到
Document d = Jsoup.parse(res.body());
List<Element> elements = d.select("form");
Map<String, String> datas = new HashMap<>();
for (Element element : elements.get(0).getAllElements()) {
    if (element.attr("name").equals("user[login]")) {
        element.attr("value", "************");
    }
    if (element.attr("name").equals("user[password]")) {
        e.attr("value", "******");
    }
    if (element.attr("name").length() > 0) {
        datas.put(e.attr("name"), e.attr("value"));
    }
}

USER_AGENT等信息都在这里面:

我们可以打印一下datas:

{user[dymatice_code]=unknown, utf8=?, commit=登录 Login, user[login]=马赛克, user[password]=马赛克, authenticity_token=+BD3FgRXj+LsvgUpS81EKyU7SOF1B6eshSzfo3aMOSHD3LoMsx8ZP85vWNbm1PbPJGbgJqHVbFkTvHuSzDwI8A==}

  • 第二步就是提交表单信息以及cookies,进行模拟登录:
Connection connection2 = Jsoup.connect("https://webvpn.ncepu.edu.cn/users/sign_in");
connection2.header(USER_AGENT, USER_AGENT_VALUE);
Response response = connection2.ignoreContentType(true).followRedirects(true).method(Method.POST).data(datas).cookies(res.cookies()).execute();
  • 最后一步:打印一下获得的html以及获得的cookies:
System.out.println(response.body());
Map<String, String> map = response.cookies();
for (String s : map.keySet()) {
    System.out.println(s + " : " + map.get(s));
}

完整代码:

package EDM;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

/** * @ClassName: login_final * @description: JSoup_Login * @author: KI * @Date: 2020年8月22日 下午1:16:07 */

public class Login_Test {
    
    public static void main(String[] args) throws Exception {
 
        Connection connection = Jsoup.connect("https://webvpn.ncepu.edu.cn/users/sign_in");
        connection.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36");
        Response res = connection.execute();
        Document d = Jsoup.parse(res.body()); 
        List<Element> elements = d.select("form");
 
        Map<String, String> datas = new HashMap<>();
        for (Element element : elements.get(0).getAllElements()) {
            // 设置用户名,这里不是login而是user[login]
            if (element.attr("name").equals("user[login]")) {
                element.attr("value", "************");
            }
            if (element.attr("name").equals("user[password]")) {
                element.attr("value", "******");
            }
            if (element.attr("name").length() > 0) {
                datas.put(element.attr("name"), element.attr("value"));
            }
        }
        //System.out.println(datas);
        Connection connection2 = Jsoup.connect("https://webvpn.ncepu.edu.cn/users/sign_in");
        connection2.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36");
        Response response = connection2.ignoreContentType(true).followRedirects(true).method(Method.POST)
                                .data(datas).cookies(res.cookies()).execute();
        //show
        System.out.println(response.body());
        Map<String, String> map = response.cookies();
        for (String s : map.keySet()) {
            System.out.println(s + " : " + map.get(s));
        }  
    }
}

相关文章