当前位置:   article > 正文

java对接打码平台用selenium实现对图片验证码识别(对接文档看这一个就够了)_java+selenium自动化测试获取验证码

java+selenium自动化测试获取验证码

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

一、先看效果,再实战:

效果:

 

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

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

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

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

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

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

 

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

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

 

 

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

  1. import cn.hutool.json.JSONArray;
  2. import com.alibaba.fastjson.JSONObject;
  3. import net.dongliu.requests.Requests;
  4. import sun.misc.BASE64Encoder;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import java.io.*;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. //dependencies: net.dongliu.requests,com.alibaba.fastjson
  11. public class YdmVerify {
  12. private static final String CustomUrl = "https://www.jfbym.com/api/YmServer/customApi";
  13. private static final String Token = "";
  14. Map headers = new HashMap<>();
  15. public YdmVerify() {
  16. headers.put("Content-Type", "application/json");
  17. }
  18. /// 所有image 参数皆为 图片字节流base64之后的的字符串
  19. public String commonVerify(String imageContent) {
  20. // # 数英汉字类型
  21. // # 通用数英1-4位 10110
  22. // # 通用数英5-8位 10111
  23. // # 通用数英9~11位 10112
  24. // # 通用数英12位及以上 10113
  25. // # 通用数英1~6位plus 10103
  26. // # 定制-数英5位~qcs 9001
  27. // # 定制-纯数字4位 193
  28. // # 中文类型
  29. // # 通用中文字符1~2位 10114
  30. // # 通用中文字符 3~5位 10115
  31. // # 通用中文字符6~8位 10116
  32. //# 通用中文字符9位及以上 10117
  33. //# 定制-XX西游苦行中文字符 10107
  34. // # 计算类型
  35. //# 通用数字计算题 50100
  36. // # 通用中文计算题 50101
  37. // # 定制-计算题 cni 452
  38. String verify_type;
  39. verify_type = "10110";
  40. JSONObject jsonObject = new JSONObject();
  41. jsonObject.put("image", imageContent);
  42. jsonObject.put("type", verify_type);
  43. jsonObject.put("token", Token);
  44. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  45. System.out.println(resp);
  46. return resp;
  47. }
  48. public String slideVerify(String slideImage, String backgroundImage) {
  49. // # 通用滑块
  50. // # 请保证购买相应服务后请求对应 verify_type
  51. // # verify_type="20111" 单次积分
  52. // # slide_image 需要识别图片的小图片的base64字符串
  53. // # background_image 需要识别图片的背景图片的base64字符串(背景图需还原)
  54. String verify_type;
  55. verify_type = "20101";
  56. JSONObject jsonObject = new JSONObject();
  57. jsonObject.put("slide_image", slideImage);
  58. jsonObject.put("background_image", backgroundImage);
  59. jsonObject.put("type", verify_type);
  60. jsonObject.put("token", Token);
  61. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  62. System.out.println(resp);
  63. return resp;
  64. }
  65. public String sinSlideVerify(String Image) {
  66. // # 通用单图滑块(截图) 20110
  67. // # 请保证购买相应服务后请求对应 verify_type
  68. // # verify_type="20110" 单次积分
  69. String verify_type;
  70. verify_type = "20110";
  71. JSONObject jsonObject = new JSONObject();
  72. jsonObject.put("image", Image);
  73. jsonObject.put("type", verify_type);
  74. jsonObject.put("token", Token);
  75. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  76. System.out.println(resp);
  77. return resp;
  78. }
  79. public String trafficSlideVerify(String seed, String data, String href) {
  80. // # 定制-滑块协议slide_traffic 900010
  81. String verify_type;
  82. verify_type = "900010";
  83. JSONObject jsonObject = new JSONObject();
  84. jsonObject.put("seed", seed);
  85. jsonObject.put("data", data);
  86. jsonObject.put("href", href);
  87. jsonObject.put("type", verify_type);
  88. jsonObject.put("token", Token);
  89. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  90. System.out.println(resp);
  91. return resp;
  92. }
  93. public String clickVerify(String image, String extra) {
  94. // # 通用任意点选1~4个坐标 30009
  95. // # 通用文字点选1(extra,点选文字逗号隔开,原图) 30100
  96. // # 定制-文字点选2(extra="click",原图) 30103
  97. // # 定制-单图文字点选 30102
  98. // # 定制-图标点选1(原图) 30104
  99. // # 定制-图标点选2(原图,extra="icon") 30105
  100. // # 定制-语序点选1(原图,extra="phrase") 30106
  101. // # 定制-语序点选2(原图) 30107
  102. // # 定制-空间推理点选1(原图,extra="请点击xxx") 30109
  103. // # 定制-空间推理点选1(原图,extra="请_点击_小尺寸绿色物体。") 30110
  104. // # 定制-tx空间点选(extra="请点击侧对着你的字母") 50009
  105. // # 定制-tt_空间点选 30101
  106. //# 定制-推理拼图1(原图,extra="交换2个图块") 30108
  107. //# 定制-xy4九宫格点选(原图,label_image,image) 30008
  108. //# 如有其他未知类型,请联系我们
  109. String verify_type;
  110. verify_type = "30100";
  111. JSONObject jsonObject = new JSONObject();
  112. jsonObject.put("image", image);
  113. if (extra != null) {
  114. jsonObject.put("extra", extra);
  115. }
  116. jsonObject.put("type", verify_type);
  117. jsonObject.put("token", Token);
  118. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  119. System.out.println(resp);
  120. return resp;
  121. }
  122. ;
  123. public String Rotate(String image) {
  124. //# 定制-X度单图旋转 90007
  125. String verify_type;
  126. verify_type = "90007";
  127. JSONObject jsonObject = new JSONObject();
  128. jsonObject.put("image", image);
  129. // # 定制-Tt双图旋转,2张图,内圈图,外圈图 90004
  130. // verify_type = "90004";
  131. // jsonObject.put("out_ring_image", image);
  132. // verify_type = "90004";
  133. // jsonObject.put("inner_circle_image", image);
  134. jsonObject.put("type", verify_type);
  135. jsonObject.put("token", Token);
  136. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  137. System.out.println(resp);
  138. return resp;
  139. }
  140. public String googleVerify(String googlekey, String pageurl) throws InterruptedException {
  141. //# googleVerify
  142. String data = null;
  143. JSONObject jsonObject = new JSONObject();
  144. jsonObject.put("token", Token);
  145. jsonObject.put("type", "40010"); // v2
  146. // jsonObject.put("type", "40011");// v3
  147. jsonObject.put("googlekey", googlekey);
  148. jsonObject.put("pageurl", pageurl);
  149. jsonObject.put("enterprise", 0);
  150. jsonObject.put("invisible", 1);
  151. jsonObject.put("data-s", ""); //## V2+企业如果能找到,找不到传空字符串
  152. jsonObject.put("action", ""); //#V3必传
  153. jsonObject.put("min_score", ""); //#V3才支持的可选参数
  154. String jsonData;
  155. jsonData = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  156. System.out.println(jsonData);
  157. // # {'msg': '识别成功', 'code': 10000, 'data': {'code': 0, 'captchaId': '51436618130', 'recordId': '74892'}}
  158. // jsonData = "["+"{'msg': '识别成功', 'code': 10000, 'data': {'code': 0, 'captchaId': '51436618130', 'recordId': '74892'}}"+"]";
  159. jsonData = "[" + "{'msg': '识别成功', 'code': 10000, 'data': {'code': 0, 'captchaId': '51436618130', 'recordId': '74892'}}" + "]";
  160. JSONArray jsonArray = new JSONArray(jsonData);
  161. jsonData = "[" + jsonArray.getJSONObject(0).getObj("data") + "]";
  162. JSONArray jsonArray1 = new JSONArray(jsonData);
  163. String captchaId = (String) jsonArray1.getJSONObject(0).getObj("captchaId");
  164. String recordId = (String) jsonArray1.getJSONObject(0).getObj("recordId");
  165. System.out.println(captchaId);
  166. System.out.println(recordId);
  167. int times = 0;
  168. int is_solved = 0;
  169. while (times < 120 || is_solved == 0) {
  170. String url = "https://www.jfbym.com/api/YmServer/funnelApiResult";
  171. JSONObject jsonObject1 = new JSONObject();
  172. jsonObject1.put("token", Token);
  173. jsonObject1.put("captchaId", captchaId);
  174. jsonObject1.put("recordId", recordId);
  175. String readToText = Requests.post(url).headers(headers).jsonBody(jsonObject).send().readToText();
  176. // String readToText = "{'msg': '请求成功', 'code': 10001, 'data': {'data': '03AGdBq2611GTOg'}}";
  177. if (readToText.contains("结果准备中,请稍后再试")) {
  178. times += 5;
  179. Thread.sleep(5000);
  180. continue;
  181. }
  182. if (readToText.contains("请求成功")) {
  183. JSONArray jsonArray2 = new JSONArray("[" + readToText + "]");
  184. jsonData = "[" + jsonArray2.getJSONObject(0).getObj("data") + "]";
  185. data = (String) new JSONArray(jsonData).getJSONObject(0).getObj("data");
  186. is_solved = 1;
  187. System.out.println(data);
  188. break;
  189. }
  190. }
  191. return data;
  192. }
  193. public String HcaptchaVerify(String site_key, String site_url) {
  194. //# Hcaptcha
  195. //# 请保证购买相应服务后请求对应 verify_type
  196. //# verify_type="50001"
  197. String verify_type;
  198. verify_type = "50001";
  199. JSONObject jsonObject = new JSONObject();
  200. jsonObject.put("site_key", site_key);
  201. jsonObject.put("site_url", site_url);
  202. jsonObject.put("type", verify_type);
  203. jsonObject.put("token", Token);
  204. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  205. System.out.println(resp);
  206. return resp;
  207. }
  208. public String FunCaptchaVerify(String site_key, String site_url) {
  209. //# Hcaptcha
  210. //# 请保证购买相应服务后请求对应 verify_type
  211. //# verify_type="40007"
  212. String verify_type;
  213. verify_type = "40007";
  214. JSONObject jsonObject = new JSONObject();
  215. jsonObject.put("publickey", site_key);
  216. jsonObject.put("pageurl", site_url);
  217. jsonObject.put("type", verify_type);
  218. jsonObject.put("token", Token);
  219. String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
  220. System.out.println(resp);
  221. return resp;
  222. }
  223. public static String ImageToBase64ByOnline(String imgURL) {
  224. ByteArrayOutputStream data = new ByteArrayOutputStream();
  225. try {
  226. // 创建URL
  227. URL url = new URL(imgURL);
  228. byte[] by = new byte[1024];
  229. // 创建链接
  230. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  231. conn.setRequestMethod("GET");
  232. conn.setConnectTimeout(5000);
  233. InputStream is = conn.getInputStream();
  234. // 将内容读取内存中
  235. int len = -1;
  236. while ((len = is.read(by)) != -1) {
  237. data.write(by, 0, len);
  238. }
  239. // 关闭流
  240. is.close();
  241. } catch (IOException e) {
  242. e.printStackTrace();
  243. }
  244. // 对字节数组Base64编码
  245. BASE64Encoder encoder = new BASE64Encoder();
  246. return encoder.encode(data.toByteArray());
  247. }
  248. }
  249. class YdmVerifyTest {
  250. public static void main(String[] args) throws IOException, InterruptedException {
  251. YdmVerify ydmVerify = new YdmVerify();
  252. String image_content = YdmVerify.ImageToBase64ByOnline("http://www.78gk.com/haoma/MTczMTM4NDI0MTE=");
  253. ydmVerify.commonVerify(image_content);
  254. }
  255. };

 

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类找不到        

 解决方法:

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

用上面的代码替换

  1. import sun.misc.BASE64Encoder;
  2. ...
  3. BASE64Encoder encoder = new BASE64Encoder();
  4. String base64Auth = encoder.encode(authorization);

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

运行效果如下:

 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/287350
推荐阅读
相关标签
  

闽ICP备14008679号