java模拟有验证码的Http登陆

所需资源下载链接(资源免费,重在分享)

Tesseract:http://download.csdn.net/detail/chenyangqi/9190667

jai_imageio-1.1-alpha,swingx-1.0:http://download.csdn.net/detail/chenyangqi/9190683

HttpWatch Professional:http://download.csdn.net/detail/chenyangqi/9208339

HttpClient.jar codec.jar logging.jar:http://download.csdn.net/detail/chenyangqi/9208315

简介:

模拟如下登陆页面,需要大家自行掌握HttpWatch使用方法

OCR-Tesseract如何识别验证码可参考我的另一篇博客http://www.cnblogs.com/chenyangqi/p/4906282.html

  

一:

使用eclipse建一个项目,引入OCR-Tesseract 和HttpClient所要使用的几个jar包(jar包在文章开头已提供了下载链接)

  项目思路:

  1:第一次Http请求验证码URL(一般是get请求)下载验证码到本地,通过OCR-Tesseract识别,返回验证码,并保存Cookie

    一下是HttpWatch中验证码URL的请求抓包,只需要使用get方式和URL地址。

    

  2:第二次Http请求登陆URL(一般是post请求)发送HttpWatch中的Postdata一栏中的数据。同步Cookie,并返回Inputstream数据

     

  3:请求成功,匹配返回的InputStream数据,若有匹配则登陆成功。

    这就是返回的数据和预期的是否一样了,返回的数据在HttpWatch里面的Content可看到,对比一下请求成功和失败的不同,可以使用SubString看有没有匹配的,或者是正则表达式

二:难点解决

要实现登陆最重要的就是验证码识别和Cookie同步的问题了,验证码识别在我的另一篇博客已解决http://www.cnblogs.com/chenyangqi/p/4906282.html

  所以只剩下Cookie的问题了,之前使用的是HttpConnection老是Cookie不同步,后面换了HttpClient(使用HttpClient需应用HttpClient.jar codec.jar logging.jar三个jar包,可在文章开头处下载),HttpClient对象可以很好的管理

  Cookie和请求头。所以Cookie的读取和同步,我们不需要操作,只要保证是同一个HttpClient对象就ok了,所以定义HttpClient为全局变量比较好,也注意避免多线程造成HttpClient对象变化,应为HttpClient对象一变化Cookie也就变了

  无法同步Cookie造成登陆失败。

三:代码实现:

  

package com.cyq.request;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Scanner;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class RequestMain {static HttpClient client = new HttpClient();

    public static void main(String[] args) {
         Init();
    }

    private static void Init() {
        getImage("用户名","密码");
    }

    private static void getImage(String name_get, String password_get) {
        GetMethod get = new GetMethod(
                "验证码URL地址");
        try {
            client.executeMethod(get);
            File storeFile = new File("D:/verifycode.jpg");//验证码暂存本地位置
            FileOutputStream output = new FileOutputStream(storeFile);
            InputStream is = get.getResponseBodyAsStream();
            FileOutputStream fos = new FileOutputStream(storeFile);
            byte[] b = new byte[1024];
            while ((is.read(b)) != -1) {
                fos.write(b);
            }
            is.close();
            fos.close();
            String codeVal = getCode();
            try {
                String code = codeVal.substring(0, codeVal.indexOf("\n") - 1);
                postRequest(name_get, password_get, code);
            } catch (Exception e) {
                System.out.println("e" + name_get + "验证码错误");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void postRequest(String name_data, String password_data,
            String code) {
        PostMethod postMethod = new PostMethod(
                "登陆时的post请求URL地址");
        NameValuePair[] data = { new NameValuePair("act", "add"),
                new NameValuePair("name", name_data),
                new NameValuePair("password", password_data),
                new NameValuePair("verify", code) };
        postMethod.setRequestBody(data);
        try {
            client.executeMethod(postMethod);
            String text = postMethod.getResponseBodyAsString();
            // 匹配结果集中是否有匹配的字符串
            if (text.indexOf("self.location=‘../../../module/webcontent/web/index_self.jsf") >= 0) {
                RESULT_DATA.add("用户名:"+name_data+" 密码:"+password_data);
                WriteResultToFile("用户名:"+name_data+" 密码:"+password_data);
                System.out.println("用户名" + name_data + "成功");
            } else {
                System.out.println("用户名" + name_data + "失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String getCode() {
        String valCode = null;
        String path = "d://verifycode.jpg";
        try {
            valCode = new OCR().recognizeText(new File(path), "jpg");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return valCode;
    }
}

  好啦,over,。

声明:该博文为博主原创,转载请注明出处

   本程序模拟仅用于学习,请勿使用该内容从事违法活动和暴力破解活动

   

时间: 2024-10-12 04:00:54

java模拟有验证码的Http登陆的相关文章

Jsoup实现java模拟登陆

Jsoup实现java模拟登陆 1:如何获取cookies. 1.1:由于需要登录,故先模拟登陆时的那一个<form>,这里用map来装载变量名称,变量值. Map<String, String> map = new HashMap<String, String>(); map.put("username", username); map.put("pwd", md5.getMD5ofStr(password)); map.put

Java 如何使用 OCR 技术识别验证码实现自动化登陆

如论实施敏捷的团队,或者实施 DevOps 的团队,通过自动化测试提高测试效率和软件质量都是其共同的选择.UI 自动化测试是自动化化测试当中的重要环节,在 UI 自动化测试中验证码识别一直是令自动化测试人员头疼的问题.今年来随着 OCR 技术.人工智能计算机视觉(AI Computer Vision)技术的成熟与使用大大提高了验证码的识别成功率.从而使得自动识别验证码自动化登陆目标系统成为可能. 本 Chat 主要内容包括: OCR 技术与人工智能计算机视觉(AI Computer Vision

java实现图片验证码登陆

java实现图片验证码登陆 话不多说 直接上图 ↓↓↓↓↓↓↓↓↓↓ 成果图 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓ 差不多这就是演示图啦 如需源码请联系QQ:11234013 可手把手讲解知识点 原文地址:https://www.cnblogs.com/zhetiankj/p/12641439.html

从session实现机制分析模拟请求验证码的可行性(转)

悲剧了,发现写完这篇blog没有配上这个格调超高的标题. 1.0问题背景 现在要实现一个带验证码网站的的自动登陆功能.验证码识别过程不再这篇文章的讨论之中.(之后有篇文章我会详细的总结验证码的识别过程).现在问题来了,怎么拿到你本次请求登陆页面的验证码图片? 2.0方案分析 现在有几种思路: (1)请求登陆页面,截取验证码图片,类似截屏,seleinum,webbrower的DrawToBitmap()等. (2)还是webbrower,将图片复制到剪切板在从剪切板中搞出来 HTMLContro

java自动生成验证码

代码结构: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

Java模拟生产者消费者问题

一.Syncronized方法详解 解决生产者消费这问题前,先来了解一下Java中的syncronized关键字. synchronized关键字用于保护共享数据.请大家注意"共享数据",你一定要分清哪些数据是共享数据,如下面程序中synchronized关键字保护的不是共享数据(其实在这个程序中synchronized关键字没有起到任何作用,此程序的运行结果是不可预先确定的).这个程序中的t1,t2是 两个对象(pp1,pp2)的线程.JAVA是面向对象的程序设计语言,不同的对象的数

java linux ImageIO 验证码在一段时间以后出不来 问题总结

最近在测试上布署的项目经常性的出现验证码过了一段时间以后出不来的情况,耐心找了一下,最后在上级的指导下发现了报错,其实说真的,我自己也找到了这个报错,只是没有当一回事.因为这个验证码的东西不是我写的,我也不知道这个报错是不是和它有关系. 错误如下: 2014-05-21 10:46:17,826 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request org.springfram

java模拟而一个电话本操作

哈哈,大家平时都在使用电话本,下面使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public class User { private String name; private String phoneNumber; private String companyName; private String email; private String address; private Strin

java模拟手动Telnet过程之需求说明和功能点说明

一.需求 (一)每五分钟查询一次交换机的连接情况: (二)每2.5分钟更新每栋楼的连接情况. 二.功能点 序号 功能点说明 待定 完成 未完成 完成时间 预计用时(min) 实际用时(min) 备注 1 登录口令加密以及解密         60     2 表的创建和IP以及口令写入数据库         10     3 java模拟手动Telnet交换机         90     4 获取目标字符串         30     5 表的创建与当前目标数据的写入         10