整体思路
利用charles抓取预约请求,将请求数据复制到postman中进一步分析,利用python脚本模拟预约请求,最后用服务器定时运行脚本。
1 抓包
1.1 Charles的安装
1)下载Charles安装包。
下载地址https://www.charlesproxy.com/download/,根据系统选择对应的版本。
2)安装Charles。
下载后双击安装包,如果显示
说明以前安装过了。
下面是新安装的页面(安装过程基本上全部默认即可)。
安装过程中进度条不动可能是权限不够的原因,过几秒后会弹出提示框,点击是。
安装成功。
1.2 Charles的基本使用
1)注册
charles可以免费试用30天。如试用期已到,可进行破解(仅用于学习,强烈建议支持正版)。
破解工具地址https://www.zzzmode.com/mytools/charles/。
输入注册名,点击生成
弹出对应密钥
复制密钥至剪切板。
打开Charles,点击help->register
弹出注册框
将注册名和密钥输入点击register即可。
2)配置抓包Https
1 安装证书
2 配置443端口
配置完成
1.3 使用charles抓到预约对应包
以我们学校的预约程序为例
1)打开Charles软件,开启抓包
2)打开预约程序,选择对应座位
在预约前清理多余的包
点击确认预约
点击第一个包,可以看到抓到了预约的包。
右键点击第一个包,选择复制请求。等会将请求放入postman中。
2 分析请求
2.1 Postman安装(非必要)
我们也可以直接在charles中进行分析,只是我习惯使用postman。
1)下载Postman安装包
下载地址https://www.postman.com/downloads/,下载对应系统的安装包。
2)安装Postman
双击安装包。
不登录直接使用页面如下
2.2 将Charles的包导入Postman
导入后先将请求保存
2.3 Postman分析请求
编写代码时Params和Headers固定,这里不分析。
body数据分析
点击body。可以看到类型为text,而不是常用类型json
两次请求数据
在1月5日请求1月6日8.00-21.00的304-64号座位
beginTime=1704499200&duration=46800&seats%5B0%5D=11439&is_recommend=1&api_time=1704435599&seatBookers%5B0%5D=
在12月29日请求12月30日18.00-19.00的304-66号座位
beginTime=1703930400&duration=3600&seats%5B0%5D=11441&is_recommend=1&api_time=1703852294&seatBookers%5B0%5D=304808
变量名(含义) | 类型 |
---|---|
beginTime(开始时间) | 时间戳 |
duration(持续时间) | int(秒) |
seats%5B0%5D(座位编号11439 - 11375 = 64) | int(id - title) |
is_recommend(是否推荐) | bool |
api_time(请求时间/当前时间) | 时间戳 |
seatBookers(预约者编号) | int |
这里的是否推荐是通过之前预定的座位自动判断的,值可以随意。
3 编写代码
3.1 Pycharm安装(非必要)
当然我们也可以使用在线工具测试我们的代码是否可以成功运行,如菜鸟工具https://c.runoob.com/compile/9/
1)下载安装包
下载地址https://www.jetbrains.com/pycharm/download/?section=windows
选择自己的系统,点击下载
2)安装PyCharm
C盘不够可以修改盘符。
看情况勾选,一般都选就可以
3)注册
PyCharm可以免费试用30天。如试用期已到,可进行破解(仅用于学习,强烈建议支持正版)。
3.2 根据分析,编写代码
整个代码构成
import requests
from datetime import datetime, timedelta
# 目标URL
url = ''
# 请求头
headers = {
'Host': '',
'accept': '',
'api-token': '',
'User-Agent': '',
'content-type': '',
'Origin': '',
'Sec-Fetch-Site': '',
'Sec-Fetch-Dest': '',
'Referer': '',
'Accept-Language': '',
'Cookie': '',
# 添加其他头信息...
}
# URL参数
params = {'LAB_JSON': ''}
# 要发送的数据
# 当前时间(固定)
api_time = datetime.now()
# 开始时间为两天后的8.00
day = 2
beginTime = (api_time + timedelta(days=day)).replace(hour=8, minute=0, second=0, microsecond=0)
# 持续时间秒
hours = 13
duration = 60 * 60 * hours
# 座位号(须填)
seats =
# 预定者(用户)编号()
seatBookers =
data = 'beginTime={}&duration={}&seats%5B0%5D={}&is_recommend=1&api_time={}&seatBookers%5B0%5D={}'.format(
beginTime.timestamp(), duration, seats, api_time.timestamp(), seatBookers
)
# 发送POST请求
response = requests.post(url, params=params, headers=headers, data=data)
# 检查响应
if response.status_code == 200:
print('请求成功!')
print('响应内容:', response.text)
else:
print(f'请求失败,状态码: {response.status_code}')
print('错误内容:', response.text)
参数
目标URL
url = ‘’
问号之前的地址
请求头
headers = {
‘Host’: ‘’,
‘accept’: ‘’,
‘api-token’: ‘’,
‘User-Agent’: ‘’,
‘content-type’: ‘’,
‘Origin’: ‘’,
‘Sec-Fetch-Site’: ‘’,
‘Sec-Fetch-Dest’: ‘’,
‘Referer’: ‘’,
‘Accept-Language’: ‘’,
‘Cookie’: ‘’,
#添加其他头信息…
}
Headers中的所有信息(不用变)。
URL参数
params = {‘LAB_JSON’: ‘’}
url中?后面的参数,或者点击params查看。
body中的数据(要改)
我们学校是当天21:00可以预约两天后的座位。时间段为8:00-21:00
当前时间(固定)
api_time = datetime.now()
开始时间
#这里设为两天后的8:00
day = 2
beginTime = (api_time + timedelta(days=day)).replace(hour=8, minute=0, second=0, microsecond=0)
持续时间秒
#13个小时
hours = 13
duration = 60 * 60 * hours
座位号
#不一定是显示的编号
seats =
填请求中的值即可
预定者(用户)编号(固定)
seatBookers =
因为代码编写简单只能固定时间段固定一个座位,如果要改只能改请求参数。
4 定时运行
4.1 WindTerm的安装
1)下载WindTerm
下载地址https://github.com/kingToolbox/WindTerm/releases
2) 安装WindTerm
直接压缩即可,可以创建快捷方式放桌面。
4.2 WindTerm连接远程服务器
1) 创建会话。
打开windterm后,在会话栏右击。
选择ssh,填入对应信息。
4.3 服务器配置
1) 进入代码需要存放的地址
#创建代码存放文件夹
mkdir /opt/python_script
#进入文件夹
cd /opt/python_script/
2) 将代码上传服务器当前文件夹
可以使用shell软件或者别的传输软件
crontab -e
0 21 * * * /usr/bin/python3 /opt/python_script/zwu_lib.py