如果不了解背景的,建议先去看看v1.0这个版本的文章。
声明:本文仅供学习交流,不针对学校及个人,无意破坏竞争公平性。
题外话:
接下来为什么直接就是v3.0呢,是因为v2.0(在v1.0的基础上增加了GUI)早就写出来了,只是没发文章,当时觉得连带着日志一块搞出来发文章得了,结果一下子多肝了四天时间。。
遇到太多问题了,太多bug了,只能一点点想办法,一点点解决。
介绍一下版本更迭:
v1.0:(实现自动维持token时效、提交预约请求和发送短信提醒)
v2.0:(新增GUI,方便操作)
v3.0:(新增日志功能,实时输出请求结果)
以下内容对照v1.0的文章阅读,体验更佳
先上效果图:
(为了展示方便,我将定时时间改得短了点,效果是相同的。)
那么,,,,
短信:
当然,这会健身房约不到,如果设置成正确的时间点约的话,就可以成功啦。
文章目录
1. 修改详情
1.1 请求函数
v1.0发送网络请求的两个函数做出一点点修改:
具体功能不变,给两个函数加了参数(方便前后端交互),分别对应新增了函数返回值(为了将其输出在GUI界面上)。
def keep_token(token):
# url部分遮挡了,自己改喔
url = "https://xxx.xxx.xxx.xxx/gym/?state=1#/pages/index"
# 字典格式,推荐使用,它会自动帮你按照k-v拼接url
myParams = {
"token": token}
# 发送请求
res = requests.get(url=url, params=myParams)
# 如果响应码是200,也就是访问成功
if res.status_code == 200:
str1 = '成功:维持token时效... ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#访问失败
else:
str1 = '失败:维持token时效... ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
send_message.send('token刷新异常,可能导致预约失败,请尽快查看。')
return str1
def oppoint(token,ptId):
# url部分遮挡了,自己改喔
url = "http://xxx.xxxx.xxx.xxx/ccms-gym/gym/queue/appointMulti"
#通过信息收集可知,dateId是日期id,1表示今天,2表示明天;ptId是时间段id,每个时间段对应一个id,打开网页F12就能看见。
myParams = {
"token": token, "dateId": 2, "ptId": ptId,
"areaId": 3}
#发送请求
res = requests.get(url=url, params=myParams)
#请求成功
if res.status_code == 200:
chinese = re.findall('[\u4e00-\u9fa5]', res.text) # 汉字的范围为"\u4e00-\u9fa5"
tips = ''
for i in range(len(chinese)):
tips = tips + chinese[i]
str2 = tips + ' ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
send_message.send(tips)
else:
str2 = '预约失败... ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
send_message.send('请求失败,可能导致预约失败,请尽快查看。')
return str2
1.2 多线程并行执行
具体代码在后面的my_window类里面有,主要是摒弃了schedule的定时,转而以sleep为基础自己写了个定时执行的代码,加了一个线程(实时输出日志),全部封装在了my_window类里面了。
1.3 发送短信
主体没变,只是把print()去掉了,因为我要完全实现后台运行+GUI上显示。
2. 本例中的GUI各组件详解
不得不说,单纯实现GUI太简单了,把它和后端代码联系起来运行也不难,这个tkinter库我完全没玩过,花了一个下午边看边写界面就整好了,最要命的还得是这个日志实时输出,写出来之后觉得我当时就是个傻x,但是当时钻了牛角尖是真的一点办法都没有,记录此文章也算给我长长记性。
以下代码注释非常详细,对代码本身的解释少一点,参考注释应该可以看懂
2.1 创建输入框
# 创建token输入框
def get_token(self):
# 创建l1标签
l1 = tkinter.Label(win, text='请输入token:', justify=tkinter.RIGHT, width=50)
l1.place(x=20