前言
由于专升本的学校让每天通过Q校园进行上报体温,并且要连续14天位置不能变化,才能到校报到。
但是以我这个记忆力中间难免会漏一天,那就前功尽弃了,所以我就打算开发一个自动帮我上报体温、签到的系统。 
目标
① 每天的位置不能改变
② 签到时间在18时-19时之间
③ 完全不需要我操作
前期准备
① 请求地址
既然准备搞一个自动签到的系统,那前提得先知道请求应该发给谁(请求地址),还有请求的参数等等。
这个很好解决,通过抓包工具,可以很轻松的抓到请求地址和所需参数:   通过如上三张图就得到了请求地址,请求参数,以及返回code 为0时,为请求成功。
② 获取身份令牌
想要上报信息,需要在Cookie中携带身份令牌,我尝试在登录成功后将如下Cookie删除后提交体温数据,结果显示登录超时,所以肯定是它了没错。
该令牌是登录成功后服务器端设置的Cookie,所以我需要先进行登录并拿到身份令牌才能发起上报体温请求。 
③ 位置信息
通过查看参数,可以看到位置信息是地图中地名,和该定位的经纬度。所以这个是不难的,用之前抓包抓到的数据就可以。
④ 定时上报
我需要系统定时帮我上报体温,完全不需要我操作。所以我想到了Java中定时器,可以设置每天或每周什么时间去执行某一个程序。
那么,到目前为止,我们需要的信息都有了,下面开始实际上手开发。
开发
① 定时执行
这里我用到的是SpringBoot 中自带的多线程定时任务。
代码如下:
@Component
@EnableScheduling
@EnableAsync
@Slf4j
public class MultithreadScheduleTask {
@Autowired
private ToolsService toolsService;
@Async
@Scheduled(cron = "0 0 18 * * ?")
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再去发上报体温的请求。
原来脚本:
curl -X POST -H "Host:***.****.****" -H "Connection:keep-alive" -H "Content-Length:60" -H "Sec-Fetch-Mode:cors" ...
保存Cookie脚本:
curl -c "test.txt" -X POST -H "Host:***.****.****" -H "Connection:keep-alive" -H "Content-Length:60" -H "Sec-Fetch-Mode:cors" ...
在执行登录操作之后就可以在test.txt 文件中看到Cookie身份令牌。
③ Java调用sh 脚本
这里就又涉及到一个知识点,如何才能通过Java执行sh 脚本,或者是执行Shell命令。
代码如下:
String shell=qSchoolPath + "/login.sh";
Process process = Runtime.getRuntime().exec(shell);
process.waitFor();
④ 脚本传参
获取身份令牌后需要将身份令牌传参给上报体温脚本,否则脚本还是无法携带Cookie令牌。
这里又涉及到另一个知识点,Shell脚本传参:
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令牌 => 执行上报体温 => 返回状态码
此方法可无视上报体温必须下午五点之后的时间限制,随时都可以推送数据。
这个系统的后台入口我也找到了,后面要尝试一下破解密码进入后台系统。
今天就到这里,查看更多信息可关注公众号【全栈开发日记】。
|