蘑菇钉 工学云自动打卡脚本 python
概述:
相信大家最近也都为工学云app的每日签到而烦恼,而我也不例外,每天的工作已经让我备受折磨,怎么还要去打这个形式主义的卡呢?
难道就要这么被折磨三个月吗? 那必然不可能!!!
既然所学专业刚好对口,所以必须整个脚本出来,解放双手,实现自由!!!
如果同是计算机专业的大佬或者对编程感兴趣,请欣赏我下面拦的跟屎一样的代码 ,如果不是也没兴趣,直接滑倒最底下,看看使用教程。
这个脚本其实上半年就写过,专门给某人用的,后来因为清理电脑,数据全没了,又得重写。
先上代码吧!!
1 import json 2 import logging 3 # from typing import Type 4 import hashlib 5 import requests 6 7 # import datetime 8 9 logger = logging.getLogger() 10 11 loginURL = "https://api.moguding.net:9000/session/user/v1/login" 12 doCardURL = "https://api.moguding.net:9000/attendence/clock/v2/save" 13 planIdURL = "https://api.moguding.net:9000/practice/plan/v3/getPlanByStu" 14 15 pre = { 16 # "http": "http://218.2.214.107:80", 17 # "https": "https://http://101.34.59.236:8876" 18 } 19 20 headers = { 21 "Host": "api.moguding.net:9000", 22 "Accept-Language": "zh-CN,zh;q=0.8", 23 "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HTC M9e Build/EZG0TF) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.1566.54 Mobile Safari/537.36", 24 "sign": "", 25 'Connection': 'close', 26 "Authorization": "", 27 "roleKey": "student", 28 "Content-Type": "application/json; charset=UTF-8", 29 "Accept-Encoding": "", 30 "Cache-Control": "keep-alive", 31 } 32 33 34 def readFile(): 35 global account_data 36 dataList = [] 37 try: 38 account_data = open("account.txt", encoding="UTF-8") 39 while True: 40 readline = account_data.readline() 41 if readline: 42 json_loads = json.loads(readline) 43 if json_loads != "": 44 dataList.append(json_loads) 45 else: 46 break 47 finally: 48 if account_data: 49 account_data.close() 50 return dataList 51 52 53 class User_PO: 54 def __init__(self): 55 self.userData = readFile() 56 57 def do(self): 58 for data in self.userData: 59 if data.get("account") is not None and data.get("password") is not None: 60 if data.get("state") is not None and data.get("state") == 1: 61 # 下班 62 data["cardType"] = "END" 63 else: 64 # 上班 65 data["cardType"] = "START" 66 if data.get("token") is not None: 67 # 获得签到的签名 68 sign = getSign(data.get("cardType"), data.get("planId"), data.get("userId"), data.get("address")) 69 data["sign"] = sign 70 doCard(data) 71 else: 72 data["cardType"] = "START" 73 doLogin(data) 74 planSign = getPlanIdSign(data["userId"]) 75 print("planSign结果是;" + planSign) 76 # //获得planId 77 plan_id = getPlanId(headers, str(data.get("token")), str(planSign)) 78 data["planId"] = plan_id 79 print("planId结果是;" + str(plan_id)) 80 # 获得签到的签名 81 sign = getSign(data.get("cardType"), plan_id, data.get("userId"), data.get("address")) 82 data["sign"] = sign 83 print("sign结果是;" + str(sign)) 84 doCard(data) 85 else: 86 pushMessge(data.get("plusToken"), "请填写账号密码") 87 t = open("account.txt", 'w+', encoding="UTF-8") 88 writeData = "" 89 for data in self.userData: 90 writeData = writeData + json.dumps(data, ensure_ascii=False) + "\n" 91 92 t.write(writeData) 93 t.close() 94 95 # 登陆 96 97 98 def doLogin(data): 99 loginData = { 100 "phone": data.get("account"), 101 "password": data.get("password"), 102 "loginType": "android", 103 "uuid": "" 104 } 105 loginResult = requests.post(loginURL, headers=headers, data=json.dumps(loginData)).json() 106 if loginResult["code"] != 200: 107 pushMessge(data.get("plusToken"), loginResult["msg"]) 108 else: 109 print("登陆结果是;" + loginResult["msg"]) 110 # 将获取到的用户信息存入 111 data["token"] = str(loginResult["data"]["token"]) 112 data["userId"] = str(loginResult["data"]["userId"]) 113 data["moguNo"] = str(loginResult["data"]["moguNo"]) 114 115 116 # 推送消息 117 def pushMessge(token, message): 118 hea = { 119 "Content-Type": "application/json; charset=UTF-8", 120 } 121 url = "http://www.pushplus.plus/send" 122 requestData = { 123 "token": token, 124 "title": "学工云打卡通知", 125 "content": message 126 } 127 result = requests.post(url, headers=hea, data=json.dumps(requestData)).json() 128 print(result) 129 130 131 # 对字符进行加密 132 def getMd5(byStr): 133 encode = byStr.encode('utf-8') 134 return hashlib.md5(encode).hexdigest() 135 136 137 # 获取planId的sign 138 def getPlanIdSign(userId): 139 byStr = str(userId) + "student" + "3478cbbc33f84bd00d75d7dfa69e0daa" 140 return getMd5(byStr) 141 142 143 # 获取签到sign 144 def getSign(cardType, planId, userId, address): 145 byStr = "Android" + str(cardType) + str(planId) + str(userId) + str(address) + "3478cbbc33f84bd00d75d7dfa69e0daa" 146 return getMd5(byStr) 147 148 149 # 获得planId 150 def getPlanId(hea, token, palnIdSign): 151 hea["sign"] = palnIdSign 152 hea["Authorization"] = token 153 hea["roleKey"] = "student" 154 data = { 155 "state": "" 156 } 157 planIdResult = requests.post(planIdURL, headers=hea, data=json.dumps(data)).json() 158 print(planIdResult) 159 return str(planIdResult["data"][0]["planId"]) 160 161 162 def doCard(data): 163 cardData = { 164 "country": data.get("country"), 165 "address": data.get("address"), 166 "province": data.get("province"), 167 "city": data.get("city"), 168 "latitude": data.get("latitude"), 169 "description": "", 170 "planId": data.get("planId"), 171 "type": data.get("cardType"), 172 "device": "Android", 173 "longitude": data.get("longitude"), 174 } 175 headers["sign"] = data.get("sign") 176 headers["Authorization"] = data.get("token") 177 print(headers) 178 doCardResult = requests.post(doCardURL, headers=headers, proxies=pre, data=json.dumps(cardData)).json() 179 print("打卡结果是;" + str(doCardResult)) 180 if doCardResult.get("code") == 200: 181 # 切换状态 182 if data.get("state") == 1: 183 data["state"] = 0 184 pushMessge(data.get("plusToken"), "下班打卡成功!") 185 else: 186 data["state"] = 1 187 pushMessge(data.get("plusToken"), "上班打卡成功!") 188 elif doCardResult.get("code") == 401: 189 doLogin(data) 190 planSign = getPlanIdSign(data["userId"]) 191 plan_id = getPlanId(headers, str(data.get("token")), str(planSign)) 192 data["planId"] = plan_id 193 sign = getSign(data.get("cardType"), plan_id, data.get("userId"), data.get("address")) 194 data["sign"] = sign 195 doCard(data) 196 else: 197 print("123") 198 199 200 if __name__ == "__main__": 201 po = User_PO() 202 po.do() 203 204 # 云函数入口 205 # def main_handler(event, context): 206 # logger.info('got event{}'.format(event)) 207 # return User_PO().do()
本来上周已经重写好了一个Java的脚本,但是Java脚本对于大家都不是很友好,给你们不好部署啊,,所以这周抽空又写了python语言的脚本,原本想着python脚本可以部署在腾讯云函数或者其他大厂的云服务器中,还是免费的,但我这几天测试了几个大厂的云函数,都与蘑菇钉app的后台服务器建立不了连接可能是因为在上面挂过的脚本太多了 ,被他们封了出口ip,所以又只能另想办法,总不能让每个人都买台服务器吧,划不来。当然有活雷锋那真是太好了。
使用方法;
虽然说云函数不行,但还是得介绍下 ,万一以后也会用到呢?
首先打开腾讯云的官方网址https://console.cloud.tencent.com/scf/list?rid=4&ns=default
下来肯定是没账号注册账号了、接着点到函数服务
点击新建 ---------选择从头开始
选择事件函数, 名称随意,运行环境 建议使用python3.6
然后将上面的代码复制进去,在创建一个名称为 account.txt的文本文件,因为我们的账号是存在文本里的实现持久化
然后去点到函数管理,修改下延迟时间 改到最大都行。
然后就是去测试函数,和部署了 ,如何实现定时任务,颠倒触发管理---新建,时间表达式是crun表达式,百度搜一搜就知道了,到此腾讯云函数如何部署代码就到这,接下来讲如何在自己本机去实现定时任务
首先先上文件 我已经把代码编译成了windows可执行的exe程序,地址
https://wwp.lanzout.com/iviWV0b88w7c
解压文件后,会看到一个exe文件和txt文本 txt文本是存账号信息的,一行一条数据 数据格式为json格式
补充经纬度如何查询 访问http://www.metools.info/learn/jingweidu200.html 搜索你要打卡的地址 就可以获取到经纬度了
其中前面八条为必填项 state为状态,如果你在部署脚本前已经打了上班卡 就填写1 脚本运行后会自行更新状态,plustoken为推送消息的token 如果觉得没有必要知道每天打卡的动态 就不需要填写,如下设置
首先微信关注公众号 pushplus推送加
点击功能 ----个人中心 -------开发设置 找到token 复制 填写在文本中 即可
信息填写完毕 就可以设置定时任务,每天自动打卡了。这里 引荐这个博客所指导的,也很详细 地址 https://blog.csdn.net/qq_43847263/article/details/111931598
我就不复制粘贴了。到此 打卡脚本结束,