抓取数据接口实现Q校园自动签到上报体温

前言

由于专升本的学校让每天通过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再去发上报体温的请求。

原来脚本:

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命令。

代码如下:

// 拼接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令牌 => 执行上报体温 => 返回状态码




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

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

今天就到这里,查看更多信息可关注公众号【全栈开发日记】。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值