Python实现疫情通定时自动填写功能(附代码)
本文介绍如何利用Python编写自动化脚本,解决学校疫情通每日手动填报繁琐的问题。通过抓取网页请求头与主体,模拟提交数据,并结合SMTP模块实现执行结果的邮件通知。最后通过Linux Crontab设置定时任务,实现每日早晨自动运行,提高填报效率并减少人为遗漏。
Python自动化疫情通填报方案
自疫情开始以来,学校要求学生每天通过校内系统填报个人每日疫情相关情况,该流程被称为“疫情通”。
然而,由于个人疏忽,曾出现未按时提交的情况,如下图所示。

鉴于记忆力有限且希望简化操作,决定使用Python实现自动化定时任务。
核心模块开发与请求模拟
1、核心模块
首先打开IE浏览器或Chrome浏览器。

在网页界面按下F12键,获取请求头和请求体的相关信息。
(此处展示相关截图)
启动PyCharm开发环境。
根据获取到的请求头和请求体信息,编写核心代码。
url = "https://xxcapp.xidian.edu.cn/ncov/wap/default/save"
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-cn',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'xxcapp.xidian.edu.cn',
'Origin': 'https://xxcapp.xidian.edu.cn',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) '
'Version/13.1 Safari/605.1.15',
'Connection': 'keep-alive',
'Referer': 'https://xxcapp.xidian.edu.cn/ncov/wap/default/index',
'Content-Length': '2314',
# Cookie是身份标识
'Cookie': 'Hm_lpvt_48b682d5d22a90111e44886b972e3268=1590108209; ' # Hm_lpvt_xxxxxxx 为当前时间戳(秒)
# Hm_lvt_xxx 为一串时间戳。最近的一次访问时间戳追加在后面,最多保留4个时间戳。可以通过关闭浏览器然后再访问相同页面查看其cookie值来验证。
'Hm_lvt_48b682a90111e46b9d4885d2272e3268=1590108209; UUkey=99cf86f295b522e264680402bf6b221e; '
'Uqn3iPIDZBpD3wJU=vqtbQwSD1sjDM; eai-sess=prshbd3vo96po8i27a4mod1i67',
'X-Requested-With': 'XMLHttpRequest',
}
data = {
'uid': '123671', 'date': str(datetime.date.today() - datetime.timedelta(days=1)).replace("-", ""),
'tw': '3', # 体温:第三项,36.5-36.9
'sfcxtz': '0', # 是否出现
'sfyyjc': '0', # 是否医院检查
'jcjgqr': '0', # 检查结果确认
'sfjcbh': '0', # 是否接触病患
'sfcxzysx': '0', # 是否出现
'address': '', 'area': '', 'province': '', # 地址
'city': '', # 城市
# 伽利略定位系统详情
'geo_api_info': '{"type":"complete","position":{"P":11.203296169705,"O":11.667691514757,"lng":11.667692,'
'"lat":11.203296},"location_type":"html5","message":"Get ipLocation failed.Get geolocation '
'success.Convert Success.Get address success.","accuracy":15,"isConverted":true,"status":1,'
'"addressComponent":{"citycode":"0001","adcode":"123456","businessAreas":[],'
'"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"",'
'"streetNumber":"","province":"","city":"","district":"","township":""},'
'"formattedAddress":"","roads":[],"crosses":[],"pois":[],'
'"info":"SUCCESS"}',
'created': str(int(time.time())), # 创建时间
'sfzx': '0', # 是否在校 否
'sfjcwhry': '0', # 是否接触武汉人员 否
'sfcyglq': '0', # 是否处于隔离期 否
'sftjwh': '0', # 是否途径武汉 否
'sftjhb': '0', # 是否途径湖北 否
'fjsj': '0',
'sfjchbry': '0', # 是否接触湖北人员 否
'sfsfbh': '0', # 是否
'jhfjsftjwh': '0', # *****是否途径武汉 否
'jhfjsftjhb': '0', # *****是否途径湖北 否
'szsqsfybl': '0',
'sfygtjzzfj': '0', # 是否
'sfjcjwry': '0', # 是否接触境外人员 否
'id': '4393912',
'ismoved': '0', # 与上次地点是否有不同
}
requests.post(url=url, data=data, headers=headers)
上述代码已具备模拟提交数据的能力,但尚未达到完全自动化的要求。最终目标是将脚本部署至Linux服务器,实现每日早晨自动运行并接收反馈。因此,需要增加一个通知模块,此处选择邮件通知方式。
邮件通知模块实现
2、通知模块
def sendEmail(message):
msg_from = 'xxxxx@qq.com' # 发送方邮箱
passwd = '' # 发送方邮箱的授权码
msg_to = 'xxxxx@qq.com' # 收件人邮箱
subject = "疫情通" # 主题
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = msg_to
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号
s.login(msg_from, passwd)
s.sendmail(msg_from, msg_to, msg.as_string())
print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送成功,邮件内容:" + message)
except s.SMTPException:
print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送失败,邮件内容:" + message)
finally:
s.quit()
该函数接收字符串作为参数,并将此字符串发送至指定的目标邮箱。
因此,核心代码的最后一行修改为调用邮件发送函数。
sendEmail(eval(requests.post(url=url, data=data, headers=headers).text)['m'])
代码编写完毕,完整代码见文末。接下来实现自动化运行。
Linux服务器定时任务配置
3、自动化模块
启动Terminal终端。
将该Python文件通过scp命令传输至服务器,并在同一目录下创建output.log文件,用于记录每日运行信息(以应对邮件发送失败的情况)。
编辑/etc/crontab文件,在末尾的#注释前添加如下内容。最后两个参数分别为Python文件和日志文件的路径,整行命令表示每天8:30以root身份自动执行右侧命令。

运行效果与完整代码
4、最终效果
根据日志文件内容显示,2020-05-25早上8时30分3秒完成了此任务,即该任务单次运行耗时约三秒。

在邮箱中也可以看到已收到相关通知邮件。

5、完整代码
import time
import requests
import smtplib
import datetime
from email.mime.text import MIMEText
def sendEmail(message):
msg_from = 'xxxxx@qq.com' # 发送方邮箱
passwd = '' # 发送方邮箱的授权码
msg_to = 'xxxxx@qq.com' # 收件人邮箱
subject = "疫情通" # 主题
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = msg_to
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号
s.login(msg_from, passwd)
s.sendmail(msg_from, msg_to, msg.as_string())
print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送成功,邮件内容:" + message)
except s.SMTPException:
print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送失败,邮件内容:" + message)
finally:
s.quit()
url = "https://xxcapp.xidian.edu.cn/ncov/wap/default/save"
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-cn',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'xxcapp.xidian.edu.cn',
'Origin': 'https://xxcapp.xidian.edu.cn',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) '
'Version/13.1 Safari/605.1.15',
'Connection': 'keep-alive',
'Referer': 'https://xxcapp.xidian.edu.cn/ncov/wap/default/index',
'Content-Length': '2314',
# Cookie是身份标识
'Cookie': 'Hm_lpvt_48b682d5d22a90111e44886b972e3268=1590108209; ' # Hm_lpvt_xxxxxxx 为当前时间戳(秒)
# Hm_lvt_xxx 为一串时间戳。最近的一次访问时间戳追加在后面,最多保留4个时间戳。可以通过关闭浏览器然后再访问相同页面查看其cookie值来验证。
'Hm_lvt_48b682a90111e46b9d4885d2272e3268=1590108209; UUkey=99cf86f295b522e264680402bf6b221e; '
'Uqn3iPIDZBpD3wJU=vqtbQwSD1sjDM; eai-sess=prshbd3vo96po8i27a4mod1i67',
'X-Requested-With': 'XMLHttpRequest',
}
data = {
'uid': '123671', 'date': str(datetime.date.today() - datetime.timedelta(days=1)).replace("-", ""),
'tw': '3', # 体温:第三项,36.5-36.9
'sfcxtz': '0', # 是否出现
'sfyyjc': '0', # 是否医院检查
'jcjgqr': '0', # 检查结果确认
'sfjcbh': '0', # 是否接触病患
'sfcxzysx': '0', # 是否出现
'address': '', 'area': '', 'province': '', # 地址
'city': '', # 城市
# 伽利略定位系统详情
'geo_api_info': '{"type":"complete","position":{"P":11.203296169705,"O":11.667691514757,"lng":11.667692,'
'"lat":11.203296},"location_type":"html5","message":"Get ipLocation failed.Get geolocation '
'success.Convert Success.Get address success.","accuracy":15,"isConverted":true,"status":1,'
'"addressComponent":{"citycode":"0001","adcode":"123456","businessAreas":[],'
'"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"",'
'"streetNumber":"","province":"","city":"","district":"","township":""},'
'"formattedAddress":"","roads":[],"crosses":[],"pois":[],'
'"info":"SUCCESS"}',
'created': str(int(time.time())), # 创建时间
'sfzx': '0', # 是否在校 否
'sfjcwhry': '0', # 是否接触武汉人员 否
'sfcyglq': '0', # 是否处于隔离期 否
'sftjwh': '0', # 是否途径武汉 否
'sftjhb': '0', # 是否途径湖北 否
'fjsj': '0',
'sfjchbry': '0', # 是否接触湖北人员 否
'sfsfbh': '0', # 是否
'jhfjsftjwh': '0', # *****是否途径武汉 否
'jhfjsftjhb': '0', # *****是否途径湖北 否
'szsqsfybl': '0',
'sfygtjzzfj': '0', # 是否
'sfjcjwry': '0', # 是否接触境外人员 否
'id': '4393912',
'ismoved': '0', # 与上次地点是否有不同
}
sendEmail(eval(requests.post(url=url, data=data, headers=headers).text)['m'])
总结
到此这篇关于Python实现疫情通定时自动填写功能(附代码)的文章就介绍到这了,更多相关Python疫情通自动填写内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













