package org.cneng.httpclient; /** * request.Headers.Add("SID",软件id); request.Headers.Add("HASH",md5(软件id+软件key.ToUpper())); //32位MD5加密小写 request.Headers.Add("UUVersion","1.0.0.1"); ----没有登录之前,UserID就用100。登录成功后,服务器会返回UserID,之后的请求就用服务器返回的UserID request.Headers.Add("UID",UserID); ----没有登录之前,UserID就用100。登录成功后,服务器会返回UserID,之后的请求就用服务器返回的UserID request.Headers.Add("User-Agent", MD5(软件key.ToUpper() + UserID)); ----用户登录时候的特殊header: ----除了以上header之外,增加如下: ----MAC把特殊符号去掉,纯粹字母数字 request.Headers.Add("KEY",MD5(软件key.ToUpper()+UserName.ToUpper())+MAC); ----MAC把特殊符号去掉,纯粹字母数字 request.Headers.Add("UUKEY", MD5(UserName.ToUpper() + MAC + 软件key.ToUpper())); ----查分时候的特殊header: request.Headers.Add("UUAgent", MD5(UserKEY.ToUpper() + UserID + 软件KEY)); request.Headers.Add("KEY", UserKey); * * @author XiongNeng * @version 1.0 * @since 2015/2/2 */ import java.io.File; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.cneng.httpclient.Utils.*; import static org.cneng.httpclient.ConfigUtil.get; public class CheckCodeClient { private static final Logger _log = LoggerFactory.getLogger(CheckCodeClient.class); private static final CheckCodeClient instance = new CheckCodeClient(); private RequestModel model; private CheckCodeClient() { try { // 初始化配置文件和RequestModel ConfigUtil.getInstance(); model = new RequestModel(); model.setSwId(get("swId")); model.setSwKey(get("swKey")); model.setSwKeyUpper(get("swKeyUpper")); model.setMac(get("mac")); model.setUuVersion(get("uuVersion")); model.setUname(get("uname")); model.setPwmd5(Md5(get("pwmd5"))); model.setFlushServer(get("flushServers")); //--------------------------------------------- model.setFlushInternals(get("flushInternals")); model.setLoginServer(get("loginServer")); model.setUploadServer(get("uploadServer")); model.setResultServer(get("resultServer")); model.setBackupServer(get("backupServer")); //--------------------------------------------- model.setUserId(get("userId")); model.setUserKey(get("userKey")); model.setTimeout(get("timeout")); model.setVersion(get("version")); model.setType(get("type")); // 第一步:刷新服务器列表 String[] servers = getServers(); model.setFlushInternals(servers[0]); model.setLoginServer(servers[1]); model.setUploadServer(servers[2]); model.setResultServer(servers[3]); if (servers.length > 4) { model.setBackupServer(servers[4]); } // 第二步:登录 String[] userkeys = login(); model.setUserId(userkeys[0]); model.setUserKey(userkeys[1]); } catch (Exception e) { e.printStackTrace(); } } public static CheckCodeClient getInstance() { return instance; } /** * 验证码识别整个流程 * @param checkcodeFile 图片地址 * @return 验证码 */ public static String checkCode(String checkcodeFile) { try { String uploadResult = instance.upload(checkcodeFile); if (uploadResult.contains("|")) { return uploadResult.split("|")[1]; } else { return instance.getResult(uploadResult); } } catch (Exception e) { _log.error("checkCode出错了。"); } return null; } private String[] getServers() throws Exception { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpGet httpget = new HttpGet(model.getFlushServer()); //_log.info("Executing request " + httpget.getRequestLine()); // 所有请求的通用header: httpget.addHeader("SID", model.getSwId()); httpget.addHeader("HASH", Md5(model.getSwId() + model.getSwKeyUpper())); httpget.addHeader("UUVersion", model.getUuVersion()); httpget.addHeader("UID", model.getUserId()); httpget.addHeader("User-Agent", Md5(model.getSwKeyUpper() + model.getUserId())); // Create a custom response handler ResponseHandler<String> responseHandler = new ResponseHandler<String>() { public String handleResponse( final HttpResponse response) throws ClientProtocolException, IOException { int status = response.getStatusLine().getStatusCode(); if (status >= 200 && status < 300) { HttpEntity entity = response.getEntity(); return entity != null ? EntityUtils.toString(entity) : null; } else { throw new ClientProtocolException("Unexpected response status: " + status); } } }; String responseBody = httpclient.execute(httpget, responseHandler); //_log.info("----------------------------------------"); //_log.info("responseBody=" + responseBody); return parseServers(responseBody); } finally { httpclient.close(); } } private String[] login() throws Exception { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpGet httpget = new HttpGet( "http://" + model.getLoginServer() + "/Upload/UULogin.aspx?U=" + model.getUname() + "&p=" + model.getPwmd5()); //_log.info("Executing request " + httpget.getRequestLine()); // 所有请求的通用header: httpget.addHeader("SID", model.getSwId()); httpget.addHeader("HASH", Md5(model.getSwId() + model.getSwKeyUpper())); httpget.addHeader("UUVersion", model.getUuVersion()); httpget.addHeader("UID", model.getUserId()); httpget.addHeader("User-Agent", Md5(model.getSwKeyUpper() + model.getUserId())); httpget.addHeader("KEY", Md5(model.getSwKeyUpper() + model.getUname().toUpperCase()) + model.getMac()); httpget.addHeader("UUKEY", Md5(model.getUname().toUpperCase() + model.getMac() + model.getSwKeyUpper())); // Create a custom response handler ResponseHandler<String> responseHandler = new ResponseHandler<String>() { public String handleResponse( final HttpResponse response) throws ClientProtocolException, IOException { int status = response.getStatusLine().getStatusCode(); if (status >= 200 && status < 300) { HttpEntity entity = response.getEntity(); return entity != null ? EntityUtils.toString(entity) : null; } else { throw new ClientProtocolException("Unexpected response status: " + status); } } }; String responseBody = httpclient.execute(httpget, responseHandler); //_log.info("----------------------------------------"); //_log.info(responseBody); return new String[]{responseBody.split("_")[0], responseBody}; } finally { httpclient.close(); } } /** * 上传文件 * * @return * @throws Exception */ private String upload(String filename) throws Exception { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://" + model.getUploadServer() + "/Upload/Processing.aspx"); //_log.info("Executing request " + httppost.getRequestLine()); // 所有请求的通用header: httppost.addHeader("SID", model.getSwId()); httppost.addHeader("HASH", Md5(model.getSwId() + model.getSwKeyUpper())); httppost.addHeader("UUVersion", model.getUuVersion()); httppost.addHeader("UID", model.getUserId()); httppost.addHeader("User-Agent", Md5(model.getSwKeyUpper() + model.getUserId())); FileBody IMG = new FileBody(new File(filename)); StringBody KEY = new StringBody(model.getUserKey().toUpperCase(), ContentType.TEXT_PLAIN); StringBody SID = new StringBody(model.getSwId(), ContentType.TEXT_PLAIN); StringBody SKEY = new StringBody(Md5(model.getUserKey().toLowerCase() + model.getSwId() + model.getSwKey()), ContentType.TEXT_PLAIN); StringBody Version = new StringBody(model.getVersion(), ContentType.TEXT_PLAIN); StringBody TimeOut = new StringBody(model.getTimeout(), ContentType.TEXT_PLAIN); StringBody Type = new StringBody(model.getType(), ContentType.TEXT_PLAIN); StringBody GUID = new StringBody(GetFileMD5(filename), ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create() .addPart("IMG", IMG) .addPart("KEY", KEY) .addPart("SID", SID) .addPart("SKEY", SKEY) .addPart("Version", Version) .addPart("TimeOut", TimeOut) .addPart("Type", Type) .addPart("GUID", GUID) .build(); httppost.setEntity(reqEntity); // Create a custom response handler ResponseHandler<String> responseHandler = new ResponseHandler<String>() { public String handleResponse( final HttpResponse response) throws ClientProtocolException, IOException { int status = response.getStatusLine().getStatusCode(); if (status >= 200 && status < 300) { HttpEntity entity = response.getEntity(); return entity != null ? EntityUtils.toString(entity) : null; } else { throw new ClientProtocolException("Unexpected response status: " + status); } } }; String responseBody = httpclient.execute(httppost, responseHandler); //_log.info("----------------------------------------"); _log.info("upload response=" + responseBody); return responseBody; } finally { httpclient.close(); } } /** * 轮询结果 * * @return * @throws Exception */ private String getResult(String checkId) throws Exception { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpGet httpget = new HttpGet("http://" + model.getResultServer() + "/Upload/GetResult.aspx?key=" + model.getUserKey() + "&ID=" + checkId); //_log.info("Executing request " + httpget.getRequestLine()); // 所有请求的通用header: httpget.addHeader("SID", model.getSwId()); httpget.addHeader("HASH", Md5(model.getSwId() + model.getSwKeyUpper())); httpget.addHeader("UUVersion", model.getUuVersion()); httpget.addHeader("UID", model.getUserId()); httpget.addHeader("User-Agent", Md5(model.getSwKeyUpper() + model.getUserId())); // Create a custom response handler ResponseHandler<String> responseHandler = new ResponseHandler<String>() { public String handleResponse( final HttpResponse response) throws ClientProtocolException, IOException { int status = response.getStatusLine().getStatusCode(); if (status >= 200 && status < 300) { HttpEntity entity = response.getEntity(); return entity != null ? EntityUtils.toString(entity) : null; } else { throw new ClientProtocolException("Unexpected response status: " + status); } } }; String responseBody = httpclient.execute(httpget, responseHandler); _log.info("getResult responseBody=" + responseBody); int count = 1; while ("-3".equals(responseBody)) { if (count++ > 30) { return null; } try { //_log.info("----getResult sleep----"); Thread.sleep(Long.parseLong(model.getFlushInternals())); responseBody = httpclient.execute(httpget, responseHandler); } catch (InterruptedException e) { e.printStackTrace(); } } //_log.info("----------------------------------------"); _log.info("验证码识别结果:" + responseBody); return responseBody; } finally { httpclient.close(); } } public static void main(String[] args) throws Exception { checkCode("D:/work/zpics/htCvixdiS_qk3LO7b4Ky3g.png"); } }