蘑菇钉 工学云自动打卡脚本 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

我就不复制粘贴了。到此 打卡脚本结束, 

 

posted @ 2022-08-11 00:41  ·wait  阅读(4808)  评论(13编辑  收藏  举报