新手区 请问怎么识别验证码图片呢?

jiraqw · 2016年06月29日 · 最后由 江隆君 回复于 2016年12月07日 · 1999 次阅读

意外

获取登录验证码实践 (selenium)

//创建验证码
var code=" " ;  
function createCode(){       
    code = "";      
    var codeLength = 4; 
    var selectChar = new Array(1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','j','k','l','m','n','p','q','r','s','t','u','v','w','x','y','z');
    for(var i=0;i<codeLength;i++) {
       var charIndex = Math.floor(Math.random()*60);      
      code +=selectChar[charIndex];
    }      
    if(code.length != codeLength){      
      createCode();      
    }
    showCheck(code);
    sessionStorage.setItem("peo", code);
}

方案:

1、下载验证码图片,解析图片内容;

2、通过执行 js 获取 code,写文件保存到本地,再读取文件;

3、通过执行 js 获取 code,通过 alert 方式展现,读取弹框内容;

4、通过执行 js 获取 code,写到 localstorage 中,再读取 code 内容;

5、通过执行 js 获取 code,写到 cookie 中,读取 cookie。

分析:
1、图片识别技术较难;
2、难以控制文件 ;
3、alert 弹框内容不太友好;
4、selenium 代码不能方便读取
5、selenium 可以读取 cookie

实现代码


读取验证码后写cookie

// 将验证码写入cookie
public final static String GET_LOGINCODE_COOKIE_JS = "var str = sessionStorage.getItem('peo'); "
            + "document.cookie = 'code' +'=' +str " // 将验证码写入cookie
    // + "alert(getCookie('code'))"
    ;


public static void writeCookiePutCode(WebDriver dr) {


        JavascriptExecutor jsexc = (JavascriptExecutor) dr;
        //将验证码写入cookie
        jsexc.executeScript(Data.GET_LOGINCODE_COOKIE_JS);
        jsexc.executeScript(savecode);
    }   


读取cookie获取验证码
public static String readCookieGetCode(WebDriver dr) {
        Set<Cookie> cookies = dr.manage().getCookies();
        String cookieStr = "";
        if (!cookies.isEmpty()) {
            for (Cookie cookie : cookies) {
                if(cookie.getName().equals("code")){
                    cookieStr= cookie.getValue();
                //  System.out.println(cookie);
                }
            }
        }
        log.info("成功读取保存在cookie中的验证码");
        return cookieStr;
    }

这是个意外,验证码存到 sessionStorage 了。请问怎么识别验证码图片呢?

共收到 5 条回复 时间 点赞

有一种验证码叫万能验证码,没有话,估计你是搞不定的。
(领导也不会让你花 1,2 个月来学图像识别)

方案一:万能验证码
方案二:验证码生成后在后台某处存放,你通过接口或者 SQL 去获取
方案三:验证码在登录请求中返回,直接获取

即便实现一套方法了,也不是 100% 的识别成功率,研究可以,对于自动化意义不大

也不一定非要用代码识别呀,人工有时也是可以考虑的

用万能验证码啊

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册