2022.11.19更新:
由于学校信息处把网页端打卡给ban了,本方法不幸失效,等博主忙完这阵子,继续钻研一波知识,此所谓道高一尺魔高一丈,如今我们学生暂落下风,看看还有没有大神出手,博主也会不断学习的。
2022.12.20更新
世事茫茫难自料。
0.免责声明
本博客只做技术交流分享,切勿实际用于自动打卡,任何错误概不负责。共同抗疫,人人有责!
1.代码来源
我只教如何把python部署到云函数上。因为大佬的机器人有些难,所以我使用函数工作流替代。
代码参考:
https://github.com/Wood1314/inuaa
https://yym68686.top/TelegramBot
感谢两位大佬的代码。
2.代码微调
由于使用云函数功能,所以需要提供入口函数。将原来的:
if __name__ == '__main__':
startinuaa(sys.argv[1], sys.argv[2])
改为:
def main():
startinuaa('16211XXXX','ZHISHIMIMA')
def handler (event, context):
output =json.dumps(event)
main()
return output
startinuaa()函数两个字符串分别为学号密码。此外如果你是天目湖校区的学生,请自行通过浏览器爬取Data,或者使用我爬起的内容如下:
data = {
'sfzhux': '0',
'zhuxdz': '',
'szgj': '',
'szcs': '',
'szgjcs': '',
'sfjwfh': '0',
'sfyjsjwfh': '0',
'sfjcjwfh': '0',
'sflznjcjwfh': '0',
'sflqjkm': '4',
'jkmys': '1',
'sfjtgfxdq': '0',
'tw': '2',
'sfcxtz': '0',
'sfjcbh': '0',
'sfcxzysx': '0',
'qksm': '',
'sfyyjc': '0',
'jcjgqr': '0',
'remark': '',
'address': '江苏省常州市溧阳市古县街道梅岭玉大道南京航空航天大学',
'geo_api_info': '{\"type\":\"complete\",\"position\":{\"Q\":31.374222547744,\"R\":119.48663357204902,\"lng\":119.486634,\"lat\":31.374223},\"location_type\":\"html5\",\"message\":\"Get ipLocation failed.Get geolocation success.Convert Success.Get address success.\",\"accuracy\":198,\"isConverted\":true,\"status\":1,\"addressComponent\":{\"citycode\":\"0519\",\"adcode\":\"320481\",\"businessAreas\":[],\"neighborhoodType\":\"\",\"neighborhood\":\"\",\"building\":\"\",\"buildingType\":\"\",\"street\":\"滨河路\",\"streetNumber\":\"29号\",\"country\":\"中国\",\"province\":\"江苏省\",\"city\":\"常州市\",\"district\":\"溧阳市\",\"towncode\":\"320481003000\",\"township\":\"古县街道\"},\"formattedAddress\":\"江苏省常州市溧阳市古县街道梅岭玉大道南京航空航天大学\",\"roads\":[],\"crosses\":[],\"pois\":[],\"info\":\"SUCCESS\"}',
'area': '江苏省 常州市 溧阳市',
'province': '江苏省',
'city': '常州市',
'sfzx': '0',
'sfjcwhry': '0',
'sfjchbry': '0',
'sfcyglq': '0',
'gllx': '',
'glksrq': '',
'jcbhlx': '',
'jcbhrq': '',
'bztcyy': '',
'sftjhb': '0',
'sftjwh': '0',
'sftjwz': '0',
'sfjcwzry': '0',
'jcjg': '',
'date': time.strftime("%Y%m%d", time.localtime()), # 打卡年月日一共8位
'uid': user['uid'], # UID
'created': round(time.time()), # 时间戳
'jcqzrq': '',
'sfjcqz': '',
'szsqsfybl': '0',
'sfsqhzjkk': '0',
'sqhzjkkys': '',
'sfygtjzzfj': '0',
'gtjzzfjsj': '',
'created_uid': '0',
'id': user['id'],# 打卡的ID,其实这个没影响的
'gwszdd': '',
'sfyqjzgc': '',
'jrsfqzys': '',
'jrsfqzfy': '',
'ismoved': '0',
'dqsfzgfxszqs':'0', #当前是否在低风险地区
'bfhzjyq': '0', #不符合接种要求
'cjfxsfhs': '', #春季返校后是否坐核酸
'gzczxq': '3', #工作常驻校区
'sfjkyc': '0',
'sfmrhs': '1',
'ifcyglq': '0',
'cjfxsfhs': '1',
}
将军路校区直接使用原博主提供的就可以,记得把import json的注释去掉,明故宫校区无能为力,请自行上https://m.nuaa.edu.cn/uc/wap/login?redirect=https%3A%2F%2Fm.nuaa.edu.cn%2Fncov%2Fwap%2Fdefault%2Findex%3Ft%3D20210430
通过开发者模式爬取。如果你是天目湖校区的,可以直接使用以下代码。
天目湖校区可直接使用源码:
# -*- coding: UTF-8 -*-
import requests
import time
import json
import sys
import re
# from send_mail import send_mail
# 如果发包过快会造成502,如果给多个同学打卡请注意一下请求速度
try_times = 2
# 每次requests请求的延迟(s秒),太低会封IP
delay = 3
'''
教务处的垃圾命名规则
info: {
sfzhux: 0,
zhuxdz: '',
szgj: '',
szcs: '',
szgjcs: '',
sfjwfh: 0,
sfyjsjwfh: 0,
sfjcjwfh: 0,
sflznjcjwfh: 0,
sflqjkm: '0',
jkmys: 0,
sfjtgfxdq: 0,
nuaaxgymjzqk:"1", //新冠疫苗接种情况:
dyzjzsj:"", //第一针接种时间
bfhzjyq:"3", //不符合接种要求
hxyxjzap:"2", //后续意向接种安排
yjzjsj:"", //预计接种时间
sftjlkjc: '',
lkjctlsj: '',
sfsylkjcss: '',
gjzsftjlkjc: '',
gjzlkjctlsj: '',
gjzsfsylkjcss: '',
ifhxjc:'', //你是否进行了核酸检测
hsjconetime:"", //第一次检测时间
hsjconeplace:"", //第一次检测地点
hsjconejg:"", //第一次检测结果(1/2/3)
hsjctwotime:"", //第二次检测时间
hsjctwoplace:"", //第二次检测地点
hsjctwojg:"", //第二次检测结果(1/2/3)
hsjcthreetime:"", //第三次检测时间
hsjcthreeplace:"", //第三次检测地点
hsjcthreejg:"", //第三次检测结果(1/2/3)
hsjcfourtime:"", //第四次检测时间
hsjcfourplace:"", //第四次检测地点
hsjcfourjg:"", //第四次检测结果(1/2/3)
ywchxjctime:"", //已完成核酸检测次数
hsjclist:"{}",
// 新增2
njrddz:"", //您的今日住址(详细到门牌号、宿舍号)
gzczxq:"", //工作常驻校区(1,2,3)
ifznqgfxljs:"", //7月10日后是否有江宁区中高风险地区旅居史
iflsqgfxljs:"", //7月10日后是否有溧水区中高风险地区旅居史
// ifjrglkjc:"", //7月10日以来是否进入过禄口机场大厅或与机场工作人员有密切接触
// gtjjsfhm:"", //共同居住人员中是否有黄码或7月10日以来经停机场人员
// ywchscs:"", //已完成核酸检测次数
// gtjzsfhzl:"", //共同居住人是否已黄码转绿或已解除14天隔离观察
// sffhddjjgc:"",//是否符合单独居家观察条件(与共同居住人用餐等不交叉)
// end
// 新增3
// ifjgzgfxq:"", //7月10日后是否经过除禄口机场外其他中高风险区
// jgzgfxrq:"", //7月10日后最后一次经过中高风险区的日期
// jgzgfxdq:"", //7月10日后最后一次经过中高风险区的地区
// jgzgfxxxdz:"", //7月10日后最后一次经过中高风险区的详细地址
zrwjtw:"", //昨日晚间体温范围
jrzjtw:"", //今日早间体温范围
jrlvymjrq:"", //7月10日后最后一次进入过禄口机场大厅或与机场工作人员有密切接触的日期
ifcyglq:"", //是否处于隔离期/医学观察期
// end
// 新增4
// newwchsjccs:"", //替换以前的已完成核酸检测次数
// dsdecjcsj:"", //倒数第二次核酸检测时间
// dsdechsjcjgtype:"", //倒数第二次核酸检测地点
// dsdrchsjcdd:"", //倒数第二次核酸检测地点
// dsdechsjcjg:"", //倒数第二次核酸检测结果
// zhyccjcsj:"", //最后一次核酸检测时间
// zhycchsjcjgtype:"", //最后一次核酸检测地点
// zhycchsjcdd:"", //最后一次核酸检测地点
// zhycchsjcjg:"", //最后一次核酸检测结果
wskmyy:"",//请简要说明无苏康码原因
zhycjgdqifjn:"",//7月10日后最后一次经过中高风险区的地区为中国境内还是中国境外
dqsfzgfxszqs:"", //当前是否在中高风险地区所在设区市(直辖市为区、县)
gqsfyzgfxljs:"", //过去21天内是否有中高风险区旅居史(不含交通工具经停)
gqsfyqzfhryjc:"",//过去21天内是否与确诊/疑似病例/无症状感染者/从中高风险区返回人员(已解除隔离观察的不算)有密切接触
sfyjwljqyhg:"",//28天内是否有境外旅居史且已经回国
cjfxsfhs:"", //2022年春季返校后是否已做核酸检测
bzxyy:"", //不在校原因 1-4
bzxyydesc:"", //不在校原因其他时候的时候
}
'''
def get_uid_id(cookies):
'''
获取id与uid
'''
for _ in range(try_times):
try:
time.sleep(delay)
response = requests.get(
'https://m.nuaa.edu.cn/ncov/wap/default', cookies=cookies)
response.encoding = 'utf-8'
# print(response.text)
uid = re.search(r'"uid":"([0-9]*)"', response.text).group(1)
id = re.search(r'"id":([0-9]*)', response.text).group(1)
print(uid, id)
return uid,id
except Exception as e:
print(e)
# 就这样吧,让他崩溃,万一假打卡了就不好了
print('获取id、uid失败')
return False, '获取id、uid失败\n'
def login(login_id, login_password):
'''
登陆I南航,返回Cookie,失败返回空串
'''
# headers['Cookie'] = ''
cookies = ''
for _ in range(try_times):
try:
time.sleep(delay)
r = requests.get(
'https://m.nuaa.edu.cn/uc/wap/login', cookies=cookies)
print('get login page:', r.status_code)
cookies = dict(r.cookies)
#print(r.cookies)
time.sleep(delay)
r = requests.get('https://m.nuaa.edu.cn/uc/wap/login/check', cookies=cookies, data='username={}&password={}'.format(login_id, login_password))
print('login...:', r.status_code)
if ("账户或密码错误" in r.text):
return "账户或密码错误", '', ''
cookies.update(dict(r.cookies))
# headers['Cookie'] = cookie
uid, id = get_uid_id(cookies)
return cookies, uid, id
except Exception as e:
print(e)
print('login failed.')
pass
# raise Exception('lOGIN FAIL')
return '', '', ''
def sign(user):
'''
签到,并且发送邮件提醒,成功返回True,失败返回False
'''
for _ in range(try_times):
try:
data = {
'sfzhux': '0',
'zhuxdz': '',
'szgj': '',
'szcs': '',
'szgjcs': '',
'sfjwfh': '0',
'sfyjsjwfh': '0',
'sfjcjwfh': '0',
'sflznjcjwfh': '0',
'sflqjkm': '4',
'jkmys': '1',
'sfjtgfxdq': '0',
'tw': '2',
'sfcxtz': '0',
'sfjcbh': '0',
'sfcxzysx': '0',
'qksm': '',
'sfyyjc': '0',
'jcjgqr': '0',
'remark': '',
'address': '江苏省常州市溧阳市古县街道梅岭玉大道南京航空航天大学',
'geo_api_info': '{\"type\":\"complete\",\"position\":{\"Q\":31.374222547744,\"R\":119.48663357204902,\"lng\":119.486634,\"lat\":31.374223},\"location_type\":\"html5\",\"message\":\"Get ipLocation failed.Get geolocation success.Convert Success.Get address success.\",\"accuracy\":198,\"isConverted\":true,\"status\":1,\"addressComponent\":{\"citycode\":\"0519\",\"adcode\":\"320481\",\"businessAreas\":[],\"neighborhoodType\":\"\",\"neighborhood\":\"\",\"building\":\"\",\"buildingType\":\"\",\"street\":\"滨河路\",\"streetNumber\":\"29号\",\"country\":\"中国\",\"province\":\"江苏省\",\"city\":\"常州市\",\"district\":\"溧阳市\",\"towncode\":\"320481003000\",\"township\":\"古县街道\"},\"formattedAddress\":\"江苏省常州市溧阳市古县街道梅岭玉大道南京航空航天大学\",\"roads\":[],\"crosses\":[],\"pois\":[],\"info\":\"SUCCESS\"}',
'area': '江苏省 常州市 溧阳市',
'province': '江苏省',
'city': '常州市',
'sfzx': '0',
'sfjcwhry': '0',
'sfjchbry': '0',
'sfcyglq': '0',
'gllx': '',
'glksrq': '',
'jcbhlx': '',
'jcbhrq': '',
'bztcyy': '',
'sftjhb': '0',
'sftjwh': '0',
'sftjwz': '0',
'sfjcwzry': '0',
'jcjg': '',
'date': time.strftime("%Y%m%d", time.localtime()), # 打卡年月日一共8位
'uid': user['uid'], # UID
'created': round(time.time()), # 时间戳
'jcqzrq': '',
'sfjcqz': '',
'szsqsfybl': '0',
'sfsqhzjkk': '0',
'sqhzjkkys': '',
'sfygtjzzfj': '0',
'gtjzzfjsj': '',
'created_uid': '0',
'id': user['id'],# 打卡的ID,其实这个没影响的
'gwszdd': '',
'sfyqjzgc': '',
'jrsfqzys': '',
'jrsfqzfy': '',
'ismoved': '0',
'dqsfzgfxszqs':'0', #当前是否在低风险地区
'bfhzjyq': '0', #不符合接种要求
'cjfxsfhs': '', #春季返校后是否坐核酸
'gzczxq': '3', #工作常驻校区
'sfjkyc': '0',
'sfmrhs': '1',
'ifcyglq': '0',
'cjfxsfhs': '1',
}
time.sleep(delay)
r = requests.post('https://m.nuaa.edu.cn/ncov/wap/default/save', data=data, cookies=user['cookie'])
# print('sign statue code:', r.status_code)
print('sign return:', r.text)
r.encoding = 'utf-8'
print(user['cookie'])
if r.text.find('成功') >= 0:
print('打卡成功')
return True
else:
print('打卡失败,尝试重新登陆')
user['cookie'] = login(user['studentid'], user['password'])
except Exception as e:
print('尝试失败')
print(e)
pass
return False
def startinuaa(studentid, password):
user = {}
user['studentid'] = studentid
user['password'] = password
if (studentid != '' and password != ''):
user['cookie'], user['uid'], user['id'] = login(studentid, password)
if ("账户或密码错误" in user['cookie']):
return "{{(>_<)}}},账户或密码错误,呜呜呜。"
if sign(user):
return "打卡成功!"
else:
return "打卡失败!"
else:
return "输入格式错误!"
def main():
startinuaa('16211XXXX','ZHISHIMIMA')
#输入账号密码别忘了
def handler (event, context):
output =json.dumps(event)
main()
return output
将军路校区可直接使用源码
将军路校区的同学可以用以下代码,别忘了输入账号密码哦~
# -*- coding: UTF-8 -*-
import requests
import time
import json
import sys
import re
# from send_mail import send_mail
# 如果发包过快会造成502,如果给多个同学打卡请注意一下请求速度
try_times = 2
# 每次requests请求的延迟(s秒),太低会封IP
delay = 3
'''
教务处的垃圾命名规则
info: {
sfzhux: 0,
zhuxdz: '',
szgj: '',
szcs: '',
szgjcs: '',
sfjwfh: 0,
sfyjsjwfh: 0,
sfjcjwfh: 0,
sflznjcjwfh: 0,
sflqjkm: '0',
jkmys: 0,
sfjtgfxdq: 0,
nuaaxgymjzqk:"1", //新冠疫苗接种情况:
dyzjzsj:"", //第一针接种时间
bfhzjyq:"3", //不符合接种要求
hxyxjzap:"2", //后续意向接种安排
yjzjsj:"", //预计接种时间
sftjlkjc: '',
lkjctlsj: '',
sfsylkjcss: '',
gjzsftjlkjc: '',
gjzlkjctlsj: '',
gjzsfsylkjcss: '',
ifhxjc:'', //你是否进行了核酸检测
hsjconetime:"", //第一次检测时间
hsjconeplace:"", //第一次检测地点
hsjconejg:"", //第一次检测结果(1/2/3)
hsjctwotime:"", //第二次检测时间
hsjctwoplace:"", //第二次检测地点
hsjctwojg:"", //第二次检测结果(1/2/3)
hsjcthreetime:"", //第三次检测时间
hsjcthreeplace:"", //第三次检测地点
hsjcthreejg:"", //第三次检测结果(1/2/3)
hsjcfourtime:"", //第四次检测时间
hsjcfourplace:"", //第四次检测地点
hsjcfourjg:"", //第四次检测结果(1/2/3)
ywchxjctime:"", //已完成核酸检测次数
hsjclist:"{}",
// 新增2
njrddz:"", //您的今日住址(详细到门牌号、宿舍号)
gzczxq:"", //工作常驻校区(1,2,3)
ifznqgfxljs:"", //7月10日后是否有江宁区中高风险地区旅居史
iflsqgfxljs:"", //7月10日后是否有溧水区中高风险地区旅居史
// ifjrglkjc:"", //7月10日以来是否进入过禄口机场大厅或与机场工作人员有密切接触
// gtjjsfhm:"", //共同居住人员中是否有黄码或7月10日以来经停机场人员
// ywchscs:"", //已完成核酸检测次数
// gtjzsfhzl:"", //共同居住人是否已黄码转绿或已解除14天隔离观察
// sffhddjjgc:"",//是否符合单独居家观察条件(与共同居住人用餐等不交叉)
// end
// 新增3
// ifjgzgfxq:"", //7月10日后是否经过除禄口机场外其他中高风险区
// jgzgfxrq:"", //7月10日后最后一次经过中高风险区的日期
// jgzgfxdq:"", //7月10日后最后一次经过中高风险区的地区
// jgzgfxxxdz:"", //7月10日后最后一次经过中高风险区的详细地址
zrwjtw:"", //昨日晚间体温范围
jrzjtw:"", //今日早间体温范围
jrlvymjrq:"", //7月10日后最后一次进入过禄口机场大厅或与机场工作人员有密切接触的日期
ifcyglq:"", //是否处于隔离期/医学观察期
// end
// 新增4
// newwchsjccs:"", //替换以前的已完成核酸检测次数
// dsdecjcsj:"", //倒数第二次核酸检测时间
// dsdechsjcjgtype:"", //倒数第二次核酸检测地点
// dsdrchsjcdd:"", //倒数第二次核酸检测地点
// dsdechsjcjg:"", //倒数第二次核酸检测结果
// zhyccjcsj:"", //最后一次核酸检测时间
// zhycchsjcjgtype:"", //最后一次核酸检测地点
// zhycchsjcdd:"", //最后一次核酸检测地点
// zhycchsjcjg:"", //最后一次核酸检测结果
wskmyy:"",//请简要说明无苏康码原因
zhycjgdqifjn:"",//7月10日后最后一次经过中高风险区的地区为中国境内还是中国境外
dqsfzgfxszqs:"", //当前是否在中高风险地区所在设区市(直辖市为区、县)
gqsfyzgfxljs:"", //过去21天内是否有中高风险区旅居史(不含交通工具经停)
gqsfyqzfhryjc:"",//过去21天内是否与确诊/疑似病例/无症状感染者/从中高风险区返回人员(已解除隔离观察的不算)有密切接触
sfyjwljqyhg:"",//28天内是否有境外旅居史且已经回国
cjfxsfhs:"", //2022年春季返校后是否已做核酸检测
bzxyy:"", //不在校原因 1-4
bzxyydesc:"", //不在校原因其他时候的时候
}
'''
def get_uid_id(cookies):
'''
获取id与uid
'''
for _ in range(try_times):
try:
time.sleep(delay)
response = requests.get(
'https://m.nuaa.edu.cn/ncov/wap/default', cookies=cookies)
response.encoding = 'utf-8'
# print(response.text)
uid = re.search(r'"uid":"([0-9]*)"', response.text).group(1)
id = re.search(r'"id":([0-9]*)', response.text).group(1)
print(uid, id)
return uid,id
except Exception as e:
print(e)
# 就这样吧,让他崩溃,万一假打卡了就不好了
print('获取id、uid失败')
return False, '获取id、uid失败\n'
def login(login_id, login_password):
'''
登陆I南航,返回Cookie,失败返回空串
'''
# headers['Cookie'] = ''
cookies = ''
for _ in range(try_times):
try:
time.sleep(delay)
r = requests.get(
'https://m.nuaa.edu.cn/uc/wap/login', cookies=cookies)
print('get login page:', r.status_code)
cookies = dict(r.cookies)
# print(r.cookies)
time.sleep(delay)
r = requests.get('https://m.nuaa.edu.cn/uc/wap/login/check', cookies=cookies, data='username={}&password={}'.format(login_id, login_password))
print('login...:', r.status_code)
if ("账户或密码错误" in r.text):
return "账户或密码错误", '', ''
cookies.update(dict(r.cookies))
# headers['Cookie'] = cookie
uid, id = get_uid_id(cookies)
return cookies, uid, id
except Exception as e:
print(e)
print('login failed.')
pass
# raise Exception('lOGIN FAIL')
return '', '', ''
def sign(user):
'''
签到,并且发送邮件提醒,成功返回True,失败返回False
'''
for _ in range(try_times):
try:
data = {
'sfzhux': '0',
'zhuxdz': '',
'szgj': '',
'szcs': '',
'szgjcs': '',
'sfjwfh': '0',
'sfyjsjwfh': '0',
'sfjcjwfh': '0',
'sflznjcjwfh': '0',
'sflqjkm': '4',
'jkmys': '1',
'sfjtgfxdq': '0',
'tw': '2',
'sfcxtz': '0',
'sfjcbh': '0',
'sfcxzysx': '0',
'qksm': '',
'sfyyjc': '0',
'jcjgqr': '0',
'remark': '',
'address': '江苏省南京市江宁区秣陵街道慧园路南京航空航天大学将军路校区',
'geo_api_info': {"type":"complete","position":{"Q":31.939607,"R":118.791155,"lng":118.791155,"lat":31.939607},"location_type":"html5","message":"Get geolocation success.Don't need convert.Get address success.","accuracy":29,"isConverted":1,"status":1,"addressComponent":{"citycode":"025","adcode":"320115","businessAreas":[{"name":"开发区","id":"320115","location":{"Q":31.925973,"R":118.80980399999999,"lng":118.809804,"lat":31.925973}}],"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"将军大道","streetNumber":"29号","country":"中国","province":"江苏省","city":"南京市","district":"江宁区","towncode":"320115011000","township":"秣陵街道"},"formattedAddress":"江苏省南京市江宁区秣陵街道慧园路南京航空航天大学将军路校区","roads":[],"crosses":[],"pois":[],"info":"SUCCESS"},
'area': '江苏省 南京市 江宁区',
'province': '江苏省',
'city': '南京市',
'sfzx': '0',
'sfjcwhry': '0',
'sfjchbry': '0',
'sfcyglq': '0',
'gllx': '',
'glksrq': '',
'jcbhlx': '',
'jcbhrq': '',
'bztcyy': '',
'sftjhb': '0',
'sftjwh': '0',
'sftjwz': '0',
'sfjcwzry': '0',
'jcjg': '',
'date': time.strftime("%Y%m%d", time.localtime()), # 打卡年月日一共8位
'uid': user['uid'], # UID
'created': round(time.time()), # 时间戳
'jcqzrq': '',
'sfjcqz': '',
'szsqsfybl': '0',
'sfsqhzjkk': '0',
'sqhzjkkys': '',
'sfygtjzzfj': '0',
'gtjzzfjsj': '',
'created_uid': '0',
'id': user['id'],# 打卡的ID,其实这个没影响的
'gwszdd': '',
'sfyqjzgc': '',
'jrsfqzys': '',
'jrsfqzfy': '',
'ismoved': '0',
'dqsfzgfxszqs':'0', #当前是否在低风险地区
'bfhzjyq': '3', #不符合接种要求
'cjfxsfhs': '1', #春季返校后是否坐核酸
'gzczxq': '2', #工作常驻校区
'sfjkyc': '0',
'sfmrhs': '1',
'ifcyglq': '0',
'cjfxsfhs': '1',
}
time.sleep(delay)
r = requests.post('https://m.nuaa.edu.cn/ncov/wap/default/save', data=data, cookies=user['cookie'])
print('sign statue code:', r.status_code)
print('sign return:', r.text)
r.encoding = 'utf-8'
if r.text.find('成功') >= 0:
print('打卡成功')
return True
else:
print('打卡失败,尝试重新登陆')
user['cookie'] = login(user['studentid'], user['password'])
except Exception as e:
print('尝试失败')
print(e)
pass
return False
def startinuaa(studentid, password):
user = {}
user['studentid'] = studentid
user['password'] = password
if (studentid != '' and password != ''):
user['cookie'], user['uid'], user['id'] = login(studentid, password)
if ("账户或密码错误" in user['cookie']):
return "{{(>_<)}}},账户或密码错误,呜呜呜。"
if sign(user):
return "打卡成功!"
else:
return "打卡失败!"
else:
return "输入格式错误!"
def main():
#输入学号与密码
startinuaa('16211XXXX','ZHISHIMIMA')
def handler (event, context):
output =json.dumps(event)
main()
return output
3.开始部署
1.华为函数工作流提供的免费额度足够使用,腾讯还要收钱,于是请去注册华为云(不需要华为手机)。
注册总不会有人不会吧。

2.搜索函数工作流——>回车——>立即使用,来到如下界面:

3.点击创建函数,并按如下创建。前一百万次免费。

4.将所有代码复制进去,并点击部署以保存。

5.点击创建触发器,并按如图创建。创建触发器在页面最上方,别往下找了。
这段Cron表达式的意思是每天凌晨两点到凌晨三点,每隔十五分钟进行一次打卡。
不放心的可以多创建几个,比如:0 15 5 * * ?
它的意思是每天5:15打卡一次。

6.在设置界面——常规设置中更改如下,如果你的文件名(可以在代码菜单中查看,一般是index.py)不是index.py,请把函数执行入口改为 文件名.handler
别忘了保存。

7.进行测试,点击配置测试事件,空白模板,点击测试。如图代表成功

4.温馨提示
1.假期记得关了,不然你就会一直在学校里打卡。如果你愿意的话,也可以在家爬取Data后重新部署一份。
2.如何关闭?没有直接关闭手段,你可以选择停用所有的触发器。在设置——触发器中操作。
3.如果有特殊情况的话,i南航打卡会覆盖上一次结果的(好像),只需要在早上重新填报一次正确信息,比如今天不住校之类的,就可以了。
4.请使用新版i南航,旧版每次打卡后需要重新登录,十分不方便。
5.再一次感谢之前的大佬分享的代码,感谢感谢。
6.再一次提醒:本教程只是以i南航打卡为例分享函数工作流使用方法,切勿实际用于打卡,我们应该每日积极填报健康信息,产生一切后果本人概不负责。
悲,某一天部署的自动打卡程序给我发邮件说打卡失败,打开app显示访问被禁止,期待各位大佬的发挥