赞
踩
在很多平台软件中,咱们登录之后都有一些验证,例如图片数字验证,还有现在流行的滑块验证码,点选验证码,这么复杂的事情,我们程序员当然要用程序的方式解决啦,所以也有一些平台提供了快捷验证的方式,在这里,博主就给大家分享一下,如何实现对图片数字的识别;
找了几圈,终于找到一个有免费使用次数的打码平台,非常不易【声明,博主这个真是网上找了很久才找到的,绝非打广告,铁子们也可以自行找一个,总体思路都差不多】
打码平台网址:云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 (jfbym.com)
- 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);
- }
-
-
- };
链接:https://pan.baidu.com/s/1jyQz2pyKajs4QSlJsTHENg?pwd=ojyv
提取码:ojyv
链接:https://pan.baidu.com/s/1vQGpIkZ7550paEks3S9xfw?pwd=6zno
提取码:6zno
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);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。