Java+Selenium+chrome 实现定时自动登录(含验证码解析)

作为打工人,感觉对于定时自动登录这个功能还是需要会,现将方法分享出来,供大家参考。

1.下载浏览器驱动

说明:以chrome浏览器为例,其他浏览器可以自动查找自己浏览器的驱动,方法相同

进入chrome浏览器设置,左侧菜单最后一栏,找到关于chrome,点开获取浏览器版本号,进入

https://registry.npmmirror.com/binary.html?path=chromedriver/下载距离版本号最近的驱动。

最好将浏览器的自动更新关掉,不然自动升级高版本后得重新下驱动。关于如何关闭chrome浏览器的自动更新,这篇文文章有详细说明-->关闭chrome浏览器自动更新-简单好用

2.定时任务代码

新建SpringBoot工程,新建定时任务,可以用SpringBoot自带的@Scheduled注解,也可以使用quartz实现,这里使用quartz进行实现。

/**
 * 创建Scheduler
 */
@Configuration
@EnableScheduling
public class SchedulerCustomizer implements SchedulerFactoryBeanCustomizer {
    
    @Override
    public void customize(SchedulerFactoryBean schedulerFactoryBean) {
        schedulerFactoryBean.setAutoStartup(true);
        schedulerFactoryBean.setOverwriteExistingJobs(true);
    }
}
/**
 * 创建job
 */
@Component
public class CommonJobFactory extends SpringBeanJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}
/***
 * @description 定时任务创建
 * @author
 */
@Component
public class QuartzManage implements ApplicationRunner {

    @Autowired
    private CommonJobFactory commonJobFactory;
    @Autowired
    private Scheduler scheduler;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 启动调度器
        scheduler.setJobFactory(commonJobFactory);
        // 1、创建JobDetail实例,UpWorkTimer为业务实现的类
        JobDetail jobDetail = JobBuilder.newJob(UpWorkTimer.class)
                .withIdentity("job1", "group1").build();
        // 2、构建Trigger实例,每隔30s执行一次
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/30 * * * * ?")).build();


        //3、创建调度器Scheduler并执行
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
        System.out.println("--------scheduler start ! ------------");
    }
}

至此,定时任务创建完成

3.业务逻辑代码

/***
 * 逻辑代码
 */
@Service
public class UpWorkTimer implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        //设置chrome的安装路径,
        //webDriverLocation 为第一步下载的驱动位置例如D:\\a\\chromedriver.exe
        System.setProperty("webdriver.chrome.driver", webDriverLocation);
        //初始化浏览器实例,并打开浏览器
        ChromeDriver driver = new ChromeDriver();
        try {
            //最大化窗口
            driver.manage().window().maximize();
            Thread.sleep(500);
            //打开一个网址,为自己需要打卡的网址
            driver.get("www.baidu.com");
            Thread.sleep(500);

            //获取用户名框并输入用户名
            driver.findElement(By.id("用户名")).sendKeys(“xxx”);

            //获取密码框并输入密码
            driver.findElement(By.id("密码")).sendKeys(“xxx”);

            //这部分为获取验证码并解析,下部分讲到
            WebElement ele = driver.findElement(By.id("img"));
            String src = ele.getAttribute("src");
            YdmVerify ydmVerify = new YdmVerify();
            String s = ydmVerify.commonVerify(src, token);

            JSONObject jsonObject = JSONObject.parseObject(s);
            if (10000 == (Integer) jsonObject.get("code")) {
                Map<String, Object> jsonDate = (Map<String, Object>) jsonObject.get("data");
                System.out.println("验证码获取成功,获取结果为:" + jsonDate.get("data"));

                //获取验证码框并输入验证码
                driver.findElements(By.id("验证码")).sendKeys((String) jsonDate.get("data"));

                //获取登录按钮并点击
                driver.findElements(By.id("登录"))).click();
                Thread.sleep(500);

                //获取签到按钮并点击
                driver.findElements(By.id("签到"))).click();
                Thread.sleep(500);
            } else {
                System.out.println("验证码获取失败,获取结果为:" + jsonObject.get("msg"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
           //关闭浏览器驱动
            driver.quit();
        }
    }
}

到这里业务代码写完了,其中的页面内筒根据每个人的不同自己修改。接下来讲验证码如何生成,逻辑代码中28-35行的内容。

4.验证码图片解析

验证码的生成思路为拿到验证码图片,将图片解析为 base64 的加密串,然后调用云码平台的api生成验证码。上代码

/**
 * @author 无名
 */
public class YdmVerify {

    private static final String CustomUrl = "https://www.jfbym.com/api/YmServer/customApi";
    Map headers = new HashMap<>();


    public YdmVerify() {
        headers.put("Content-Type", "application/json");
    }
    //imageContent 为图片加密后的base64密文
    //token 为云码平台提供,获取方法见代码后的说明
    public String commonVerify(String imageContent,String token) {
        // # 数英汉字类型
        // # 通用数英1-4位 10110
        // # 通用数英5-8位 10111
        // # 通用数英9~11位 10112
        // # 通用数英12位及以上 10113
        // # 通用数英1~6位plus 10103
        // # 定制-数英5位~qcs 9001
        // # 定制-纯数字4位 193
        // # 中文类型
        // # 通用中文字符1~2位 10114
        // # 通用中文字符 3~5位 10115
        // # 通用中文字符6~8位 10116
        //# 通用中文字符9位及以上 10117
        //# 定制-XX西游苦行中文字符 10107
        // # 计算类型
        //# 通用数字计算题 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();
        return resp;
    }

    /**
     * 获取本地图片并 base64  加密
    public static String ImageToBase64ByOnline(String imgURL) {
        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        InputStream in = null;
        byte[] data = null;
        //读取图片字节数组
        try {
            in = new FileInputStream(imgURL);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String s = Base64.encodeBase64String(data);
        System.out.println(s);
        return s;

    }*/

}

若可以直接获取到加密后的密文直接传入,若不是则将验证码图片 下载至本地并调用ImageToBase64ByOnline方法生成base64 密文。接下来对云码平台使用进行讲解:

5.云码平台使用

云码平台地址:https://zhuce.jfbym.com/login/ ,注册后按照步骤提示领取新人500积分,每次验证成功需要消耗2积分,用完500积分后,1元=1000积分,足够用了。

  • 注册完成领取积分后点击右上角头像进入个人中心,找到token点击复制

这样就获取到了token,在代码中使用。还有非常重要的一点是,云码平台使用要jdk11,jdk8用不了,还需要一些平台特有的jar包,链接如下,自行下载后导入。

链接:https://pan.baidu.com/s/13_wbywV2nYDNCGdPHCtjaA

提取码:sugj

当然,云码平台还提供了开发文档,里面有滑块验证,九宫格的等等,我们以数字验证码为例,有兴趣的可以研究其他。

至此,定时自动登录就完成了。

说明:此文档仅用于学术交流。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值