java分别通过httpclient和HttpURLConnection获取图片验证码内容

前面的文章,介绍了如何通过selenium+Tesseract-OCR来识别图片验证码,如果用接口来访问的话,再用selenium就闲的笨重,下面就介绍一下分别通过httpclient和HttpURLConnection,用流的方式获取图片验证码内容。

1.通过HttpURLConnection

复制代码
package com.imgyzm;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.openqa.selenium.io.FileHandler;

/** 
 * @author QiaoJiafei 
 * @version 创建时间:2015年11月9日 上午11:31:14 
 * 类说明 
 */
public class GetYZMByURL {
    public static void main(String[] args) throws Exception {
        getYzm();
    }
    
    public static String getYzm() {
        //new一个URL对象
        URL url;
        String s="";
        try {
            url = new URL("http://172.16.30.226:8099/bms/checkcode.do?0.9858807739801705");
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            //设置请求方式为"GET"
            conn.setRequestMethod("GET");
            //超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            //通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            //得到图片的二进制数据,以二进制封装得到数据,具有通用性
            byte[] data = readInputStream(inStream);
            //new一个文件对象用来保存图片,默认保存当前工程根目录
            File imageFile = new File("D:/BeautyGirl.jpg");
            //创建输出流
            FileOutputStream outStream = new FileOutputStream(imageFile);
            //写入数据
            outStream.write(data);
            //关闭输出流
            outStream.close();
            
            Runtime rt = Runtime.getRuntime();
            rt.exec("cmd.exe /C  tesseract.exe D:\\BeautyGirl.jpg  D:\\ddd\\yzm -1 ");
            Thread.sleep(1000);
            File file = new File("D:\\ddd\\yzm.txt");
            if(file.exists()) {
                FileHandler fh = new FileHandler();
                s = fh.readAsString(file).trim();
                System.out.println("========="+s);
            } else {
                System.out.print("yzm.txt不存在");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return s;
        //打开链接
        
    }
    public static byte[] readInputStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度,如果为-1,代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while( (len=inStream.read(buffer)) != -1 ){
            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }
}
复制代码

2.通过HttpClient

复制代码
package com.imgyzm;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.util.EntityUtils;
import org.openqa.selenium.io.FileHandler;

/** 
 * @author QiaoJiafei 
 * @version 创建时间:2015年11月9日 上午10:53:11 
 * 类说明 
 */
public class GetYZMByHttpClient {
    public static void main(String args[]) throws Exception {
        
        String s="";
        HttpClient httpclient = new DefaultHttpClient(new PoolingClientConnectionManager());
        String imgurl = "http://172.16.30.226:8099/bms/checkcode.do?0.9858807739801705";
        HttpGet ht = new HttpGet(imgurl);
        HttpResponse response = null;
        response = httpclient.execute(ht);
        HttpEntity entity = response.getEntity();
        InputStream inStream = entity.getContent();
        byte[] data = readInputStream(inStream);
        //new一个文件对象用来保存图片,默认保存当前工程根目录
        File imageFile = new File("D:/yzm.jpg");
        //创建输出流
        FileOutputStream outStream = new FileOutputStream(imageFile);
        //写入数据
        outStream.write(data);
        //关闭输出流
        outStream.close();
        
        Runtime rt = Runtime.getRuntime();
        rt.exec("cmd.exe /C  tesseract.exe D:\\yzm.jpg  D:\\ddd\\yzm -1 ");
        Thread.sleep(1000);
        File file = new File("D:\\ddd\\yzm.txt");
        if(file.exists()) {
            FileHandler fh = new FileHandler();
            s = fh.readAsString(file).trim();
            System.out.println("========="+s);
        } else {
            System.out.print("yzm.txt不存在");
        }
        
        
        /*===========下面是登录接口==========*/
        String url = "http://172.16.30.226:8099/bms/staff/login.do?account=admin123&checkcode="+s+"&pwd=aaaaaa1";
        System.out.println("url=========="+url);
        HttpPost httppost = new HttpPost(url);
        response = httpclient.execute(httppost);
        entity = response.getEntity();
        s = EntityUtils.toString(entity, "UTF-8");
        System.out.println(s);
        
    //打开链接
    }
    public static byte[] readInputStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度,如果为-1,代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while( (len=inStream.read(buffer)) != -1 ){
            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }
}
复制代码

那么这两种方式有什么区别呢,通过测试,使用HttpURLConnection获取验证码,再被其它接口调用的时候,该验证码已经失效了。而httpclient,只要保证程序接口调用和获取验证码用的是同一个httpclient,获取到的验证码,再被其它接口调用,该验证码仍生效。

保存图片也可以用下面的方法,更简便一些

response = client.execute(httpget);
            entity = response.getEntity();
            InputStream  in = entity.getContent();
            BufferedImage input = ImageIO.read(in);
            ImageIO.write(input, "jpg", new File("D:/11.jpg"));   

 

 

HTPPCLIENT API:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/

posted on   乔叶叶  阅读(4067)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示