帮人做的,后来因为一个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开发中,对接扫码枪是一项常见的任务,特别是在零售、仓储和物流等领域。扫码枪能够快速读取条形码或二维码的信息,将其转化为数字信号,然后由计算机处理。本篇文章将详细讲解如何在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...
java实现扫码登录视频 网盘链接 https://pan.baidu.com/s/16hsqb2A7kAvPRCULjyW_yw
关于“mobook_v2.2”这个文件名,这可能是该Java电子书制作器的一个版本号。通常,版本号的更新意味着软件的改进,包括新功能的添加、性能优化或者错误修复。在使用这个版本时,用户可以期待比早期版本更好的用户...
在Windows平台上,使用Java进行后台开发时,与扫码枪交互是一项常见的需求。扫码枪作为一种便捷的数据输入设备,能够快速读取商品条形码或二维码信息,并将其转化为可处理的文本数据。本文将深入探讨如何在Java后台...
本篇将深入探讨如何利用Java实现扫码登录,以及涉及到的关键技术。 首先,扫码登录的核心原理是通过二维码作为信息载体,将用户的登录凭证(通常是临时生成的一次性授权码)编码成二维码,然后由用户通过手机扫描...
java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级架构师教程,java 高级...
本教程将探讨如何在Java中创建简单的动画,同时介绍进程的概念及其在实现动画中的应用。 首先,我们要了解Java中的动画基本原理。动画是通过连续显示一系列帧来创造出运动的假象。在Java中,我们可以使用`javax....
这个Java demo案例是专门为实现扫码枪与微信支付的集成而设计的,它提供了一个完整的流程示例,帮助开发者快速理解和实现这一功能。 1. **扫码枪技术原理**: 扫码枪通过读取条形码或二维码,将其中的信息转化为...
完整版 Java基础入门教程 Java程序语言设计 01 java语言基础 Java语言概述(共24页).ppt 完整版 Java基础入门教程 Java程序语言设计 02 java语法基础 Java语法基础(共32页).ppt 完整版 Java基础入门教程 Java程序...
java程序编写获取扫码枪扫码程序,并将扫码枪扫码有数据库MySQL数据进行对比预警,解决相关行业使用扫码枪进行出货重复使用相关商品码问题。该程序连接MySQL数据库,可同时部署到多台机器上进行设备比对。底层也实现...
完整版 Java基础入门教程 Java程序语言设计 01 java语言基础 Java语言概述(共24页).ppt 完整版 Java基础入门教程 Java程序语言设计 02 java语法基础 Java语法基础(共32页).ppt 完整版 Java基础入门教程 Java程序...
通过上述步骤,我们可以在Java中实现一个基于日期和流水号的订单号生成器。对于提供的`java订单号(时间加流水号).txt`文件,可能包含了具体的代码实现或使用示例,你可以查阅该文件以获取更详细的实现细节。在实际...
GitHub 上标星 115k+ 的 Java 教程 GitHub 上标星 115k+ 的 Java 教程 GitHub 上标星 115k+ 的 Java 教程 GitHub 上标星 115k+ 的 Java 教程 GitHub 上标星 115k+ 的 Java 教程 GitHub 上标星 115k+ 的 Java 教程 ...
本项目是基于Java的扫一扫点餐系统设计源码,包含258个文件,其中主要包含200个java源代码文件,10个html页面文件等。系统采用了Java、HTML、JavaScript和CSS技术,实现了一套用户餐厅点餐的系统。用户可以通过扫码...
扫码点餐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这门强大的编程语言。这份离线文档由知名技术博主廖雪峰精心编写,以其清晰易懂的讲解风格和实战导向的教学理念,深受...