一、概述

python脚本不是我写的,源项项目地址(感谢作者的开源):
链接: https://github.com/Bmaili/NEU_health_daka

需要技术,简单的抓包,python的 re request模块

源项目是一个项目,有配置文件部分、发送邮件部分,我这里做了修改只保留了核心程序run.py部分,并且temperatureDaka函数不调用

import re
import time
import requests
#import sendMsg
#import config
#运行命令,cmd下
#python ./run.py 学号 校园网密码import sysclass daka():def __init__(self):#self.id = config.stutendID#self.password = config.passwardself.id = sys.argv[1]self.password = sys.argv[2]self.token = ""self.name = ""self.lt = ""self.my_session = requests.session()#self.sendMsg=sendMsg.sendMsg()self.login_url = 'https://e-report.neu.edu.cn/login'self.post_url = 'https://pass.neu.edu.cn/tpass/login'self.create_url = 'https://e-report.neu.edu.cn/notes/create'self.note_url = 'https://e-report.neu.edu.cn/api/notes'def login(self):#登陆,更新sessionmsg=''try:login_response = self.my_session.get(self.login_url)self.lt = re.findall(r'LT-[0-9]*-[0-9a-zA-Z]*-tpass', login_response.text, re.S)[0]login_form_items = {'rsa': self.id + self.password + self.lt,'ul': str(len(self.id)),'pl': str(len(self.password)),'lt': self.lt,'execution': 'e1s1','_eventId': 'submit'}post_response = self.my_session.post(self.post_url, login_form_items)msg=self.id+'登录成功!'#print("登陆成功!")#print("login success")print(1200)#返回的第一个数据,登陆成功except:msg=self.id+'登录失败!请手动完成打卡!'#print("登陆失败!")#print("login fail")print(1500)#返回的第一个数据,登陆失败return msgdef healthDaka(self):#健康打卡msg=''success=Falsetry:note_response = self.my_session.get(self.create_url)self.token = re.findall(r'name=\"_token\"\s+value=\"([0-9a-zA-Z]+)\"',note_response.text, re.S)[0]self.name = re.findall(r'当前用户:\s*(\w+)\s*', note_response.text, re.S)[0]health_items = {'_token': self.token,'jibenxinxi_shifoubenrenshangbao': '1','profile[xuegonghao]': self.id,'profile[xingming]': self.name,'profile[suoshubanji]': '','jiankangxinxi_muqianshentizhuangkuang': '正常','xingchengxinxi_weizhishifouyoubianhua': '0','cross_city': '无','qitashixiang_qitaxuyaoshuomingdeshixiang': ''}health_response = self.my_session.post(self.note_url, health_items)if health_response.status_code == 201:#print(str(health_response) + '健康打卡成功')#msg=config.stutendID+'健康打卡成功!'#msg=config.stutendID+'健康打卡成功!'#print(str(health_response) + 'task success')print(2200)#返回的第二个数据,打卡成功#msg=config.stutendID+'健康打卡成功!'msg=self.id+'task success'success=Trueelse:print(2500)#返回的第二个数据,打卡失败msg=self.id+'健康打卡失败!请手动完成打卡!'+ '(响应异常)'+str(health_response)except:msg=self.id+'健康打卡失败!请手动完成打卡!'+ '(执行异常)'return msg,successdef temperatureDaka(self):#体温打卡msg=''success=Falsetry:#hour = (time.localtime().tm_hour + 8) % 24   # 加8是因为腾讯云跑出来是格林时间,若是运行在自己服务器上需要改回来~hour = (time.localtime().tm_hour ) % 24  # 加8是因为腾讯云跑出来是格林时间,若是运行在自己服务器上需要改回来~temperature_url = 'https://e-report.neu.edu.cn/inspection/items/{}/records'.format(('1' if 7 <= hour <= 9 else '2' if 12 <= hour <= 14 else '3'))temperature_items = {'_token': self.token,'temperature': '36.5','suspicious_respiratory_symptoms': '0','symptom_descriptions': ''}temperature_response = self.my_session.post(temperature_url,    temperature_items)if temperature_response.status_code == 200:#print(str(temperature_response) + '体温打卡成功')#msg=config.stutendID+'体温打卡成功!'print(str(temperature_response) + 'temperature success')msg=self.id+'temperature success'success=Trueelse:msg=self.id+'体温打卡失败!请手动完成打卡!'+ '(响应异常)'+str(temperature_response)except:msg=self.id+'体温打卡失败!请手动完成打卡!'+ '(执行异常)'return msg,successdef main_handler(event, context):_daka = daka()loginMsg = _daka.login()healthMsg, healSuc = _daka.healthDaka()#temperatureMsg, tempSuc = _daka.temperatureDaka()#早中晚体温打卡暂时就不做了#if config.sendMsgOnlyError and healSuc and tempSuc:#    pass#else:#    _daka.sendMsg.sendMessage(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())+'\n'+loginMsg+'\n'+healthMsg+'\n'+temperatureMsg)if __name__ == '__main__':main_handler(None,None)

依赖库:requests
执行方法:

python ./run.py 学号 密码

二、抓包分析

写脚本应该是一个逆向的过程这里我们也逆向进行解析
为了教学,特意改了密码

账号:20206041
密码:mima123456

通过以下界面登录


看这张图,我们可以看到登陆页面是向
https://portal.neu.edu.cn/desktop/api/sso/login
提交数据

rsa:学号+密码+未知字符串(姑且叫他流水号)
ul:id的长度
pl:密码的长度
it:流水号

除了流水号以外其他的数据我们都可以直接提交
从python脚本来看,流水号保存在登陆界面
就是https://portal.neu.edu.cn/desktop/api/sso/login这个页面的数据
我们去看一眼登陆界面的数据,果然找到了他


刚好一样(这个不好找,在浏览器的控制台也许能好找)
注意提交数据我看的是webforms
返回数据看的是raw

登陆问题解决

下面看提交页面都提交了哪些数据,从以下页面打卡

提交数据并抓包

             '_token': 未知字符串(这个不知道),'jibenxinxi_shifoubenrenshangbao': '1','profile[xuegonghao]': 学号(这个执行脚本的时候就知道了),'profile[xingming]': 姓名(这个不知道),'profile[suoshubanji]': '','jiankangxinxi_muqianshentizhuangkuang': '正常','xingchengxinxi_weizhishifouyoubianhua': '0','cross_city': '无','qitashixiang_qitaxuyaoshuomingdeshixiang': ''

下面就是找到_token值和姓名
也是从上一界面查找(提交界面)



至此所有所需数据已经分析完毕,编写脚本

三、脚本编写

实现细则不做讨论(正则表达式提取部分),说一下大致逻辑
代码21行
requests.session()是为了保持cookie
跨请求保持某些参数,在同一个session实例发出的所有请求之间保持cookies

代码34、35行
来到登陆页面
从返回数据中提取下一步登录所需的流水号

代码63、64、65
来到健康上报页面,获取所需的_token和姓名

以上就是整个脚本的大致思路(不知道作者同不同意我这么说,只能说是作为新手的粗略理解)

他的url不全和我一样,我分析的url没有实践过,不过感觉应该也可以

NEU健康上报脚本解析教程相关推荐

  1. 搭建自己的健康上报APP全栈开发教学

    准备:云服务器(域名可有可无,不过既然都上云,建议买域名做个自己的网站) 技术栈:lnmp+python+android前端 重点学习内容是php和python脚本和android前端 本文重在服务器 ...

  2. Linux的shell脚本函数教程

    Linux的shell脚本函数教程 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.shell中函数使用示例 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.she ...

  3. EasyJWeb-Velocity脚本简明教程

    EasyJWeb-Velocity脚本简明教程 (pdf版) 很多人下载了EasyJWeb的开源应用示例,但是对动态页面模板文件中的标签使用不是很熟悉,这里简单介绍一下.EasyJWeb特定把视图限定 ...

  4. lua 获取网络时间_Lua脚本引擎教程:学习路线

    从零开始的Lua教程(零):学习路线 出于分享学习心得和获得同伴讨论的目的,我打算写一个教程给想要学习如何实现lua解释器的同学提供一个参考. 我的学习经历 我在去年4月开始接触到游戏引擎的脚本引擎, ...

  5. 【油猴Tampermonkey】脚本安装教程+自用脚本推荐

    转自:52破解 本帖最后由 Pandolar 于 2017-6-5 17:21 编辑 ①:软件简介:  Tampermonkey,这是一个伟大的Chrome扩展.可以说,就算Chrome没有其他扩展, ...

  6. 【Oracle健康检查脚本加量不加价】对Oracle 10g、11g和12c版本分别提供了只读版,并且加上了MySQL的健康检查...

    目前一共包含6个脚本,若脚本的扩展名为".sql"则表示该脚本为sql脚本,若脚本的扩展名为".pl"则表示该脚本为perl脚本. 对于SQL脚本而言,其中DB ...

  7. Python for虚幻引擎编辑器工具脚本学习教程

    Python for Unreal Engine Editor Tools Scripting MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英 ...

  8. Redis Lua脚本中学教程(下)

    在中学教程的上半部分我们介绍了Redis Lua相关的命令,没有看过或者忘记的同学可以步行前往直接使用机票Redis Lua脚本中学教程(上).今天我们来简单学习一下Lua的语法. 在介绍Lua语法之 ...

  9. python制作验证码_Python编写生成验证码的脚本的教程

    在web开发中经常用到验证码,为了防止机器人注册或者恶意登陆和查询等,作用不容小觑 但是验证码其实不是一个函数就能搞定的,它需要生成图片和水印,其实每种语言都有相关的函数生成图片和文字水印.包括我熟悉 ...

最新文章

  1. Linux下,安装配置Weblogic
  2. zabbix学习小结
  3. 【转】一步一步教你远程调用EJB
  4. SQLSERVER EXCEPT运算符=ORACLE MINUS
  5. 修改git历史提交的commit信息
  6. 麦肯锡指出布局金融生态圈对中国国内银行意义重大
  7. fabric-sample配置常见错误解析
  8. 如何解决struts2没有提示问题
  9. MyEclipse 2015 运行tomcat 内存溢出的解决方法
  10. 【深度学习】神经网络为何非激活函数不可?
  11. 黑苹果显卡加速_谁说苹果macOS系统不适合3D,没有OC渲染器?
  12. c语言中计数器(定时器)程序
  13. java乘法口诀表_java 输出乘法口诀表
  14. TOF相机(Time of Fight Camera)(维基百科全翻译版)
  15. 军哥独家QCIE(囊括CCIE和HCIEv3.0)的全新课程。请大家参阅
  16. 一文带你了解Room数据库
  17. 熊猫人表情包python 代码_用Python爬取斗图网表情包
  18. 【她的心你伤的起吗?】
  19. python kite 云盘下载
  20. pdf预览 pdf.js+pdfObject

热门文章

  1. Kimera: an Open-Source Library for Real-TimeMetric-Semantic Localization and Mapping论文阅读
  2. SpringBoot关于JPA中关于查询findOne和findById
  3. java实现socket通讯
  4. 将多个k8s集群在同一台主机上使用kubectl进行管理
  5. 电力电子技术笔记-三相桥式
  6. 【电影推荐】60部经典华语电影,排行不分先后!
  7. 快速列出windows10中所有已安装的应用列表(兼容win11)(长期有效)【伸手党福利】
  8. 全球及中国深紫外LED行业十四五规划及前景战略研究报告2021-2027年版
  9. 关于CH340T 的一点记录
  10. 一名UI设计师眼中的用户体验