在很多平臺軟件中,咱們登錄之后都有一些驗證,例如圖片數(shù)字驗證,還有現(xiàn)在流行的滑塊驗證碼,點選驗證碼,這么復(fù)雜的事情,我們程序員當(dāng)然要用程序的方式解決啦,所以也有一些平臺提供了快捷驗證的方式,在這里,博主就給大家分享一下,如何實現(xiàn)對圖片數(shù)字的識別;
?
一、先看效果,再實戰(zhàn):
效果:
?
?data里面就有識別的數(shù)字,取出來就可以使用了,完美!
二、開始實操,我們得選一個打碼平臺
找了幾圈,終于找到一個有免費使用次數(shù)的打碼平臺,非常不易【聲明,博主這個真是網(wǎng)上找了很久才找到的,絕非打廣告,鐵子們也可以自行找一個,總體思路都差不多】
打碼平臺網(wǎng)址:云碼-自動驗證碼識別平臺_驗證碼識別API接口_免費驗證碼軟件 (jfbym.com)
1、注冊賬號我就不說了,然后進(jìn)入個人中心
2、現(xiàn)在還沒有免費積分,大家需要關(guān)注一下他這個右邊的公眾號,然后在公眾號里面登錄一下剛剛注冊的賬號就可以得到1000積分
?
3、上面做的這一切,是為了得到這個token,大家在網(wǎng)址首頁也可以先對圖片進(jìn)行一個識別測試,這個不需要對接,就可以看效果
4、這個時候就可以打開他的開發(fā)文檔,里面都是一些接口,我們找到j(luò)ava開發(fā)文檔
?
?
5、找到j(luò)ava開發(fā)文檔后,里面都是一些代碼,這些接口我們需要copy到我們的idea編輯器中,方便我們后續(xù)調(diào)用
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 參數(shù)皆為 圖片字節(jié)流base64之后的的字符串
public String commonVerify(String imageContent) {
// # 數(shù)英漢字類型
// # 通用數(shù)英1-4位 10110
// # 通用數(shù)英5-8位 10111
// # 通用數(shù)英9~11位 10112
// # 通用數(shù)英12位及以上 10113
// # 通用數(shù)英1~6位plus 10103
// # 定制-數(shù)英5位~qcs 9001
// # 定制-純數(shù)字4位 193
// # 中文類型
// # 通用中文字符1~2位 10114
// # 通用中文字符 3~5位 10115
// # 通用中文字符6~8位 10116
//# 通用中文字符9位及以上 10117
//# 定制-XX西游苦行中文字符 10107
// # 計算類型
//# 通用數(shù)字計算題 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) {
// # 通用滑塊
// # 請保證購買相應(yīng)服務(wù)后請求對應(yīng) 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
// # 請保證購買相應(yīng)服務(wù)后請求對應(yīng) 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) {
// # 定制-滑塊協(xié)議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個坐標(biāo) 30009
// # 通用文字點選1(extra,點選文字逗號隔開,原圖) 30100
// # 定制-文字點選2(extra="click",原圖) 30103
// # 定制-單圖文字點選 30102
// # 定制-圖標(biāo)點選1(原圖) 30104
// # 定制-圖標(biāo)點選2(原圖,extra="icon") 30105
// # 定制-語序點選1(原圖,extra="phrase") 30106
// # 定制-語序點選2(原圖) 30107
// # 定制-空間推理點選1(原圖,extra="請點擊xxx") 30109
// # 定制-空間推理點選1(原圖,extra="請_點擊_小尺寸綠色物體。") 30110
// # 定制-tx空間點選(extra="請點擊側(cè)對著你的字母") 50009
// # 定制-tt_空間點選 30101
//# 定制-推理拼圖1(原圖,extra="交換2個圖塊") 30108
//# 定制-xy4九宮格點選(原圖,label_image,image) 30008
//# 如有其他未知類型,請聯(lián)系我們
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度單圖旋轉(zhuǎn) 90007
String verify_type;
verify_type = "90007";
JSONObject jsonObject = new JSONObject();
jsonObject.put("image", image);
// # 定制-Tt雙圖旋轉(zhuǎn),2張圖,內(nèi)圈圖,外圈圖 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+企業(yè)如果能找到,找不到傳空字符串
jsonObject.put("action", ""); //#V3必傳
jsonObject.put("min_score", ""); //#V3才支持的可選參數(shù)
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("結(jié)果準(zhǔn)備中,請稍后再試")) {
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
//# 請保證購買相應(yīng)服務(wù)后請求對應(yīng) 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
//# 請保證購買相應(yīng)服務(wù)后請求對應(yīng) 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 {
// 創(chuàng)建URL
URL url = new URL(imgURL);
byte[] by = new byte[1024];
// 創(chuàng)建鏈接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();
// 將內(nèi)容讀取內(nèi)存中
int len = -1;
while ((len = is.read(by)) != -1) {
data.write(by, 0, len);
}
// 關(guān)閉流
is.close();
} catch (IOException e) {
e.printStackTrace();
}
// 對字節(jié)數(shù)組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、接下來我們就來到程序中,映入眼簾的大家和我這個一樣,有很多的報錯,首先是包的問題,在開發(fā)文檔中,沒有包提供【我這個不是框架項目,是一個普通java項目】,所以需要我們自己把包找到,導(dǎo)入進(jìn)來,關(guān)于需要哪些包,博主踩了很多坑,已經(jīng)給大家準(zhǔn)備好了,去網(wǎng)盤取就行了
鏈接:https://pan.baidu.com/s/1jyQz2pyKajs4QSlJsTHENg?pwd=ojyv?
提取碼:ojyv
7、包放到lib目錄里面,然后添加進(jìn)來使用就行了
?8、在這里大家需要將自己的項目改成jdk11的版本,jdk8無法正常運行,會出現(xiàn)不兼容的問題,關(guān)于jdk8換成jdk11的相信大家沒有問題,jdk11的執(zhí)行文件我也放在了云盤,大家獲取然后執(zhí)行安裝就行
鏈接:https://pan.baidu.com/s/1vQGpIkZ7550paEks3S9xfw?pwd=6zno?
提取碼:6zno
9、大家將jdk改成11版本后,會出現(xiàn)一個代碼問題,就是把圖片轉(zhuǎn)為base64會出錯編碼出錯,這是因為版本升級后,有些文件也會改變
JDK中的/lib/tool.jar和/lib/rt.jar已經(jīng)從Java SE 9中刪除, 結(jié)果導(dǎo)致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、現(xiàn)在還差一個token,將云碼官網(wǎng)的個人中心的token復(fù)制到代碼之中,然后運行
運行效果如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-424925.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-424925.html
對接第三方接口大家基本都會遇到這些問題,覺得有幫助的朋友多多支持!?
到了這里,關(guān)于java對接打碼平臺用selenium實現(xiàn)對圖片驗證碼識別(對接文檔看這一個就夠了)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!