htmlunit 模拟登陆 验证码如何解决
我用htmlunit做一个网站模拟登陆程序,但是,遇到有需要输入验证码的就登陆不上去了,请问怎么获得验证码,然后和用户名、密码一块post。
提示:有的网页不需要验证码的,我试过可以登陆上去 --------------------编程问答-------------------- 据我所知,验证码就是防机器人的
坐等高人出现。。 --------------------编程问答-------------------- 我这纯属工作需求,绝对不是干非法的事,暂时还没有这个能力,呵呵!
没有高手指点吗?
我现在的思路是:让程序执行一半终止,通过返回登陆页面的html源码去查找验证码,然后手动输入验证码,然后程序继续执行。
不知道我的思路可行否,如果可行请高手给予指点,应该怎样才能让程序执行一半时停止?
--------------------编程问答-------------------- 我也遇到这样的问题。。 坐等 --------------------编程问答-------------------- 我遇到的问题是先需要把验证码拿回去,放到客户端,等待用户输入用户名,密码,然后我传入用户名和密码,验证码,还有sissionId,这个sessionId是在获取验证码的时候拿到的,但是不知道为什么,居然也是验证码错误。。
楼上的问题: 如果你只是想实现登录进去,可以借助Swing ,将验证码图片显示在你的屏幕上,然后给一个参数,输入验证码,再让程序继续就行。网上有很多的。 --------------------编程问答-------------------- 先用模拟浏览器获取到验证码图片,并在界面上显示出来。然后在界面上输入用户名、密码、验证码,然后用获取验证码的模拟浏览器发送登录请求,应该是可以能成功登录的。 --------------------编程问答--------------------
正解 先save到本地 然后找到验证码图片摆到输入界面上 今天下午正好在做这个 --------------------编程问答-------------------- 之前有人问过相似的问题。验证码的本质就是为了防止机器人这类操作的。现在有专门研究验证码破解算法的。比较简单的方法就是在你一次请求中把验证码保存下来,然后手动输入,最后一起提交你的数据。这样其实和手动输入没什么区别。 --------------------编程问答-------------------- 还要注意的是,验证码的请求不能请求第二次,不然你提交就不成功了! --------------------编程问答-------------------- htmlunit爬取网页没弄过,用过jsoup抓取过验证码。不知道对你有帮助没。
String image ="";
String code = "";
try {
URL connect = new URL("http://60.190.2.101/web/ValidateCode.aspx?type=ValidateCodeCMCX&t=2012/11/23");
URLConnection connection = connect.openConnection();
connection.setDoOutput(true);
InputStream input = connection.getInputStream();
Map<String, List<String>> headerMap = connection.getHeaderFields();
if(headerMap != null && headerMap.containsKey("Set-Cookie")) {
//content.setHttpHeadMap(headerMap);
for(String tmp: headerMap.get("Set-Cookie")){
if(tmp.indexOf("ASP.NET_SessionId") != -1){
out.println(tmp.split(";")[0].split("=")[1]);
code = tmp.split(";")[0].split("=")[1];
}
}
}
image = request.getSession().getServletContext().getRealPath("")+"/wap/hw/peace/code/image.jpg";
File file = new File(image);
//创建一个输出流
OutputStream out1 = new BufferedOutputStream(new FileOutputStream(file));
//每次的写入大小为:
int length=1024*1024;
byte[] a = new byte[length];
//如果大小大于length继续循环,否则值为-1
while((length=input.read(a))>0){
out1.write(a, 0, length);
}
//别忘了关闭流
input.close();
out1.close();
} catch(Exception e){
out.println(e.getMessage());
}finally {
}
Connection conn=Jsoup.connect("http://60.190.2.101/web/SearchNameForm.aspx");
Connection conn1 = Jsoup.connect("http://60.190.2.101/web/ValidateCode.aspx?type=ValidateCodeCMCX&t=2012/11/23");
Document doc =conn.ignoreContentType(true).get(); --------------------编程问答--------------------
第一步获取验证码是一个 webclient,第二部展示到客户端界面,用户输入,这个时候你的webclient应该是已经关闭了,那么第三步传入验证码,还有用户信息再用一个webclient,就登陆不上去了,这个就是其实验证码请求了两次的问题,请问你是怎么解决的呢
补充:Java , Web 开发