蘑菇钉自动签到——最新版 2021年12月13日
蘑菇丁自动签到
不想看过程的大佬可以直接到文末取代码
前言
目的签到,所以肯定得登录账户,所以得先找到登录接口,以及签到接口,这里作者我通过抓包工具找到了登录接口以及签到接口。
需要模块:
requests
pycryptodome
pip install 安装即可
从登录到签到需要几个重要参数:
登录接口能获得:
moguNo
userId
token
获取planId的接口能获得:
planId
planId_sign需要根据以上的参数手动制作
sign_in_sign也是需要手动制作 后文给出方法
登录接口
url: https://api.moguding.net:9000/session/user/v1/login
Method:POST
Data:{
“phone”: phone,
“password”: password,
“uuid”: “”,
“loginType”: “android”,
“t”: 加密时间戳,
}
返回值
返回数据格式是json格式,需要的参数有token、userId、moguNo
在此就不贴了,里头能找到
备注
此接口我暂且只知道有两个版本,v1以及另一个版本v2,这个v1版本的请求参数的账户密码是明文,v2需要加密,v1也还能用所以先选用v1作为登录
t值在我在网页版蘑菇钉上找到了这个加密方式
注:如果想用v2版本的登录接口,账户和密码的加密方式均为这个函数,不需加盐
代码预览
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
def bytesToHexString(bs):
return ''.join(['%02X ' % b for b in bs])
def encrypt(word, key="23DbtQHR2UMbH6mJ"):
key = key.encode('utf-8')
mode = AES.MODE_ECB
aes = AES.new(key, mode)
pad_pkcs7 = pad(word.encode('utf-8'), AES.block_size, style='pkcs7') # 选择pkcs7补全
encrypt_aes = aes.encrypt(pad_pkcs7)
encrypted_text = FuckGongXueYun.bytesToHexString(encrypt_aes)
return encrypted_text.replace(" ", "").lower()
key 是AES加密的密钥,默认即可
word 接收的参数是秒级时间戳
请求代码预览:
t = str(int(time.time()) * 1000)
login_data = {
"phone": '你账户',
"password": '你密码',
"uuid": "", # uuid可为空
"loginType": "android", # 登录标识,默认即可
"t": encrypt(t), # encrypt函数在上头
}
url = "https://api.moguding.net:9000/session/user/v1/login"
headers = {
'Content-Type': 'application/json; charset=UTF-8'
}
response_login = requests.post(url, data=json.dumps(login_data), headers=headers)
获取planId的接口:
url:https://api.moguding.net:9000/practice/plan/v3/getPlanByStu
Method:POST
除了登录接口,其他接口的请求头headers均要带上两个重要的参数,token以及sign
请求参数
data = {"paramsType": "student"}
headers = {
'authorization': '', # 正是登录接口获得的token
'Content-Type': 'application/json; charset=UTF-8',
'roleKey': 'student',
"sign": planId_sign # 这里的获得方式是 md5(userId + "student" + "3478cbbc33f84bd00d75d7dfa69e0daa")
}
返回值是json,需要的参数就只有planId,在此就不贴了,里头能找到
代码预览:
def md5(word):
hl = hashlib.md5()
hl.update(word.encode(encoding="utf-8"))
return hl.hexdigest()
url = "https://api.moguding.net:9000/practice/plan/v3/getPlanByStu"
headers = {
'authorization': token,
'Content-Type': 'application/json; charset=UTF-8',
'roleKey': 'student',
"sign": md5(userId + "student" + "3478cbbc33f84bd00d75d7dfa69e0daa")
}
response = requests.post(url=url,data=json.dumps({"paramsType": "student"}),headers=headers)
签到接口:
url:https://api.moguding.net:9000/attendence/clock/v2/save
此接口也有两个版本,v1、v2。v1废了,用v2就可
Method:POST
请求参数
headers={
'authorization': token,
'Content-Type': 'application/json; charset=UTF-8',
'roleKey': 'student',
"sign": planId_sign #此sign的计算方式是:md5("Android" + "START" + planId + userId + address + "3478cbbc33f84bd00d75d7dfa69e0daa")
#address的参数是你的打卡位置
}
data = {
"device": "Android",
"planId": planId,
"country": '中国',
"province": '省份',
"city": '城市',
"address": '详细地址-可以根据你的蘑菇钉定位填写',
"longitude": '所在位置的经度',
"latitude": '所在位置的维度',
# 此网站可以查到当前你的位置的坐标
# https://lbs.amap.com/tools/picker
"t": encrypt(t),
"description": "", # 备注
"type": "START", # START是上班,END是下班
"attendanceType": "" # 可为空
}
返回值类型为json,code为200则成功
请求代码预览
data = {
"device": "Android",
"planId": planId,
"country": country,
"province": province,
"city": city,
"address": address,
"longitude": longitude,
"latitude": latitude,
"t": encrypt(t),
"description": "",
"type": "START",
"attendanceType": ""
}
url = 'https://api.moguding.net:9000/attendence/clock/v2/save'
headers = {
'Host': 'api.moguding.net:9000',
"user-agent": "Mozilla/5.0 (Linux; U; Android 10; zh-cn; AQM-AL10 Build/HONORAQM-AL10) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Mobile Safari/533.1",
'authorization': token,
'Content-Type': 'application/json; charset=UTF-8',
'roleKey': 'student',
"sign": sign_in_sign,
}
sign_response = requests.post(url=url, data=json.dumps(data), headers=headers)
抓包工具
HttpCanary或者Fiddler都可
抓包细节就不说了,一部分参数获得方式是通过网页端的工学云获取的
结尾
运行方式:
可直接部署在服务器上或者花十块买个挂机宝,设置定时任务即可每天自动打卡
完整代码–这几天有事,随便写的:
https://gitee.com/c134622/gongxueyun