python小程序脚本与数据库联动实现大量自动上报体温

269 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

事情起因是最近学校又开始要求上报体温,而本人记性不好,经常忘记,于是就想着要不要编写一个小脚本来实现自动化上报体温,又想到能不能用数据库来录入信息,实现帮许多人一起填报,于是就有个这个小脚本,请大佬们指教

代码附在文末,不希望看代码解析的可以直接划到最后

总览

​ 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()

\