Android 截取验证码(自动填充验证码)

错误的方法

//从短信内容中截取验证码
    private String getSmsCode(String content,Context context){
        String code = "";
        if (getSimOperator(context) == 0){  //中国移动,内容=验证码:883830。尊敬的用户,您正在使用短信验证码登录,5分钟内有效,请勿泄露或转发他人。【xxxx】
            //使用方案一进行截取
            code = StringUtils.substring(content, 4, 10);
            if (!(isNumeric(code))){
                //使用方案二进行截取
                String s1 = StringUtils.substringAfter(content, "验证码:");
                code = StringUtils.substringBefore(s1, "。尊敬的用户");
            }
        }else if (getSimOperator(context) == 1){  //中国联通,内容=【验证密码】尊敬的客户,您好!您的动态密码:714446,请在5分钟内登录。
            //使用方案一进行截取
            code = StringUtils.substring(content, 29, 36);
            if (!(isNumeric(code))){
                //使用方案二进行截取
                String s1 = StringUtils.substringAfter(content, "动态密码:");
                code = StringUtils.substringBefore(s1, ",请在");
            }
        }else{  //中国电信,内容=【验证密码】尊敬的客户,您好!您的动态密码:284167,请在5分钟内登录。    并且type返回的不一定是2,所以这里用else了
            //使用方案一进行截取
            code = StringUtils.substring(content, 29, 36);
            if (!(isNumeric(code))){
                //使用方案二进行截取
                String s1 = StringUtils.substringAfter(content, "动态密码:");
                code = StringUtils.substringBefore(s1, ",请在");
            }
        }

        return code;
    }

错误原因:这种写法是按照短信内容的坐标和规律来进行截取的,一旦第三方短信内容变化大,这种方式就截取不到验证码,实际上因为大网的拦截策略在改变,短信验证码都是在改变的

所以正确的方法

    //截取验证码
    public String catchCode(String body){
        String code = "";

        //如果有手机号码就要去掉
        Pattern pattern = Pattern.compile("1[3-9]\\d{9}");
        Matcher matcher = pattern.matcher(body);
        if (matcher.find()){
            body = body.replaceAll(matcher.group(0),"");
        }

        //如果有QQ号码,去掉
        pattern = Pattern.compile("\\d{10}");
        matcher = pattern.matcher(body);
        if (matcher.find()){
            body = body.replaceAll(matcher.group(0),"");
        }

        //如果有QQ号码,去掉
        pattern = Pattern.compile("\\d{9}");
        matcher = pattern.matcher(body);
        if (matcher.find()){
            body = body.replaceAll(matcher.group(0),"");
        }

        //8位连续的数字去掉
        pattern = Pattern.compile("\\d{8}");
        matcher = pattern.matcher(body);
        if (matcher.find()){
            body = body.replaceAll(matcher.group(0),"");
        }

        //7位连续的数字去掉
        pattern = Pattern.compile("\\d{7}");
        matcher = pattern.matcher(body);
        if (matcher.find()){
            body = body.replaceAll(matcher.group(0),"");
        }

        //截取六位验证码
        pattern = Pattern.compile("(\\d{6})");
        matcher = pattern.matcher(body);
        if (matcher.find()){
            code = matcher.group(0);
        }

        //5位连续的数字去掉
        pattern = Pattern.compile("\\d{5}");
        matcher = pattern.matcher(body);
        if (matcher.find()){
            body = body.replaceAll(matcher.group(0),"");
        }

        //截取四位验证码
        if (TextUtils.isEmpty(code)){
            pattern = Pattern.compile("(\\d{4})");
            matcher = pattern.matcher(body);
            if (matcher.find()){
                code = matcher.group(0);
            }
        }

        return code;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值