java对接打码平台用selenium实现对图片验证码识别(对接文档看这一个就够了)

news2024/11/28 4:35:08

在很多平台软件中,咱们登录之后都有一些验证,例如图片数字验证,还有现在流行的滑块验证码,点选验证码,这么复杂的事情,我们程序员当然要用程序的方式解决啦,所以也有一些平台提供了快捷验证的方式,在这里,博主就给大家分享一下,如何实现对图片数字的识别;
 

一、先看效果,再实战:

效果:

 

 data里面就有识别的数字,取出来就可以使用了,完美!

二、开始实操,我们得选一个打码平台

找了几圈,终于找到一个有免费使用次数的打码平台,非常不易【声明,博主这个真是网上找了很久才找到的,绝非打广告,铁子们也可以自行找一个,总体思路都差不多】

打码平台网址:云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 (jfbym.com)

1、注册账号我就不说了,然后进入个人中心

2、现在还没有免费积分,大家需要关注一下他这个右边的公众号,然后在公众号里面登录一下刚刚注册的账号就可以得到1000积分

 

3、上面做的这一切,是为了得到这个token,大家在网址首页也可以先对图片进行一个识别测试,这个不需要对接,就可以看效果

4、这个时候就可以打开他的开发文档,里面都是一些接口,我们找到java开发文档

 

 

5、找到java开发文档后,里面都是一些代码,这些接口我们需要copy到我们的idea编辑器中,方便我们后续调用

import cn.hutool.json.JSONArray;
import com.alibaba.fastjson.JSONObject;
import net.dongliu.requests.Requests;
import sun.misc.BASE64Encoder;
import java.util.HashMap;
import java.util.Map;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

//dependencies: net.dongliu.requests,com.alibaba.fastjson

public class YdmVerify {

    private static final String CustomUrl = "https://www.jfbym.com/api/YmServer/customApi";
    private static final String Token = "";
    Map headers = new HashMap<>();


    public YdmVerify() {
        headers.put("Content-Type", "application/json");
    }
    /// 所有image 参数皆为 图片字节流base64之后的的字符串

    public String commonVerify(String imageContent) {
        // # 数英汉字类型
        // # 通用数英1-4位 10110
        // # 通用数英5-8位 10111
        // # 通用数英9~11位 10112
        // # 通用数英12位及以上 10113
        // # 通用数英1~6位plus 10103
        // # 定制-数英5位~qcs 9001
        // # 定制-纯数字4位 193
        // # 中文类型
        // # 通用中文字符1~2位 10114
        // # 通用中文字符 3~5位 10115
        // # 通用中文字符6~8位 10116
        //# 通用中文字符9位及以上 10117
        //# 定制-XX西游苦行中文字符 10107
        // # 计算类型
        //# 通用数字计算题 50100
        // # 通用中文计算题 50101
        // # 定制-计算题 cni 452
        String verify_type;
        verify_type = "10110";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("image", imageContent);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;
    }

    public String slideVerify(String slideImage, String backgroundImage) {
        // # 通用滑块
        // # 请保证购买相应服务后请求对应 verify_type
        // # verify_type="20111" 单次积分
        // # slide_image 需要识别图片的小图片的base64字符串
        // # background_image 需要识别图片的背景图片的base64字符串(背景图需还原)
        String verify_type;
        verify_type = "20101";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("slide_image", slideImage);
        jsonObject.put("background_image", backgroundImage);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;
    }

    public String sinSlideVerify(String Image) {
        // # 通用单图滑块(截图)  20110
        // # 请保证购买相应服务后请求对应 verify_type
        // # verify_type="20110" 单次积分
        String verify_type;
        verify_type = "20110";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("image", Image);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;
    }


    public String trafficSlideVerify(String seed, String data, String href) {
        // # 定制-滑块协议slide_traffic  900010
        String verify_type;
        verify_type = "900010";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("seed", seed);
        jsonObject.put("data", data);
        jsonObject.put("href", href);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;
    }


    public String clickVerify(String image, String extra) {
        // # 通用任意点选1~4个坐标 30009
        // # 通用文字点选1(extra,点选文字逗号隔开,原图) 30100
        // # 定制-文字点选2(extra="click",原图) 30103
        // # 定制-单图文字点选 30102
        // # 定制-图标点选1(原图) 30104
        // # 定制-图标点选2(原图,extra="icon") 30105
        // # 定制-语序点选1(原图,extra="phrase") 30106
        // # 定制-语序点选2(原图) 30107
        // # 定制-空间推理点选1(原图,extra="请点击xxx") 30109
        // # 定制-空间推理点选1(原图,extra="请_点击_小尺寸绿色物体。") 30110
        // # 定制-tx空间点选(extra="请点击侧对着你的字母") 50009
        // # 定制-tt_空间点选 30101
        //# 定制-推理拼图1(原图,extra="交换2个图块") 30108
        //# 定制-xy4九宫格点选(原图,label_image,image) 30008
        //# 如有其他未知类型,请联系我们
        String verify_type;
        verify_type = "30100";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("image", image);
        if (extra != null) {
            jsonObject.put("extra", extra);
        }
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;
    }

    ;

    public String Rotate(String image) {
        //# 定制-X度单图旋转  90007

        String verify_type;
        verify_type = "90007";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("image", image);
//        # 定制-Tt双图旋转,2张图,内圈图,外圈图  90004
//        verify_type = "90004";
//        jsonObject.put("out_ring_image", image);
//        verify_type = "90004";
//        jsonObject.put("inner_circle_image", image);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;

    }

    public String googleVerify(String googlekey, String pageurl) throws InterruptedException {
        //# googleVerify
        String data = null;
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("token", Token);
        jsonObject.put("type", "40010"); // v2
//        jsonObject.put("type", "40011");// v3
        jsonObject.put("googlekey", googlekey);
        jsonObject.put("pageurl", pageurl);
        jsonObject.put("enterprise", 0);
        jsonObject.put("invisible", 1);
        jsonObject.put("data-s", ""); //## V2+企业如果能找到,找不到传空字符串
        jsonObject.put("action", ""); //#V3必传
        jsonObject.put("min_score", ""); //#V3才支持的可选参数
        String jsonData;
        jsonData = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(jsonData);
        // # {'msg': '识别成功', 'code': 10000, 'data': {'code': 0, 'captchaId': '51436618130', 'recordId': '74892'}}
//        jsonData = "["+"{'msg': '识别成功', 'code': 10000, 'data': {'code': 0, 'captchaId': '51436618130', 'recordId': '74892'}}"+"]";
        jsonData = "[" + "{'msg': '识别成功', 'code': 10000, 'data': {'code': 0, 'captchaId': '51436618130', 'recordId': '74892'}}" + "]";
        JSONArray jsonArray = new JSONArray(jsonData);
        jsonData = "[" + jsonArray.getJSONObject(0).getObj("data") + "]";
        JSONArray jsonArray1 = new JSONArray(jsonData);
        String captchaId = (String) jsonArray1.getJSONObject(0).getObj("captchaId");
        String recordId = (String) jsonArray1.getJSONObject(0).getObj("recordId");
        System.out.println(captchaId);
        System.out.println(recordId);
        int times = 0;
        int is_solved = 0;
        while (times < 120 || is_solved == 0) {

            String url = "https://www.jfbym.com/api/YmServer/funnelApiResult";
            JSONObject jsonObject1 = new JSONObject();
            jsonObject1.put("token", Token);
            jsonObject1.put("captchaId", captchaId);
            jsonObject1.put("recordId", recordId);
            String readToText = Requests.post(url).headers(headers).jsonBody(jsonObject).send().readToText();
//            String readToText = "{'msg': '请求成功', 'code': 10001, 'data': {'data': '03AGdBq2611GTOg'}}";
            if (readToText.contains("结果准备中,请稍后再试")) {
                times += 5;
                Thread.sleep(5000);
                continue;

            }
            if (readToText.contains("请求成功")) {
                JSONArray jsonArray2 = new JSONArray("[" + readToText + "]");
                jsonData = "[" + jsonArray2.getJSONObject(0).getObj("data") + "]";
                data = (String) new JSONArray(jsonData).getJSONObject(0).getObj("data");
                is_solved = 1;
                System.out.println(data);
                break;

            }


        }

        return data;
    }


    public String HcaptchaVerify(String site_key, String site_url) {
        //# Hcaptcha
        //# 请保证购买相应服务后请求对应 verify_type
        //# verify_type="50001"
        String verify_type;
        verify_type = "50001";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("site_key", site_key);
        jsonObject.put("site_url", site_url);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;

    }


    public String FunCaptchaVerify(String site_key, String site_url) {
        //# Hcaptcha
        //# 请保证购买相应服务后请求对应 verify_type
        //# verify_type="40007"
        String verify_type;
        verify_type = "40007";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("publickey", site_key);
        jsonObject.put("pageurl", site_url);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", Token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        System.out.println(resp);
        return resp;

    }

    public static String ImageToBase64ByOnline(String imgURL) {
        ByteArrayOutputStream data = new ByteArrayOutputStream();
        try {
            // 创建URL
            URL url = new URL(imgURL);
            byte[] by = new byte[1024];
            // 创建链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5000);
            InputStream is = conn.getInputStream();
            // 将内容读取内存中
            int len = -1;
            while ((len = is.read(by)) != -1) {
                data.write(by, 0, len);
            }
            // 关闭流
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data.toByteArray());
    }


}


class YdmVerifyTest {


    public static void main(String[] args) throws IOException, InterruptedException {

       YdmVerify ydmVerify = new YdmVerify();
       String image_content = YdmVerify.ImageToBase64ByOnline("http://www.78gk.com/haoma/MTczMTM4NDI0MTE=");
       ydmVerify.commonVerify(image_content);
    }


};

 

6、接下来我们就来到程序中,映入眼帘的大家和我这个一样,有很多的报错,首先是包的问题,在开发文档中,没有包提供【我这个不是框架项目,是一个普通java项目】,所以需要我们自己把包找到,导入进来,关于需要哪些包,博主踩了很多坑,已经给大家准备好了,去网盘取就行了

链接:https://pan.baidu.com/s/1jyQz2pyKajs4QSlJsTHENg?pwd=ojyv 
提取码:ojyv

7、包放到lib目录里面,然后添加进来使用就行了

 8、在这里大家需要将自己的项目改成jdk11的版本,jdk8无法正常运行,会出现不兼容的问题,关于jdk8换成jdk11的相信大家没有问题,jdk11的执行文件我也放在了云盘,大家获取然后执行安装就行

链接:https://pan.baidu.com/s/1vQGpIkZ7550paEks3S9xfw?pwd=6zno 
提取码:6zno

9、大家将jdk改成11版本后,会出现一个代码问题,就是把图片转为base64会出错编码出错,这是因为版本升级后,有些文件也会改变

JDK中的/lib/tool.jar和/lib/rt.jar已经从Java SE 9中删除, 结果导致BASE64Encoder类找不到        

 解决方法:

import org.apache.commons.codec.binary.Base64
...
 
Base64.encodeBase64String(authorization);

用上面的代码替换

import sun.misc.BASE64Encoder;
 
...
 
BASE64Encoder encoder = new BASE64Encoder(); 
String base64Auth = encoder.encode(authorization);  

10、现在还差一个token,将云码官网的个人中心的token复制到代码之中,然后运行

运行效果如下:

 

对接第三方接口大家基本都会遇到这些问题,觉得有帮助的朋友多多支持! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch的读写更新数据流程

读数据流程 客户端向 Node1&#xff08;协调节点&#xff09; 发送获取请求。节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。为了负载均衡&#xff0c;可以轮询所有节点&#xff0c;最后它将请求转发到 Node 2 。Node 2 将文档返回给 N…

通达信接口最新版wind量化特征

通达信接口最新版wind量化特征 1、通达信接口最新版交易接口用于什么&#xff1f; MetaTrade.dll它是一个股票交易接口&#xff0c;可以用于股票程序交易。通过将你的交易策略编写为代码&#xff0c;并通过调用接口股票、撤单、查询&#xff0c;从而实现股票自动交易的程序化。…

【开发工具】Office Tool Plus 安装 Office

一、安装Office&#xff1a; 第一步&#xff1a;打开Office Tool Plus&#xff0c;没有的去官网下载&#xff1a; Office Tool Plus 官方网站 - 一键部署 OfficeOffice Tool Plus 是一个用于部署、激活 Office、Visio、Project 的小工具。借助本工具&#xff0c;你可以快速地…

web前端期末大作业——开心旅游网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

STM32F4 | SYSTEM文件夹介绍 | delay文件夹 | sys文件夹 | usart文件夹

文章目录一、delay 文件夹代码介绍1.delay_init 函数2.delay_us 函数3.delay_ms函数二、sys 文件夹代码介绍1.IO 口的位操作实现三、usart 文件夹代码介绍1.printf 函数支持在 新建工程模板——库函数版本中&#xff0c;我们用到了一个 SYSTEM 文件夹里面的代码&#xff0c;此…

基于java+springboot+mybatis+vue+mysql的智慧养老平台

项目介绍 随着社会的发展我国的人口老龄化严重&#xff0c;为了让这些在年前是给社会做出过贡献的老人老有所依&#xff0c;老有所养&#xff0c;度过一个安详的晚年&#xff0c;很多地方都实现了智慧养老&#xff0c;为此我们通过springbootvueelementUI 开发了本次基于java的…

1.用Python写了一个进销存管理的软件~需求分析界面设计数据库设计技术路线选择~

一、需求分析 总体来说&#xff0c;就是一个在游泳馆使用的进销存管理软件&#xff0c;记录商品的入库、出库情况&#xff0c;以及统计销售的金额等~ 整个系统有三类用户&#xff0c;系统管理员、公司管理员和公司销售员&#xff0c;系统管理员负责录入公司信息以及分配用户&…

ActiveMQ、RabbitMQ、RocketMQ、Kafka区别

1、4种消息中间件比较 特性ActiveMQRabbitMQRocketMQKafka开发语⾔javaerlangjavascala单机吞吐量万级万级10万级10万级时效性ms级us级ms级ms级以内可⽤性⾼(主从架构)⾼(主从架构)⾮常⾼(分布式架构)⾮常⾼(分布式架构)功能特性 成熟的产品&#xff0c; 在很多公司得到应⽤&a…

FFmpeg - Windows下使用ShiftMediaProject方法编译FFmpeg

文章目录一、创建一个ShiftMediaProject文件夹二、下载ShiftMediaProject源码 &#xff08;以下操作最好都要翻墙&#xff09;三、下载其他头文件四、编译五、参考资料一、创建一个ShiftMediaProject文件夹 我创建在&#xff1a; C:\ShiftMediaProject 二、下载ShiftMediaPro…

【LeetCode题目详解】(一)27.原地移除元素、88.合并两个有序数组

目录 一、力扣第27题&#xff1a;原地移除元素 1.思路一&#xff1a; 2.思路二 3.思路三 二、力扣第88题&#xff1a;合并两个有序数组 1.思路一&#xff1a; 2.思路二&#xff1a; 3.思路三&#xff1a; 总结 一、力扣第27题&#xff1a;原地移除元素 题目链接&#xf…

基于YOLOv3的车辆号牌定位

01 OCR原理分析 本文中采用的车辆号牌识别部分的是采用CNNLSTMCTC组合而成&#xff0c;整个网络部分可以分为三个部分&#xff0c;首先是主干网络CNN用于提取字符的特征信息&#xff0c;其次采用深层双向LSTM网络在卷积特征的基础上提取文字或字符的序列特征&#xff0c;最终引…

基于java+springboot+mybatis+vue+mysql的校园台球厅人员与设备管理系统

项目介绍 校园台球厅人员与设备管理系统采用java技术&#xff0c;基于springboot框架&#xff0c;前端使用vue技术&#xff0c;mysql数据库进行开发&#xff0c;实现了以下功能&#xff1a; 本系统主要包括管理员和用户两个角色组成&#xff0c;主要包括以下功能&#xff1a;…

m基于LMMSE+turbo算法的信道估计均衡器误码率仿真,对比LS,DEF以及LMMSE三种均衡算法误码率

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 本文推导了符号间干扰&#xff08;ISI&#xff09;信道的矢量形状因子图表示。结果图具有树形结构&#xff0c;避免了现有图方法中的短周期问题。基于联合高斯近似&#xff0c;我们在LLR&#xf…

CUDA入门和网络加速学习(二)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识&#xff0c;正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享&#xff0c;方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. 基础矩阵乘法 下图是矩阵乘法的示意图&#xff0…

MySQL表的增删查改(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;MySQL 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 前面给大家分享了关于数据库的一些基本的操作&#xff0c;今天分享的是数据库的核心内容&#xff0c;那就是我们常说的增删查改&#xff0c;也是我们数…

达梦数据库,备份目录冲突

问题描述 达梦数据库执行全库备份&#xff0c;BACKUP DATABASE FULL BACKUPSET ‘/data_share/data_back’; 提示备份目录冲突 解决办法 指定的目录必须为一个空目录。 下图&#xff0c;我指定的目录下有一个test文件夹&#xff0c;所以导致失败&#xff0c;把test文件删除m

[附源码]Python计算机毕业设计SSM基于WEB的网上零食销售系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python OpenCV中的图像阈值处理

1 前言 上一篇介绍了用C如何对一幅图像进行阈值处理&#xff0c;本篇接着用python来做同样的事情。 图像阈值处理是很多高级算法的底层逻辑之一&#xff0c;比如在做图形检测&#xff0c;轮廓识别时&#xff0c;常常会先对图像进行阈值处理&#xff0c;然后再进行具体的检测或…

FreeRTOS使用 — 合理使用内存 “ 任务中创建任务 ”

前言 在我们学习 RTOS 的过程中&#xff0c;很多朋友都不会遇到内存不够的问题&#xff0c;因为大部分的开发板使用的芯片对学习来说&#xff0c;内存 “足够大” 。所以基本上很多人学会了基本功能&#xff0c;到了实际工作中使用&#xff0c;往往会遇到内存不够的问题&#…

pikachu靶场-10 XXE漏洞

XXE漏洞 概述 XXE -“xml external entity injection” 既"xml外部实体注入漏洞"。 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题" 也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严…