贴一个python3的,写个批处理放在自启动目录,每天打开电脑即可,美汁汁。
# -*- coding:utf8 -*-
import random
import requests
import re
import tkinter.messagebox as tk
login_html = ''
temp_html = ''
clock_html = ''
# 填写下面信息即可
tem = 37 - random.randint(5, 10) / 10 # 正常温度:36° - 36.5°
user = '2020xxxxx' # 你的学号
password = 'password' # 你的密码
area = 'xx省' # 你的省份
location = 'xx市xx县' # 详细位置
try:
# 抓取网页上的__VIEWSTATE 等参数
def get__(target, html):
'''
抓取网页上的__VIEWSTATE 等参数用于post
:param target: 要抓取的参数名
:param html: 抓取参数所在的html文本
:return: 返回参数的值
'''
text = 'id="' + target + '" value="'
res = re.search(text + '[/+=\w]+"', html) # 查找含有类似于id="__VIEWSTATE" value="/wsdijd...."的字段
start = res.span()[0] + len(text)
end = res.span()[1] - 1
return html[start:end] # 截取参数内容返回
# 打卡提交数据
data = {
# 两个标志是必要的
'__VIEWSTATE': '',
'__EVENTVALIDATION': '',
# 打卡表单内容
'ctl00$cph_right$e_area': area,
'ctl00$cph_right$e_location': location,
'ctl00$cph_right$e_observation': '无下列情况',
'ctl00$cph_right$e_health$0': '无不适',
'ctl00$cph_right$e_temp': str(tem),
'ctl00$cph_right$e_describe': '',
'ctl00$cph_right$e_survey01': '疫情期间未出国出境',
'ctl00$cph_right$e_submit': '提交保存'
}
# 登录Requests Header
login_head = {
'Origin': 'https://ssp.scnu.edu.cn',
'Referer': 'https://ssp.scnu.edu.cn/login.aspx',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}
# 打卡Requests Header
clock_head = {
'Origin': 'https://ssp.scnu.edu.cn',
'Referer': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
}
# 登录界面
s = requests.session()
login_url = 'https://ssp.scnu.edu.cn/login.aspx' # 登录url
login = s.get(login_url)
login_html = login.text
# 登录Requests Data
login_data = {
# '__VIEWSTATEGENERATOR': 'C2EE9ABB',
'__EVENTTARGET': 'logon',
'__VIEWSTATE': get__('__VIEWSTATE', login_html),
'__EVENTVALIDATION': get__('__EVENTVALIDATION', login_html),
'log_username': user,
'log_password': password
}
# 向登录页面post数据
res = s.post(url=login_url, data=login_data, headers=login_head)
# 利用登录后网页源代码查找key
# 因为打卡页面上参数key每次登录都会变化
# 找到key就可以定位到打卡页面
temp_html = res.text
start = temp_html.find('opt_rc_jkdk.aspx?')
end = temp_html.find('>健康打卡') - 1
clock_site = 'https://ssp.scnu.edu.cn/' + temp_html[start:end] # 截取key获得打卡网址
clock_head['Referer'] = clock_site # 用打卡网址更新 Requests Header 的参数
clock_html = s.get(clock_site).text # 用于中间Requests Data查找请求参数
# 中间Requests Data
temp_data = {
'ctl00$cph_right$e_ok': 'on',
'ctl00$cph_right$ok_submit': '开始填报',
# '__VIEWSTATEGENERATOR':'DC47EEF4',
'__VIEWSTATE': get__('__VIEWSTATE', clock_html),
'__EVENTVALIDATION': get__('__EVENTVALIDATION', clock_html)
}
# 进入打卡页面
res = s.post(url=clock_site, data=temp_data, headers=clock_head)
clock_html = res.text
# 更新打卡Data
data['__VIEWSTATE'] = get__('__VIEWSTATE', clock_html)
data['__EVENTVALIDATION'] = get__('__EVENTVALIDATION', clock_html)
# 提交打卡内容
res2 = s.post(url=clock_site, data=data, headers=clock_head)
if res2.text.find('打卡成功') == -1:
tk.showwarning('打卡失败!','请查看打卡内容是否变更!')
else:
tk.showinfo('打卡成功', '温度为:' + str(tem))
except Exception as e:
tk.showerror('打卡失败!', '请查看error log')
with open('error log.txt','w') as f:
f.write(str(e))
f.write('====='*6 + '\n')
f.write(login_html)
f.write('====='*6 + '\n')
f.write(temp_html)
f.write('====='*6 + '\n')
f.write(clock_html)