江苏省住院医师规范化培训管理平台 - 自定义定位+自动签到脚本
基于APP端反编译接口实现,使用账号密码登录即可签到,无需微信授权,无需真实定位。
通过对安卓APP(v2.0.47)反编译分析,发现APP端与微信小程序端的签到接口存在关键差异:
| 差异项 | APP端 | 微信小程序端 |
|---|---|---|
| 域名 | jsapp.ezhupei.com |
jswx.ezhupei.com |
| 认证方式 | userFlow 参数(账号密码登录获取) |
token 头 + Cookie(微信OAuth获取) |
| 位置校验 | 客户端校验(APP本地计算距离) | 服务端校验(需传经纬度) |
| 经纬度参数 | 不需要 | 必填 |
| 签到次数限制 | 无 | 无 |
核心发现:APP端的位置校验完全在客户端完成,服务端不校验坐标。因此只需调用APP端接口,无需传入经纬度即可签到成功。
1. POST /login → 账号密码登录,获取 userFlow
2. POST /studentSignIn → 获取签到状态(工作日/非工作日标识)
3. POST /saveSignIn → 提交签到(无需经纬度)
- Python 3.7+
- requests 库
pip install requests编辑 config.json:
{
"user_code": "你的APP登录用户名",
"user_passwd": "你的APP登录密码",
"local": "签到地点文字描述,如:江苏省xx市xx人民医院",
"remark": "",
"retry_interval": 60,
"max_retries": 3,
"time_jitter_minutes": 5,
"uuid": ""
}| 配置项 | 说明 | 默认值 |
|---|---|---|
user_code |
APP登录用户名(必填) | - |
user_passwd |
APP登录密码(必填) | - |
local |
签到地点文字描述 | 江苏省xx市xx人民医院 |
remark |
签到备注 | 空 |
retry_interval |
签到失败重试间隔(秒) | 60 |
max_retries |
最大重试次数 | 3 |
time_jitter_minutes |
签到前随机等待时间上限(分钟),0=不等待 | 5 |
uuid |
设备标识,首次运行自动生成 | 自动 |
python checkin.py签到成功退出码为 0,失败为 1。
脚本本身不包含定时逻辑,配合面板的定时任务使用。
添加计划任务 → Shell脚本:
python3 /path/to/checkin.py支持环境变量配置,无需修改 config.json:
export JSZP_USER_CODE="你的用户名"
export JSZP_USER_PASSWD="你的密码"
export JSZP_LOCAL="签到地点"
export JSZP_REMARK="备注"
python3 /path/to/checkin.py# 工作日 8:00 签到
0 8 * * 1-5 python3 /path/to/checkin.pytime_jitter_minutes 配置项会在签到前随机等待 0~N 分钟,使实际提交时间自然分散,避免定时任务每天在完全相同的时刻签到。
例如设为 5,定时任务 8:00 触发,脚本会在 8:00~8:05 之间的随机时刻提交签到,签到记录中的时间就是实际提交时间。
设为 0 则不等待,立即提交。
详见 api_doc.md
| 接口 | 方法 | 说明 |
|---|---|---|
/login |
POST | 账号密码登录,获取 userFlow |
/studentSignIn |
POST | 获取签到状态(工作日标识、已签到次数、机构坐标) |
/saveSignIn |
POST | 提交签到(无需经纬度) |
/version |
GET | 获取APP版本信息 |
登录 /login:
| 参数 | 说明 |
|---|---|
| userCode | 用户名 |
| userPasswd | 密码 |
| uuid | 设备UUID |
| systemName | 固定 android |
| versionNumber | APP版本号 2.0.47 |
提交签到 /saveSignIn:
| 参数 | 说明 |
|---|---|
| userFlow | 登录获取的用户标识 |
| date | 日期,格式 2026-06-12 |
| time | 时间,格式 HH:mm |
| local | 签到地点文字描述 |
| remark | 备注 |
| workingDaySign | Y=工作日,N=非工作日 |
JSZP2CheckIn/
├── checkin.py # 自动签到脚本
├── config.json # 配置文件(首次运行自动生成)
├── api_doc.md # API接口文档
└── checkin.log # 运行日志(自动生成)
本项目仅供学习交流使用,请勿用于商业或非法用途。使用本脚本产生的任何后果由使用者自行承担。
MIT