发布于 

干饭人の大危機

1、危機起因

今天是12月10号,距离疫情发生不知道过了多少天反正总之就是很多天都它喵快一年了的一天。

公司自从复工后依然在执行午饭需要提前预定的制度,虽说是为了大家的健康着想,但是每天都要等到晚上十二点然后打开app订餐,对于我这种一天至少需要睡八-九小时的生物来说简直是一种折磨。

因此我决定开始那个计划!(主要是原来计划过然后忘了执行了···)。

2、大致思路

  • 使用抓包工具对手机app进行抓包,获取订餐对应的API接口
  • 编写一个定时任务进行伪造订餐请求,并在指定时间发送
  • 将项目打包扔到服务器上运行

3、計畫開始!

① 抓包!

我使用的抓包工具就是比较知名的Fiddler

直接搜索引擎搜就完事了,或者直接点击这里的官网链接

然后下载安装,安装一直下一步就可以

Fiddler主要是一个抓Web的工具,但是也可以抓外部设备的访问请求,只不过需要设置代理

  1. 关闭电脑的防火墙

    Mac的比较简单:打开系统便好设置 –>安全与隐私–>防火墙

    然后关闭就行了

    Windows的我也忘了在哪了,反正找不到就去搜一下

  2. 打开Fiddler找到右上角设置

    依次是 允许权限、捕获HTTPS请求、忽略请求错误

    然后就是设置代理

    记住这个端口号,默认是8866

    选项依次是:启动时开启代理、允许外部设备访问

    设置完成之后点save然后重启Fiddler,记得重启,不然设置不会生效

  3. 确保手机和电脑在同一个局域网

    然后配置手机的代理

    服务器地址为你的电脑的IP地址,端口号就是刚才在Fiddler中设置的端口号了

    Mac可以直接打开网络偏好设置查看

    windos可以cmd输入

    1
    ipconfig
  4. 正式开始抓包

    这时候如果你刷新网页的话,Fiddler中会出现大量请求,所以需要关掉可能会出现网络请求的程序。然后打开手机app

    这时候就需要你仔细寻找了,发现了公司的服务器IP请求,然后看一下请求相应的数据。

    没错,就是这个了。话说食堂的糖醋里脊真的不怎么样

    然后因为请求确实太多,添加一个过滤条件过滤一下

    直接使用请求头中Host作为条件即可

  5. 现在就获取到了需要的请求接口和Header以及负载的Body数据

② 编写程序

由于这个程序写出来就只为了给我自己订餐,所以在编写过程中很多地方都是硬编码

发送请求我使用的是hutool工具包中封装好的HttpRequest

具体代码我就不贴了,因为涉及公司的IP地址,及app的接口等

不过定时任务的代码可以贴一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@RestController
@Slf4j
public class OrderController {
@Autowired
HttpRequestService service;

@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;

private ScheduledFuture<?> future;

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}

@Value("${cron.prod}")
private String cron;


@GetMapping("/start")
public String start() {
future = threadPoolTaskScheduler.schedule(new MyRunnable(service), new CronTrigger(cron));
return "startTask";
}

@GetMapping("/stop")
public String stop() {
if (future != null) {
future.cancel(true);
}
return "stopTask";
}

}

主要是写了两个接口用来控制定时任务的开启和关闭

然后在本机调试

③ 服务器运行

想要实现在十二点订餐肯定不能只让程序运行在本机电脑上,否则你的电脑需要整晚开机,或者你可以设置定时关机。但这也太麻烦了,而且订个餐还需要占用办公电脑,这显然是不现实的。所以需要把jar包扔到服务器上运行

因为创建的项目是SpringBoot项目,因此可以直接打Jar运行,方便很多

你可以传统的在本地把Jar包打包好,然后上传服务器,Java -Jar 运行

不过我选择第二种方式,直接使用一个idea上阿里的插件一键部署

从上到下依次是

  • 文件获取方式,也就是你的项目最终编译完成后的文件:

    • 你可以选择maven构建后生成的文件,这时你需要输入maven具体的构建命令,一般就是clean install
    • 手动指定上传的文件
    • Gradle打包,当前是个maven项目,因此不可使用
  • 选择你要上传的服务器实例

  • 上传到哪个路径下

  • 上传完成后需要执行的命令

    关于这个需要说一下,因为我的项目是个jar包,直接使用Java -jar运行的话,直接关掉命令行面板就会停止运行,所以需要设置后台运行的命令

    1
    nohup java -jar xxx.jar > log.txt &

到这还需要你进入阿里云的控制台,找到你的服务器实例,打开这个项目所在端口的访问权限

最后,访问你的服务器打开定时任务就完成了

4、作戰結束

干饭人大获全胜!🎉🎉🎉🎉