模拟登录系列3-java模拟登录网站-验证码破解

需求:每日会在指定文件夹下生成一个excl文件,系统需要定时读取该文件,根据这个生成文件的数据去匹配填充指定excl模板数据,excl模板文件每天也需要从指定网站下载,并完成上传到指定网站;
本文继上次百度开发者接口图文识别,来实现模拟登录网站;为后续自动化下载数据(爬虫),自动上传数据(数据自动报送)功能做准备 。本文不在叙述百度开发者中心接口调用过程,如果有不懂可以查看我的前面文章;本文主要实现网站破解,登录过程(如果有疑问或者要源码可以发送邮件给我 ),源码附在博客中了,在顶部↑↑↑↑ 。
【模拟登录系列3-java模拟登录网站-验证码破解】准备工作:
1、请确认百度开发者中心图文识别接口已经调用成功 。
2、准备需要模拟登录网站的相关信息:用户名,密码,登录url,验证码图片地址 。
准备完成后进入如下阶段,
首先在模拟对象网站上登录(调试模式,我使用的谷歌或者火狐,其他的也行,自己平时用啥就用啥);获取到登录请求相关信息,拿到请求信息后需要分析请求参数,是否需要户名,密码,验证码之外的参数,或者是否对这些参数有加密,有转码之类的 。
如果有加密、转码则需要研究模拟网站上的js代码,用调试模式打开,一般网站都会在js中有写这些代码,仔细研究一下即可发现 。我研究的网站涉及公司信息,我就不过多说明,我这个网站是新增参数token,ip信息;如下图;token的生成也在js中发现,那么只要我们在对应的java代码中实现即可;因每个网站不同,我这里就不过多的说明了 。
现在进入java代码阶段:

模拟登录系列3-java模拟登录网站-验证码破解

文章插图
我的项目代码结构,这里是为了做研究测试,全部放到一个包中了;
另外说明一下:百度图文识别对干扰码较多的无法做到识别,但是基本的图片都能搞定,所有对于复杂的我采用了公司其他验证码解析平台处理 。图片识别对比我在后面会有说明 。
如下我这里将登录所需要的参数均准备完成 。
String chars ="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";String time = new Date().getTime()+"";Random random=new Random();StringBuffer sb=new StringBuffer();for(int i=0;i<10;i++){int number=random.nextInt(48);sb.append(chars.charAt(number));}String token = sb.toString()+time;System.out.println("token:"+token);String ip="xxx.xxx.xxx.xxx";//你自己的公网ip,可以根据真实登录的时候获取,生产环境需要自己写代码去获取String usrId="xxxx";String usrPswd="xxxx";String verCodeName="verCode";String verCodeImg = "https://xxx.jsp?token="+token;String loginUrl="https://xxx?";Map param = new HashMap();param.put("token", token);param.put("userInfo.ip", ip);param.put("userInfo.usrId", usrId);param.put("userInfo.usrPswd", usrPswd);
建立登录服务类.java
package com.baidu.api;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.ConnectException;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;import java.util.UUID;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.apache.log4j.Logger;/*** 银行间产品净值日报* @author yangminit**/publicclass YHJCPJZRBServicelmp {// 封装后的private static final Logger mylog = Logger.getLogger(YHJCPJZRBServicelmp.class);protected String sysName = "";public static void main(String[] args) {}/*** 登录* * @param param*登录参数* @param url*登录地址* @param codeUrl*验证码地址* @param codeName*验证码名称* @return*/public ResponseEntity login(Map param, String url, String codeUrl, String codeName,String codeType) {//try {//if (!isOpenService(url)) {//mylog.info(sysName + "服务器已经关闭:" + url);//return new ResponseEntity(sysName + "服务器已经关闭:" + url, -1);//}//} catch (IOException e1) {//mylog.error("对方服务器未知异常");//e1.printStackTrace();//}System.out.println("进入方法--->");HttpPost post = new HttpPost(url);List qparams = new ArrayList();CloseableHttpClient client = null;HttpResponse response = null;try {// 重新登录策略for (int i = 1; i