关于UI 自动化案例的验证码处理(第三方图形识别工具)

1、ocrKing  ,使用者要自己去给[email protected]发邮件申请,高冷得一批,从来不回

2、百度智能云,识别准确度几乎为0:参考文档 https://cloud.baidu.com/doc/OCR/s/Dk3h7yf8m

代码如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>baiduOcr</groupId>
  <artifactId>baiduOcr</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  <dependency>
    <groupId>com.baidu.aip</groupId>
    <artifactId>java-sdk</artifactId>
    <version>4.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20190722</version>
</dependency>


  </dependencies>
</project>
package com.ocrUtils;

import java.util.HashMap;

import org.json.JSONObject;

import com.baidu.aip.ocr.AipOcr;

public class Sample {
    //设置APPID/AK/SK
    public static final String APP_ID = "19513055";
    public static final String API_KEY = "sVXP8Hea2f8NSvAAhZ9jRS3q";
    public static final String SECRET_KEY = "0ABfSvq4oYMY246SYLRsZdefTtGGSK20";

    public static void main(String[] args) {
        // 初始化一个AipOcr
        AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);

        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//        client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
//        client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理

        // 可选:设置log4j日志输出格式,若不设置,则使用默认配置
        // 也可以直接通过jvm启动参数设置此环境变量
        System.setProperty("aip.log4j.conf", "src/test/resources/log4j.properties");

        // 调用接口
        String path = "src/test/resources/t.jpg";
        HashMap<String, String> options= new HashMap<String, String>();
        options.put("detect_direction", "false");
        options.put("probability", "false");
        JSONObject res = client.basicAccurateGeneral(path, options);
        System.out.println(res.toString(2));
        
    }
}

效果:

3、云打码

参考文档:http://www.yundama.com/apidoc/

目录结构

package com.yundama.ydm;

import com.sun.jna.Library;
import com.sun.jna.Native;

public class CYDMDemo
{
    // 下载云打码DLL http://yundama.com/apidoc/YDM_SDK.html#DLL
    // yundamaAPI 32位, yundamaAPI-x64 64位
    public static String    DLLPATH        = "F:\\柠檬班\\linmengban\\day2020\\yundama\\lib/yundamaAPI-x64.dll";

    public interface YDM extends Library
    {
        YDM    INSTANCE    = (YDM) Native.loadLibrary(DLLPATH, YDM.class);        

        public void YDM_SetBaseAPI(String lpBaseAPI);
        public void YDM_SetAppInfo(int nAppId, String lpAppKey);
        public int YDM_Login(String lpUserName, String lpPassWord);
        public int YDM_DecodeByPath(String lpFilePath, int nCodeType, byte[] pCodeResult);
        public int YDM_UploadByPath(String lpFilePath, int nCodeType);
        public int YDM_EasyDecodeByPath(String lpUserName, String lpPassWord, int nAppId, String lpAppKey, String lpFilePath, int nCodeType, int nTimeOut, byte[] pCodeResult);
        public int YDM_DecodeByBytes(byte[] lpBuffer, int nNumberOfBytesToRead, int nCodeType, byte[] pCodeResult);
        public int YDM_UploadByBytes(byte[] lpBuffer, int nNumberOfBytesToRead, int nCodeType);
        public int YDM_EasyDecodeByBytes(String lpUserName, String lpPassWord, int nAppId, String lpAppKey, byte[] lpBuffer, int nNumberOfBytesToRead, int nCodeType, int nTimeOut, byte[] pCodeResult);
        public int YDM_GetResult(int nCaptchaId, byte[] pCodeResult);
        public int YDM_Report(int nCaptchaId, boolean bCorrect);
        public int YDM_EasyReport(String lpUserName, String lpPassWord, int nAppId, String lpAppKey, int nCaptchaId, boolean bCorrect);
        public int YDM_GetBalance(String lpUserName, String lpPassWord);
        public int YDM_EasyGetBalance(String lpUserName, String lpPassWord, int nAppId, String lpAppKey);
        public int YDM_SetTimeOut(int nTimeOut);
        public int YDM_Reg(String lpUserName, String lpPassWord, String lpEmail, String lpMobile, String lpQQUin);
        public int YDM_EasyReg(int nAppId, String lpAppKey, String lpUserName, String lpPassWord, String lpEmail, String lpMobile, String lpQQUin);
        public int YDM_Pay(String lpUserName, String lpPassWord, String lpCard);
        public int YDM_EasyPay(String lpUserName, String lpPassWord, long nAppId, String lpAppKey, String lpCard);
    }
    
    
    public static void main(String[] args) throws Exception
    {
        // 注意这里是普通会员账号,不是开发者账号,注册地址 http://www.yundama.com/index/reg/user
        // 开发者可以联系客服领取免费调试题分
        String username = "name";
        String password    = "password";

        // 测试时可直接使用默认的软件ID密钥,但要享受开发者分成必须使用自己的软件ID和密钥
        // 1. http://www.yundama.com/index/reg/developer 注册开发者账号
        // 2. http://www.yundama.com/developer/myapp 添加新软件
        // 3. 使用添加的软件ID和密钥进行开发,享受丰厚分成
        int     appid    = 1;                                    
        String     appkey    = "22cc5376925e9387a23cf797cb9ba745";
        
        // 图片路径
        String    imagepath    = "src/t.jpg";

        //  例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
        int codetype = 1004;
        
        // 只需要在初始的时候登陆一次
        int uid = 0;
        YDM.INSTANCE.YDM_SetAppInfo(appid, appkey);            // 设置软件ID和密钥
        uid = YDM.INSTANCE.YDM_Login(username, password);    // 登陆到云打码

        if(uid > 0){
            System.out.println("登陆成功,正在提交识别...");
            
            byte[] byteResult = new byte[30];
            int cid = YDM.INSTANCE.YDM_DecodeByPath(imagepath, codetype, byteResult);
            String strResult = new String(byteResult, "UTF-8").trim();
            
            // 返回其他错误代码请查询 http://www.yundama.com/apidoc/YDM_ErrorCode.html
            System.out.println("识别返回代码:" + cid);
            System.out.println("识别返回结果:" + strResult); 

        }else{
            System.out.println("登录失败,错误代码为:" + uid);
        }  
    }
}

识别效果

python 版本

目录结构

# -*- coding: cp936 -*-

import sys
import os
from ctypes import *

# 下载接口放目录 http://www.yundama.com/apidoc/YDM_SDK.html
# 错误代码请查询 http://www.yundama.com/apidoc/YDM_ErrorCode.html
# 所有函数请查询 http://www.yundama.com/apidoc

print('>>>正在初始化...')

YDMApi = windll.LoadLibrary('C:\\Users\\Administrator\\Desktop\\Python调用示例\\Python调用示例\\yundamaAPI-x64.dll')

# 1. http://www.yundama.com/index/reg/developer 注册开发者账号
# 2. http://www.yundama.com/developer/myapp 添加新软件
# 3. 使用添加的软件ID和密钥进行开发,享受丰厚分成

appId = 1   # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
appKey = b'22cc5376925e9387a23cf797cb9ba745'     # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!

print('软件ID:%d\r\n软件密钥:%s' % (appId, appKey))

# 注意这里是普通会员账号,不是开发者账号,注册地址 http://www.yundama.com/index/reg/user
# 开发者可以联系客服领取免费调试题分

username = b'name'
password = b'password'

if username == b'test':
    exit('\r\n>>>请先设置用户名密码')
    
####################### 一键识别函数 YDM_EasyDecodeByPath #######################

print('\r\n>>>正在一键识别...')

# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
codetype = 1004

# 分配30个字节存放识别结果
result = c_char_p(b"                              ")    

# 识别超时时间 单位:秒
timeout = 60

# 验证码文件路径
filename = b'getimage.jpg'

# 一键识别函数,无需调用 YDM_SetAppInfo 和 YDM_Login,适合脚本调用
captchaId = YDMApi.YDM_EasyDecodeByPath(username, password, appId, appKey, filename, codetype, timeout, result)

print("一键识别:验证码ID:%d,识别结果:%s" % (captchaId, result.value))

################################################################################


########################## 普通识别函数 YDM_DecodeByPath #########################

print('\r\n>>>正在登陆...')

# 第一步:初始化云打码,只需调用一次即可
YDMApi.YDM_SetAppInfo(appId, appKey)

# 第二步:登陆云打码账号,只需调用一次即可
uid = YDMApi.YDM_Login(username, password)

if uid > 0:

    print('>>>正在获取余额...')
    
    # 查询账号余额,按需要调用
    balance = YDMApi.YDM_GetBalance(username, password)
    
    print('登陆成功,用户名:%s,剩余题分:%d' % (username, balance))

    print('\r\n>>>正在普通识别...')

    # 第三步:开始识别
    
    # 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
    codetype = 1004

    # 分配30个字节存放识别结果
    result = c_char_p(b"                              ")

    # 验证码文件路径
    filename = b't.jpg'

    # 普通识别函数,需先调用 YDM_SetAppInfo 和 YDM_Login 初始化
    captchaId = YDMApi.YDM_DecodeByPath(filename, codetype, result)

    print("普通识别:验证码ID:%d,识别结果:%s" % (captchaId, result.value))
    
else:
    print('登陆失败,错误代码:%d' % uid)

################################################################################

print('\r\n>>>错误代码请查询 http://www.yundama.com/apidoc/YDM_ErrorCode.html')

input('\r\n测试完成,按回车键结束...')

识别效果:

猜你喜欢

转载自www.cnblogs.com/wangzhiqiang004/p/12738203.html