今日校园自动健康上报|自动填表|疫情上报!Python牛逼

开发环境

  • python3.0
【今日校园自动健康上报|自动填表|疫情上报!Python牛逼】-----自动填表/打卡/上报原理
其实也就是模拟一个数据包 , 调用今日校园的api;实现登入功能;然后查找未填写的表;倘若表的序列号已经存在你的代码包里面 , 就会自动将包数据发到职教云服务器上面去 , 倘若没有 , 将会把表自动打包程json;然后你只需要编辑下json数据 , 以后这个序列的包就可以自动提交了
今日校园自动健康上报|自动填表|疫情上报!Python牛逼文章插图
-----使用说明理论上支持大部分学校(IAP登录方式 , 自己先试试能用不)和任意表单内容的自定义 。 目前已知两种学工号登录方式 , 均已实现 。 运行以下命令即可
pip install -r requirements.txtpython3 DailyCP.py 学校全名 学号 密码 定位地址12注意系统时间是否设置正确Linux下可以使用corntab -e设置定时任务让程序每天自动打卡(下面的是设置0-9点触发的)
0 9 * * * python3 DailyCP.py 学校全名 学号 密码 定位地址1
今日校园自动健康上报|自动填表|疫情上报!Python牛逼文章插图
  • 部分代码(主要函数)
  • 获取全部的项目源码请到公众号【sky趣完团】或者加入qq群:749717825
import requestsimport jsonimport ioimport randomimport timeimport reimport pyDesimport base64import uuidimport sysimport osfrom Crypto.Cipher import AESclass DailyCP:def __init__(self, schoolName="合肥学院"):self.key = "ST83=@XV"#dynamic when app updateself.session = requests.session()self.host = ""self.loginUrl = ""self.isIAPLogin = Trueself.session.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37",#"X-Requested-With": "XMLHttpRequest","Pragma": "no-cache","Accept": "application/json, text/plain, */*",#"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",# "User-Agent": "okhttp/3.12.4"})extension = {"deviceId":str(uuid.uuid4()),"systemName":"保密级操作系统","userId":"5201314","appVersion":"8.1.13","model":"天河一号","lon":0.0,"systemVersion":"初号机","lat":0.0}self.session.headers.update({"Cpdaily-Extension": self.encrypt(json.dumps(extension))})self.setHostBySchoolName(schoolName)def setHostBySchoolName(self,schoolName):ret = self.request("")school = [j for i in ret["data"] for j in i["datas"] if j["name"] == schoolName]if len(school) == 0:print("不支持的学校或者学校名称错误,以下是支持的学校列表")print(ret)exit()ret = self.request("httpsz://mobile.campushoy.com/v6/config/guest/tenant/info?ids={ids}".format(ids=school[0]["id"]))self.loginUrl = ret["data"][0]["ampUrl"]if ret == "":print("学校并没有申请入驻今日校园平台")exit()print("{name}的登录地址{url}".format(name=schoolName,url=self.loginUrl))self.host =re.findall(r"//(.*?)/",self.loginUrl)[0]#ret = self.request(ret["data"][0]["ampUrl"],parseJson=False).url#self.isIAPLogin = "campusphere" in ret#if not self.isIAPLogin:#print("注意:包含AuthServer的登陆方式并未测试!且每一个学校的登录方式都不一样 。 ")#ret = re.findall(r"//(.*?)/",ret)#if len(ret) == 0:#exit()#self.host = ret[0]def encrypt(self,text):k = pyDes.des(self.key, pyDes.CBC, b"\x01\x02\x03\x04\x05\x06\x07\x08", pad=None, padmode=pyDes.PAD_PKCS5)ret = k.encrypt(text)return base64.b64encode(ret).decode()def passwordEncrypt(self,text:str,key:str):pad = lambda s: s + (len(key) - len(s) % len(key)) * chr(len(key) - len(s) % len(key))unpad = lambda s: s[:-ord(s[len(s) - 1:])]text = pad("TdEEGazAXQMBzEAisrYaxRRax5kmnMJnpbKxcE6jxQfWRwP2J78adKYm8WzSkfXJ"+text).encode("utf-8")aes = AES.new(str.encode(key), AES.MODE_CBC,str.encode("ya8C45aRrBEn8sZH"))return base64.b64encode(aes.encrypt(text))def request(self,url:str,body=None,parseJson=True,JsonBody=True,Referer=None):url = url.format(host=self.host)if Referer != None: self.session.headers.update({"Referer":Referer})if body == None:ret = self.session.get(url)else:self.session.headers.update({"Content-Type": ("application/json" if JsonBody else "application/x-www-form-urlencoded")})ret = self.session.post(url,data=http://kandian.youth.cn/index/(json.dumps(body) if JsonBody else body))if parseJson:return json.loads(ret.text)else:return retdef decrypt(self,text):k = pyDes.des(self.key, pyDes.CBC, b"\x01\x02\x03\x04\x05\x06\x07\x08", pad=None, padmode=pyDes.PAD_PKCS5)ret = k.decrypt(base64.b64decode(text))return ret.decode()def checkNeedCaptcha(self, username):url = "https://{host}/iap/checkNeedCaptcha?username={username}".format(host=self.host,username=username)ret = self.session.get(url)ret = json.loads(ret.text)return ret["needCaptcha"]def generateCaptcha(self):url = "https://{host}/iap/generateCaptcha?ltId={client} --tt-darkmode-color: #999999;">-----关于自定义任意表单内容