USTC(中科大)健康上报,邮件通知,自动联网

目录
  1. 中科大自动健康上报,保姆级护航,支持邮件通知
    1. 提要
    2. 报表提交
    3. 定时发送
    4. 连接网络通
    5. 邮件通知
      1. 准备
      2. 代码
    6. 收尾
    7. 效果图

中科大自动健康上报,保姆级护航,支持邮件通知

博主从到校从未上报过,学校突然发布通知,再不上报,全校通报,批评处分,所以想要弄个自动上报的脚本。

request

提要

我们主要是实现两个功能,一个是报表提交,一个是定时发送requests。另外就是一些适配中科大“特色”的功能:网络自动连接,邮箱通知。

大部分包python都自带,需要额外安装的有

1
2
pip3 install schedule
pip3 install requests

报表提交

通过抓包,发现健康上报主要是两个post,首先是登录账号,获取一个token,然后再用这个token配上其他参数,如:所在城市,健康状况,实现上报。

具体代码如下,我们把帐号密码等一系列参数放进一个usrpara.txt文档里,方便多个帐号一起读取。

usrpara.txt参考格式(#为注释)

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def webreport(usrpara):
session = requests.session()
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/85.0.4183.121 '
'Safari/537.36'
}
loginurl = 'https://passport.ustc.edu.cn/login?service=\
https%3A%2F%2Fweixine.ustc.edu.cn%2F2020%2Fcaslogin'
reporturl = 'https://weixine.ustc.edu.cn/2020/daliy_report'
username = usrpara[0]; password = usrpara[1]
logindata = {'username': username, 'password': password}
loginresponse = session.post(loginurl, headers = headers, data = logindata)
ini_token = re.search(r'<input type="hidden" name="_token" value=".*">', loginresponse.text).group(0)
token = ini_token[ini_token.find('value="') + len('value="') : -2]
reportpara = {
"_token":token,
"now_address":usrpara[2],#1forCNmainland;2forHk;3forForeign;4forMO;5forTW
"gps_now_address":"",
"now_province":usrpara[3],#forAnhui
"gps_province":"",
"now_city":usrpara[4],#for Hefei
"gps_city":"",
"now_detail":"",
"is_inschool":usrpara[5],#2forEast;3forSouth;4forMid;5forNorth;6forWest;7forXian;0forOut
"body_condition":usrpara[6],#1forNormal;2forPossible;3forConfirm;4forOthers
"body_condition_detail":"",
"now_status":usrpara[7],#1forNormalinSchool;2forHome;3forHomeObs;4forCenterObs;5forHospital;6forOthers
"now_status_detail":"",
"has_fever":usrpara[8],#0forNo;1forYes
"last_touch_sars":usrpara[9],#0forNo;1forYes
"last_touch_sars_date":"",
"last_touch_sars_detail":"",
"other_detail":""
}
reportrespone = session.post(reporturl, headers = headers, data = reportpara)

定时发送

这个比较简单,我们设置在每天12点执行一次上报,检测为200s,为了减少系统占有。

1
2
3
4
5
def timereport():
schedule.every().day.at("12:00").do(main)
while True:
schedule.run_pending()
time.sleep(200)

连接网络通

由于中科大特别不人性的网络只能一台设备登陆。我们上报脚本一般放在实验室的机子上(放到不需要占用网络通的服务器,忽略这一步),如果我们在其他地方登陆了网络通,那么上报脚本就会因为没有网络失败。

所以我们需要一个在webreport之前先连接网络的def。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def wltlogin():
rawurl = 'http://wlt.ustc.edu.cn/cgi-bin/ip'
cmd = 'login'
ip = 'yourip'
set = '%D2%BB%BC%FC%C9%CF%CD%F8'
name = 'your wlt name'
pwd = 'your wlt password'
wlturl = rawurl+'?'+'cmd='+cmd+'&url=URL&ip='+ip+'&name='+name+'&password='+pwd\
+'&savepass=on&set='+set
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/85.0.4183.121 '
'Safari/537.36'
}
logindata = requests.post(wlturl, headers = headers)

邮件通知

当我们上报成功的时候,或者失败了,我们都希望脚本告诉我们。所以需要一个通知脚本。

准备

先准备好一个邮箱,开通POP3/SMTP服务(百度教程一堆),获取登陆码。了解邮箱的服务器啥的(百度一堆),以163邮箱为例。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def sendmail(emailaddress, flag): #emailaddress 和 flag是为了后续整合方便
from email.mime.text import MIMEText
from email.header import Header
mailhost = 'smtp.163.com'
neteasemail = smtplib.SMTP()
neteasemail.connect(mailhost,25)
account = '你的邮箱帐号'
pwd = '登陆码(非密码)'
neteasemail.login(account,password=pwd)
sender = '你的邮箱帐号@163.com'
receiver = emailaddress
if flag ==0:
content = 'Congratulation from Robot.'
else:
content = 'Sorry, something error today about your report, please contact the admin!'
message = MIMEText(content,'plain','utf-8')
subject = 'USTC_HR_Result'
message['Subject'] = Header(subject, 'utf-8')
message['From'] = '<你的邮箱帐号@163.com>' #这两行很重要,如果发邮件显示544,可能是没加这两行
message['To'] = "'<"+emailaddress+">'" #这两行很重要,如果发邮件显示544,可能是没加这两行
neteasemail.sendmail(sender, receiver, message.as_string())
neteasemail.quit()

收尾

最后整合一个main函数就行。完整参考代码见

Github链接

点个star呗(^-^)

效果图

result