帮人做的,后来因为一个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扫码枪技术详解】 Java扫码枪技术是Java在物联网(IoT)和Web应用领域中的一个重要应用,它使得用户可以通过扫码枪设备读取条形码或二维码中的数据,并将其集成到应用程序中进行处理。本DEMO项目展示了如何在...
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基础入门教程 Java程序语言设计 01 java语言基础 Java语言概述(共24页).ppt 完整版 Java基础入门教程 Java程序语言设计 02 java语法基础 Java语法基础(共32页).ppt 完整版 Java基础入门教程 Java程序...
通过上述步骤,我们可以在Java中实现一个基于日期和流水号的订单号生成器。对于提供的`java订单号(时间加流水号).txt`文件,可能包含了具体的代码实现或使用示例,你可以查阅该文件以获取更详细的实现细节。在实际...
java程序编写获取扫码枪扫码程序,并将扫码枪扫码有数据库MySQL数据进行对比预警,解决相关行业使用扫码枪进行出货重复使用相关商品码问题。该程序连接MySQL数据库,可同时部署到多台机器上进行设备比对。底层也实现...
扫码点餐java后台+小程序源码
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编程语言实现的简单词汇查询工具,它允许用户在命令行界面中执行单词查询和添加等基本操作。这个项目为初学者提供了了解和实践面向对象编程、文件处理以及用户交互设计的平台...
《廖雪峰 Java教程文档》是一份全面且深入的Java编程学习资料,旨在帮助初学者和进阶者掌握Java这门强大的编程语言。这份离线文档由知名技术博主廖雪峰精心编写,以其清晰易懂的讲解风格和实战导向的教学理念,深受...
Java基础入门教程 Java编程技术01 java概述(2学时)(共27页).ppt Java基础入门教程 Java编程技术02 Java编程基础(4学时)(共55页).ppt Java基础入门教程 Java编程技术03 数组(2学时)(共22页).ppt Java基础入门...