我试图登录网络聊天服务(遗憾的是没有英文版)
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脚本的浏览器。
答案 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 [...]
显然,警报消息已经消失,我们有一个有效的会话。