帮人做的,后来因为一个dll经常崩溃的问题他不要~~那白做就白做了吧 把过程分享一下
流程不难:
导入一堆账号密码文件(这边用了txt 其实用数据库好点 可以做些标识) 然后模拟网页登陆 登录成功后获取需要的数据并保存.
这边需要的工具:
- httpcomponents:用于网络连接
- java4Less:用于验证码识别
- jsoup:用于提取网页内数据
java4Less的介绍在上一篇文章中有:
http://fair-jm.iteye.com/blog/1914076
流程:
获取表单详情
这个比较简单。登陆,一般就是提交表单登陆,我们只要获得到表单的数据和提交地址就可以提交。
这里有两个常用的方式:
1,用浏览器的开发者工具
2,用wireshark抓包 分析
一般第二种比较好用,因为能抓到所有的数据,易于分析。
但这边以1用chrome为例:
打开表单提交的地址(这边以http://passport.cdcgames.net/account/login.aspx 为例了)
打开chrome的开发者工具 选中network页
乱填点数据,然后提交
查看数据:
以上是表达提交的详情了
内容很简单 以上需要注意的内容也标明了 还有一个状态码也需要注意 特别是302的状态码(要获取头中的Location进行再次跳转才可以)
用现有的用户名-密码文件不断刷就可以了。验证码用java4Less解决。
判断是否登录成功就判断返回的字段就好了,这个网站比较简单,登录成功状态码是302,得到之后再发一次请求就可以获取到了。
这边要注意一个问题:需要在客户端保存状态,也就是HttpClient的cookiestore要被保存。
在获取验证码和登录成功后,如果用了新的HttpClient对象 那么一定要把旧的对象的cookiestore给他,不然就会失败(浏览器实现了这些细节,所以不需要担心登陆之后跳转显示未登录的情况(但其实我在用一些状态极差的网络中常常遇到这样的情况....))。
涉及到在不同的网页获取的话也只要设计一下cookiestore就行了,这样就不会出现未登录的提示。
连接的工具类:
把连接的工具类发一下 不难:
package test.cc.util; //省略导包 /** * http的操作类 * * @author cc(fair_jm) * http://fair-jm.iteye.com */ public class HttpUtil { private String path = ""; private String action = ""; private CookieStore cookieStore = null; public HttpResponse sendGetTo(Map<String, String> map, String encoding) throws Exception { StringBuffer sb = new StringBuffer(); for (Map.Entry<String, String> entry : map.entrySet()) { BasicNameValuePair bv = new BasicNameValuePair(entry.getKey(), entry.getValue()); sb.append(entry.getKey()); sb.append("="); sb.append(entry.getValue()); sb.append("&"); } if (sb.length() > 0) { sb.substring(0, sb.length() - 1); } HttpGet get = new HttpGet(path + action + "?" + sb.toString()); DefaultHttpClient client = new DefaultHttpClient(); if (cookieStore != null) { client.setCookieStore(cookieStore); } HttpResponse response = client.execute(get); cookieStore = client.getCookieStore(); return response; } /** * * @param map * 传入的键值对 key=value的形式 * @param encoding * 传入的编码 * @throws Exception */ public HttpResponse sendPostTo(Map<String, String> map, String encoding) throws Exception { List<NameValuePair> list = new ArrayList<NameValuePair>(); for (Map.Entry<String, String> entry : map.entrySet()) { BasicNameValuePair bv = new BasicNameValuePair(entry.getKey(), entry.getValue()); list.add(bv); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encoding); HttpPost post = new HttpPost(path + action); System.out.println(path + action); post.setEntity(entity); DefaultHttpClient client = new DefaultHttpClient(); if (cookieStore != null) { client.setCookieStore(cookieStore); } HttpResponse response = client.execute(post); cookieStore = client.getCookieStore(); return response; } /** * * @param map * 传入的键值对 * @throws Exception */ public HttpResponse sendPostTo(Map<String, String> map) throws Exception { return this.sendPostTo(map, "utf-8"); } public HttpResponse sendGetTo(Map<String, String> map) throws Exception { return this.sendGetTo(map, "utf-8"); } /** * * @param stream * @return 输入流的内容 * @throws IOException */ private static String streamToString(InputStream stream, String encoding) throws IOException { ByteArrayOutputStream ba = new ByteArrayOutputStream(); byte[] bytes = new byte[512]; int len = 0; while ((len = stream.read(bytes)) != -1) { ba.write(bytes, 0, len); } return new String(ba.toByteArray(), encoding); } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public void setAction(String action) { this.action = action; } public String getAction() { return action; } public CookieStore getCookieStore() { return cookieStore; } public void setCookieStore(CookieStore cookieStore) { this.cookieStore = cookieStore; } public void clearCookieStore() { this.cookieStore = null; } }
以及获取数据中的其中的一段:
while (true) { po.clearCookieStore(); po.setPath("http://passport.cdcgames.net/account/login.aspx"); // 这边填地址 hr = po.sendGetTo(new HashMap<String, String>()); String data1=null; int hrCode=hr.getStatusLine().getStatusCode(); if(hrCode==200){ data1=streamToString(hr.getEntity().getContent(),"utf-8"); }else{ // System.out.println("连接失败,状态码:"+hrCode); mes.setError(true); mes.setErrorCode("连接失败,状态码:"+hrCode); return mes; } // <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" // /> Pattern rex = Pattern.compile("value=\"(.*)\""); Matcher matcher = rex.matcher(data1); // System.out.println(data1); // System.out // .println("______________________________+++++++++++______________________"); String code = null; if (matcher.find()) { code = matcher.group(1); // System.out.println(code); } DefaultHttpClient client = new DefaultHttpClient(); client.setCookieStore(po.getCookieStore()); HttpGet get = new HttpGet( "http://passport.cdcgames.net/VerifyCode.aspx"); HttpResponse res = client.execute(get); String verify = OCRTestMine.getVerifyText(res.getEntity() .getContent()); po.setPath("http://passport.cdcgames.net/account/login.aspx"); HashMap<String, String> has = new HashMap<String, String>(); has.put("__EVENTTARGET", "LB_Login"); has.put("__EVENTARGUMENT", ""); has.put("__VIEWSTATE", code); has.put("TB_userid", userTrueName); has.put("TB_password", userPass); has.put("TB_rand", verify); hr2 = po.sendPostTo(has); String data2=""; int hr2Code=hr2.getStatusLine().getStatusCode(); if(hr2Code==302){ break; //302表示登陆成功执行跳转 }else{ if(hr2Code==200){ data2=streamToString(hr2.getEntity().getContent(), "utf-8"); }else{ // System.out.println("连接出错,状态码:"+hr2Code); mes.setError(true); mes.setErrorCode("连接出错,状态码:"+hr2Code); return mes; } } // System.out // .println("______________________________+++++++++++______________________"); boolean verifyFail = false; boolean passAndNameFail = false; verifyFail = data2.indexOf("验证码不正确") != -1; passAndNameFail = data2.indexOf("账号或密码错误") != -1; // System.out.println("验证码不正确:" // + (verifyFail = data2.indexOf("验证码不正确") != -1)); // System.out.println("账户或密码错误:" // + (passAndNameFail = data2.indexOf("账号或密码错误") != -1)); if (verifyFail) { if (failTime < 5) { failTime++; continue; } else { // System.out.println("验证码错误5次,退出"); mes.setVerifyError(true); mes.setErrorCode("验证码错误5次,退出"); return mes; } } if (passAndNameFail) { // System.out.println("账户或密码错误"); mes.setPassError(true); return mes; } break; }
数据获取:
获取数据的话用jsoup完成,主要观察包含数据的html元素是否有id(因为有id获取最方便)
过程就不多说 毕竟用jsoup完成的话是很轻松的事
相关推荐
在实际应用中,Java 3D广泛应用于科学可视化、教育、金融数据表示、医疗教育、地理信息系统(GIS)、计算机辅助设计(CAD)、数据分析、3D标志设计、天文学以及动画制作等多个领域。例如,科学家可以使用Java 3D来...
在Java开发中,对接扫码枪是一项常见的任务,特别是在零售、仓储和物流等领域。扫码枪能够快速读取条形码或二维码的信息,将其转化为数字信号,然后由计算机处理。本篇文章将详细讲解如何在Java中创建一个工具类来...
java IO教程,java IO教程,java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程,java IO教程,java IO教程,java IO...
在Windows平台上,使用Java进行后台开发时,与扫码枪交互是一项常见的需求。扫码枪作为一种便捷的数据输入设备,能够快速读取商品条形码或二维码信息,并将其转化为可处理的文本数据。本文将深入探讨如何在Java后台...
java制作动画 java制作动画
本篇将深入探讨如何利用Java实现扫码登录,以及涉及到的关键技术。 首先,扫码登录的核心原理是通过二维码作为信息载体,将用户的登录凭证(通常是临时生成的一次性授权码)编码成二维码,然后由用户通过手机扫描...
java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级...
《Java简易教程》是一份专为初学者设计的教育资源,其...通过这个简易教程,学习者将获得扎实的Java编程基础,能编写简单的程序并逐渐掌握更复杂的开发技能。这份教程的结构清晰,内容全面,是初学者理想的自学资料。
Java简易教程是为初学者设计的一系列学习资料,旨在帮助新手快速掌握Java编程语言的基础概念和核心语法。Java是一种广泛使用的、面向对象的编程语言,以其跨平台的特性、强大的功能和良好的可移植性而备受青睐。这个...
这个Java demo案例是专门为实现扫码枪与微信支付的集成而设计的,它提供了一个完整的流程示例,帮助开发者快速理解和实现这一功能。 1. **扫码枪技术原理**: 扫码枪通过读取条形码或二维码,将其中的信息转化为...
java程序编写获取扫码枪扫码程序,并将扫码枪扫码有数据库MySQL数据进行对比预警,解决相关行业使用扫码枪进行出货重复使用相关商品码问题。该程序连接MySQL数据库,可同时部署到多台机器上进行设备比对。底层也实现...
通过上述步骤,我们可以在Java中实现一个基于日期和流水号的订单号生成器。对于提供的`java订单号(时间加流水号).txt`文件,可能包含了具体的代码实现或使用示例,你可以查阅该文件以获取更详细的实现细节。在实际...
java web service 教程java web service 教程java web service 教程java web service 教程java web service 教程java web service 教程java web service 教程java web service 教程java web service 教程java web ...
完整版 Java高级教程 Java语言程序设计 第1章 输入输出流(共42页).ppt 完整版 Java高级教程 Java语言程序设计 第2章 Java多线程(共24页).ppt 完整版 Java高级教程 Java语言程序设计 第2章 哲学家的故事(共7页)...
i 理解 Java 是什么 i 了解 Java 能干什么 i 理解 Java 有什么 i 了解 Java 的历史、现状和特点 i 理解 Java 从代码到运行的过程 i 理解 Java 虚拟机的功能 ...i 编写、编译并运行简单的 Java 程序
java教程java教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zipjava教程入门.zip...
完整版 Java初级教程 Java语言程序设计 第1章 Java语言简介(共16页).ppt 完整版 Java初级教程 Java语言程序设计 第2章 基本数据类型、数组和枚举(共19页).ppt 完整版 Java初级教程 Java语言程序设计 第3章 ...
java实力教程,给网站制作的朋友参考,学习。下载
用java编写的简单文档编辑器,实现的文档的打开和简单java文件的编辑和运行