前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Q校园自动上报体温签到

Q校园自动上报体温签到

作者头像
全栈开发日记
发布2022-05-13 14:49:53
6880
发布2022-05-13 14:49:53
举报
文章被收录于专栏:全栈开发日记

前言

因为专升本的学校让每天通过Q校园进行上报体温,并且要连续14天位置不能变化,才能到校报到。

但是以我这个记忆力中间难免会漏一天,那就前功尽弃了,所以我就打算开发一个自动帮我上报体温、签到的系统。

目标

① 每天的位置不能改变

② 签到时间在18时-19时之间

③完全不需要我操作

前期准备

① 请求地址

既然准备搞一个自动签到的系统,那前提得先知道请求应该发给谁(请求地址),还有请求的参数等等。

这个很好解决,通过抓包工具可以很轻松的抓到请求地址和所需参数:

通过如上三张图就得到了请求地址,请求参数,以及返回code为0时,请求成功。

② 获取身份令牌

想要上报信息,需要在Cookie中携带身份令牌,我尝试在登录成功后将如下Cookie删除后提交体温数据,结果显示登录超时,所以肯定是它了没错。

该令牌是登录成功后服务器端设置的Cookie,所以我需要先进行登录并拿到身份令牌才能发起上报体温请求。

③ 位置信息

通过查看抓取的数据参数,可以看到位置信息是地图中地名,和该定位的经纬度。所以这个是不难的,用之前抓包抓到的数据就可以。

④ 定时上报

我需要系统定时帮我上报体温,完全不需要我操作。所以我想到了Java中定时器,可以设置每天或每周什么时间去执行某一个程序。

那么,到目前为止,我们需要的信息都有了,下面开始实际上手开发。

开发

① 定时执行

这里我用到的是SpringBoot中自带的多线程定时任务。

代码如下:

代码语言:javascript
复制
@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再去发上报体温的请求。

原来脚本:

代码语言:javascript
复制
// 拼接Shell命令,脚本的绝对路径
String shell=qSchoolPath + "/login.sh"; 
// 执行登录
Process process = Runtime.getRuntime().exec(shell);
// 等待脚本执行完毕
process.waitFor();

保存Cookie脚本:

代码语言:javascript
复制
// 返回cookie中的JSESSIONID
String result=getCookie(qSchoolPath+"/a.txt");
Process ps=Runtime.getRuntime().exec(new String[]{"/home/save.sh",result});
ps.waitFor();

在执行登录操作之后就可以在test.txt文件中看到Cookie身份令牌。

③ Java调用sh脚本

这里就又涉及到一个知识点,如何才能通过Java执行sh脚本,或者是执行Shell命令。

代码如下:

代码语言:javascript
复制
// 拼接Shell命令,脚本的绝对路径
String shell=qSchoolPath + "/login.sh"; 
// 执行登录
Process process = Runtime.getRuntime().exec(shell);
// 等待脚本执行完毕
process.waitFor();

④ 脚本传参

获取身份令牌后需要将身份令牌传参给上报体温脚本,否则脚本还是无法携带Cookie令牌。

这里又涉及到另一个知识点,Shell脚本传参:

代码语言:javascript
复制
// 返回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令牌 => 执行上报体温 => 返回状态码

结果:

此方法可无视上报体温必须下午五点之后的时间限制,随时都可以推送数据。

这个系统的后台入口我也找到了,后面要尝试一下破解密码进入后台系统。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈开发日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 目标
  • 前期准备
    • ① 请求地址
      • ② 获取身份令牌
        • ③ 位置信息
          • ④ 定时上报
          • 开发
            • ① 定时执行
              • ② 获取身份令牌
                • ③ Java调用sh脚本
                  • ④ 脚本传参
                    • ⑤ 执行步骤
                    • 结果:
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档