不想看过程的大佬可以直接到文末取代码
前言
目的签到,所以肯定得登录账户,所以得先找到登录接口,以及签到接口,这里作者我通过抓包工具找到了登录接口以及签到接口。 需要模块: 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')
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": "",
"loginType": "android",
"t": encrypt(t),
}
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': '',
'Content-Type': 'application/json; charset=UTF-8',
'roleKey': 'student',
"sign": planId_sign
}
返回值是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
}
data = {
"device": "Android",
"planId": planId,
"country": '中国',
"province": '省份',
"city": '城市',
"address": '详细地址-可以根据你的蘑菇钉定位填写',
"longitude": '所在位置的经度',
"latitude": '所在位置的维度',
"t": encrypt(t),
"description": "",
"type": "START",
"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
|