因为专升本的学校让每天通过Q校园进行上报体温,并且要连续14天位置不能变化,才能到校报到。
但是以我这个记忆力中间难免会漏一天,那就前功尽弃了,所以我就打算开发一个自动帮我上报体温、签到的系统。
① 每天的位置不能改变
② 签到时间在18时-19时之间
③完全不需要我操作
既然准备搞一个自动签到的系统,那前提得先知道请求应该发给谁(请求地址),还有请求的参数等等。
这个很好解决,通过抓包工具可以很轻松的抓到请求地址和所需参数:
通过如上三张图就得到了请求地址,请求参数,以及返回code
为0时,请求成功。
想要上报信息,需要在Cookie中携带身份令牌,我尝试在登录成功后将如下Cookie删除后提交体温数据,结果显示登录超时,所以肯定是它了没错。
该令牌是登录成功后服务器端设置的Cookie,所以我需要先进行登录并拿到身份令牌才能发起上报体温请求。
通过查看抓取的数据参数,可以看到位置信息是地图中地名,和该定位的经纬度。所以这个是不难的,用之前抓包抓到的数据就可以。
我需要系统定时帮我上报体温,完全不需要我操作。所以我想到了Java中定时器,可以设置每天或每周什么时间去执行某一个程序。
那么,到目前为止,我们需要的信息都有了,下面开始实际上手开发。
这里我用到的是SpringBoot
中自带的多线程定时任务。
代码如下:
@Component // IOC容器
@EnableScheduling // 1.开启定时任务
@EnableAsync // 2.开启多线程
@Slf4j // 日志
public class MultithreadScheduleTask {
@Autowired
private ToolsService toolsService;
/**
* Q校园签到
* @author 二饭
*/
@Async
@Scheduled(cron = "0 0 18 * * ?") // 每天下午6点执行上报体温
public void qSchoolSignin(){
try {
log.info("Q校园签到");
String s = toolsService.signIn();
log.info(s);
}catch (Exception ex){
ex.printStackTrace();
log.error("Q校园签到失败-"+ex.getMessage());
}
}
}
开始我准备通过浏览器模拟登录操作,携带Cookie上报体温,但是显示跨域,登录操作没问题,上报体温时会显示跨域。因为这个我尝试Vue跨域配置,Ajax跨域配置,Nginx反向代理跨域配置都不起作用。
所以我决定换一条路,直接执行cURL
脚本,通过尝试确实可以。
通过给脚本添加-c
选项,将登录成功后的Cookie保存到一个文件中,然后携带这个Cookie再去发上报体温的请求。
原来脚本:
// 拼接Shell命令,脚本的绝对路径
String shell=qSchoolPath + "/login.sh";
// 执行登录
Process process = Runtime.getRuntime().exec(shell);
// 等待脚本执行完毕
process.waitFor();
保存Cookie脚本:
// 返回cookie中的JSESSIONID
String result=getCookie(qSchoolPath+"/a.txt");
Process ps=Runtime.getRuntime().exec(new String[]{"/home/save.sh",result});
ps.waitFor();
在执行登录操作之后就可以在test.txt
文件中看到Cookie身份令牌。
sh
脚本这里就又涉及到一个知识点,如何才能通过Java执行sh
脚本,或者是执行Shell命令。
代码如下:
// 拼接Shell命令,脚本的绝对路径
String shell=qSchoolPath + "/login.sh";
// 执行登录
Process process = Runtime.getRuntime().exec(shell);
// 等待脚本执行完毕
process.waitFor();
获取身份令牌后需要将身份令牌传参给上报体温脚本,否则脚本还是无法携带Cookie令牌。
这里又涉及到另一个知识点,Shell脚本传参:
// 返回cookie中的JSESSIONID
String result=getCookie(qSchoolPath+"/a.txt");
Process ps=Runtime.getRuntime().exec(new String[]{"/home/save.sh",result});
ps.waitFor();
执行./xxx.sh param命令,在脚本内可通过1来获取参数,以此类推,0是执行的文件名。
定时任务执行 => 执行登录脚本 => 解析Cookie令牌 => 执行上报体温 => 返回状态码
此方法可无视上报体温必须下午五点之后的时间限制,随时都可以推送数据。
这个系统的后台入口我也找到了,后面要尝试一下破解密码进入后台系统。