蘑菇钉自动签到——最新版 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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>