作为打工人,感觉对于定时自动登录这个功能还是需要会,现将方法分享出来,供大家参考。
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
当然,云码平台还提供了开发文档,里面有滑块验证,九宫格的等等,我们以数字验证码为例,有兴趣的可以研究其他。

至此,定时自动登录就完成了。文章来源:https://www.toymoban.com/news/detail-460493.html
说明:此文档仅用于学术交流。文章来源地址https://www.toymoban.com/news/detail-460493.html
到了这里,关于Java+Selenium+chrome 实现定时自动登录(含验证码解析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!