本文已参与「新人创作礼」活动,一起开启掘金创作之路
事情起因是最近学校又开始要求上报体温,而本人记性不好,经常忘记,于是就想着要不要编写一个小脚本来实现自动化上报体温,又想到能不能用数据库来录入信息,实现帮许多人一起填报,于是就有个这个小脚本,请大佬们指教
代码附在文末,不希望看代码解析的可以直接划到最后
总览
0x10.python实现post报文上报部分
0x11.提交表单部分
0x12表单提交部分
0x13用户资格审查部分
0x14调取数据库中数据
0x15自动化部分
0x16数据库的前置操作
0x17体温填报部分源码
0x20使用mysql实现上报人员管理部分
0x21增加需要填报体温的人员
0x22删除人员
0x23检查人员是否过期
0x24后台管理部分源码
0x10.python实现post报文上报部分
提交报文的部分这部分使用了python的request模块
因为学校的后台有反扒机制,并且个人信息的验证
制作该部分内容,首先需要用burpsuit抓取提交数据时的表单
然后模仿小程序提交的表单进行构造
0x11.提交表单部分
可以看到提交的是post表单,所以决定使用request模块的post函数
该模块的详解放在这里
占位
学校的身份验证,是通过头信息中的cookie来实现的,所以需要定制request函数的headers头部
所以确定了,需要为request.post传入三个变量,url,headers,以及data
url填写提交体温界面的url
headers直接复制burpsuite表单,自己加单引号和大括号,编为元组
data部分我根据学校的格式直接传入字符串加变量
def job1(token):
# 将每个人的三次提问全部填完
url = 'http://保密.edu.cn/保密保密保密reInfo'
#url用于存放发送的目的地址
token = (
'CenterSoftWeb='+token)
#token变量用于给cookie赋值,独立出来方便给更多人一起填报
headers = {
'Host': '保密.edu.cn',
'Content-Length': '102', #该条可以不要可以自动生成
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'Origin': 'http://保密.edu.cn',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType'
'/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat'
'(0x63030532)'),
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Cookie': token,
'Referer': 'http://保密.edu.cn/保密保密保密reInfo',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'close',
}
0x12表单提交部分
之后提交表单,我稍微改变使它可以把我们学校一天三次填报一次性提交完
for hour in ('5', '9', '14',):
post_data = 'TimeNowHour=' + hour + '&TimeNowMinute=37&Temper1=36&Temper2=0&ReSubmiteFlag=0f8d8f28-c826-4696-8e53-cca2ebfe44ea'
requests.post(url, headers=headers, data=post_data)
0x13用户资格审查部分
然后引入函数调取数据库中的信息,便于一起填报大量信息
cds变量我们一会在下面说,该变量是用来承接从数据库中导出的信息的,是一个元组,其中0位置是用户的编号,1位置是注册的时间,2位置是用户的token
这里的设计逻辑是
我认为用户总数不会超过9000,那么,把过期的用户编号加9000便可方便的识别过期用户和没过期用户,而不用频繁的去操作数据库来进行增删
def job3():
# 遍历token
cds = use()
#use是我自定义的一个操作数据库的函数,在接下来会介绍到
for k in cds:
if (int)(k[0]) > 9000:
continue
else:
job1(k[2])
#当用户为未过期用户时将他的token传入填报体温的函数中进行自动填报
0x14调取数据库中数据
接下来介绍上面的use函数
调取数据库中信息
这个部分以及之后的数据库操作部分都使用了python的pymysql模块
此模块的详解请点击这个
占位
def use():
# 该函数用于操作提交请求,不用于进行表单操作
sql = """
select * from peoplelist
"""
# 此处使用sql语句查看表单中全部数据
cursor.execute(sql)
# 此处用来提交语句
cds = cursor.fetchall()
# 此处用来获得数据,返回变量为元组类型
return cds
0x15自动化部分
提交表单部分的最后,还设计了一个定时的小功能,方便把这个小脚本挂在服务器就不用管它了,免得每天都要把他打开运行一下
此处使用了python的schedule模块
该模块的详解放在这里
占位
schedule.every().day.at("14:01").do(job3)
while True:
schedule.run_pending()
time.sleep(1)
print("等待中")
0x16数据库的前置操作
但是还有一点没有结束,就是上面在use处我们使用了pymysql模块所以我们需要连接数据库并创建游标所以主函数部分变成了
conn = pymysql.connect(host="localhost", user="root", passwd="", db="python", charset="utf8", port=3307)
# 连接数据库
cursor = conn.cursor()
# 创建游标
job3()
# 以下是定时模块
schedule.every().day.at("21:22").do(job3)
while True:
schedule.run_pending()
time.sleep(1)
print("等待中")
cursor.close()
# 关闭游标
conn.close()
# 关闭连接
0x17体温填报部分源码
我将体温填报部分的源码放在这里,有需要的各位可以按需,按模块改装使用
import requests
import schedule
import time
import pymysql
def use():
# 该函数用于操作提交请求,不用于进行表单操作
sql = """
select * from peoplelist
"""
cursor.execute(sql)
cds = cursor.fetchall()
return cds
def job3():
# 遍历token
cds = use()
for k in cds:
if (int)(k[0]) > 9000:
continue
else:
job1(k[2])
def job1(token):
# 将每个人的三次提问全部填完
url = 'http://保密.edu.cn/保密保密保密reInfo'
#url用于存放发送的目的地址
token = (
'CenterSoftWeb='+token)
#token变量用于给cookie赋值,独立出来方便给更多人一起填报
headers = {
'Host': '保密.edu.cn',
'Content-Length': '102', #该条可以不要可以自动生成
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'Origin': 'http://保密.edu.cn',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType'
'/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat'
'(0x63030532)'),
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Cookie': token,
'Referer': 'http://保密.edu.cn/保密保密保密reInfo',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'close',
}
for hour in ('5', '9', '14',):
post_data = 'TimeNowHour=' + hour + '&TimeNowMinute=37&Temper1=36&Temper2=0&ReSubmiteFlag=0f8d8f28-c826-4696-8e53-cca2ebfe44ea'
requests.post(url, headers=headers, data=post_data)
# 上面全是函数,参数为cookie
conn = pymysql.connect(host="localhost", user="root", passwd="", db="python", charset="utf8", port=3307)
# 连接数据库
cursor = conn.cursor()
# 创建游标
job3()
# 以下是定时模块
schedule.every().day.at("14:01").do(job3)
while True:
schedule.run_pending()
time.sleep(1)
print("等待中")
cursor.close()
# 关闭游标
conn.close()
# 关闭连接
至此体温填报部分结束,接下来是人员名单的数据库管理部分
0x20使用mysql实现上报人员管理部分
数据库部分具体学习点这里
占位
避坑说明,在此处我提前创建了数据库“python”和表“peoplelist”
0x21增加需要填报体温的人员
人员管理首先是要添加人员
故先制作一个add函数
def add():
name = input("名字:")
date = input("年份:")
token = input("token:")
cursor.execute("""
insert
into peoplelist(num,date,token) values('%s','%s','%s');
"""
% (name, date, token))
# 编写mysql语句,增加一条记录
conn.commit()
# 确认提交
0x22删除人员
再写一个删除人员
def mydel():
cursor.execute(
"""
delete
from peoplelist
where num=%s;
"""
% (input("请输入想要删除的序号")))
# 编写mysql语句,实现删除一条记录
conn.commit()
# 确认提交
0x23检查人员是否过期
写下来是这套程序的核心思路,就是在前文说的把国企人员的序号加9000使不被提交token
此处使用了datetime函数,并把它重命名为dt注意避坑
datetime函数具体说明点这里
占坑
def check():
# 检查是否过期 # 获取当前时间
af_day = dt.datetime.strftime(dt.datetime.now() - dt.timedelta(days=31), "%Y-%m-%d") # 获取过期时间
sql = """
select * from peoplelist
where date = '%s'
""" % af_day # 查询过期 的记录
cursor.execute(sql)
cds = cursor.fetchall()
# 得到数据库返回元组,可迭代对象
for k in cds:
sql = """
UPDATE peoplelist
SET
num = %s
WHERE
num = %s
""" % ((str)((int)(k[0]) + 9000), k[0])
cursor.execute(sql)
conn.commit()
# 确认提交
至此简易的后台管理程序就编写好了
0x24后台管理部分源码
源码在此
import pymysql
import datetime as dt
def add():
name = input("名字:")
date = input("年份:")
token = input("token:")
cursor.execute("""insert into peoplelist(num,date,token) values('%s','%s','%s');""" % (
name, date, token))
conn.commit()
# 确认提交
def mydel():
cursor.execute("""delete from peoplelist where num=%s;""" % (input("请输入想要删除的序号")))
conn.commit()
# 确认提交
def check():
# 检查是否过期 # 获取当前时间
af_day = dt.datetime.strftime(dt.datetime.now() - dt.timedelta(days=31), "%Y-%m-%d") # 获取过期时间
sql = """
select * from peoplelist
where date = '%s'
""" % af_day # 查询过期 的记录
cursor.execute(sql)
cds = cursor.fetchall()
# 得到数据库返回元组,可迭代对象
for k in cds:
sql = """
UPDATE peoplelist
SET
num = %s
WHERE
num = %s
""" % ((str)((int)(k[0]) + 9000), k[0])
cursor.execute(sql)
conn.commit()
# 确认提交
conn = pymysql.connect(host="localhost", user="root", passwd="", db="python", charset="utf8", port=3307)
# 连接数据库
cursor = conn.cursor()
# 创建游标
while True:
print("1.增加\n"
"2.删除\n"
"3.检查过期\n"
"4.全部会员\n"
"5.退出\n")
a = input("需要什么服务:")
flag = "1"
if a == '1':
while flag != "0":
add()
flag = input("停止录入按0,任意键继续录入:")
elif a == '2':
while flag != "0":
mydel()
flag = input("停止录入按0,任意键继续录入:")
elif a == '3':
check()
else:
cursor.close()
# 关闭游标
conn.close()
# 关闭连接
exit()
\