JSoup - 在网页上登录,会话已过时

时间:2016-10-27 21:53:45

标签: java jsoup

我试图登录网络聊天服务(遗憾的是没有英文版)

http://czat.wp.pl/i,1,chat.html

堆栈溢出已经存在多个线程,它们展示了如何使用JSoup库执行此类操作。

或多或少应按以下方式完成:

String url = "http://czat.wp.pl/i,1,chat.html";

Connection.Response loginForm = Jsoup.connect(url)
.method(Connection.Method.GET)
.execute();

Document document = Jsoup.connect(url)
.data("i", "1")
.data("nick", "SomeFancyNickname")
.data("simg", "someCaptcha")
.data("regulamin", "tak")
.data("auth", "nie")
.cookies(loginForm.cookies())
.post();

问题是,每次收到相同的消息时,该会话都已过时。

这是一个与cookie有关的问题吗?我错过了什么吗?

我认为它与javascript无关,因为它适用于具有禁用java脚本的浏览器。

1 个答案:

答案 0 :(得分:0)

<强>问题

虽然似乎设置了所有需要的cookie,但请求会重定向回到表单。仔细查看请求,您会注意到cookie值的变化以及它是由验证码图像的请求引起的。

<强>修正

因此我们需要对验证码图像的额外请求(请参阅示例代码中的Jsoup.connect(imageUrl)...)来获取新的cookie值,当我们处理它时,我们可以存储图像以供读取/处理。

示例代码

String url = "http://czat.wp.pl/i,1,chat.html";
Map<String, String> cookies;
String userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36";

try {
    Response response = Jsoup.connect(url).userAgent(userAgent).header("Host", "czat.wp.pl").execute();
    URL redirectUrl = response.url();

    cookies = response.cookies();

    String imageUrl = response.parse().select("#secImg > img").attr("abs:src").toString();

    // get captcha image and new cookies 
    System.out.println("Insert captcha code: ");

    response = Jsoup.connect(imageUrl).userAgent(userAgent).cookies(cookies).ignoreContentType(true)
            .header("Referer", redirectUrl.toString()).header("Host", "si.wp.pl")
            .header("Origin", "http://czat.wp.pl").execute();

    byte[] bytes = response.bodyAsBytes();
    BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));

    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new FlowLayout());
    frame.getContentPane().add(new JLabel(new ImageIcon(image)));
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);

    Scanner scanner = new Scanner(System.in);
    String captcha = scanner.nextLine();

    scanner.close();
    frame.setVisible(false);
    frame.dispose();

    cookies.putAll(response.cookies());

    // login
    String nick = "HalloWorld"; // change

    Document doc = Jsoup.connect(url).userAgent(userAgent).cookies(cookies).data("i", "1").data("auth", "nie")
            .data("nick", nick).data("regulamin", "tak").data("simg", captcha)
            .header("Origin", "http://czat.wp.pl").header("Referer", "http://czat.wp.pl/i,1,chat.html")
            .post();

    if(doc.getElementById("alert") != null){
        System.err.println(doc.getElementById("alert").text());
    }else{
        // do something useful
        System.out.println(doc.text());
    }

} catch (IOException e) {
    e.printStackTrace();
}

截断输出

Ogólna - Czat - Platforma nowych znajomości - WP.PL Poczta | TopNews | WP [...]

显然,警报消息已经消失,我们有一个有效的会话。

相关问题