得力 E+ 综合签到接口的分析与自动化脚本。项目通过复现 App 的登录、组织选择、排班查询、签到状态判断、GPS 规则校验和请求签名流程,实现命令行检查与按条件提交,并保留了签名算法的逆向分析材料。
本项目仅供接口研究、个人学习和经授权的自动化使用。请遵守所在组织的考勤制度、得力 E+ 服务条款及当地法律法规。使用者需自行承担账号、数据与操作风险。
本项目主要有两种使用方式:本地运行和 GitHub Actions。如果只是想尽快跑起来,优先阅读本节即可。
- 本地运行:适合首次初始化、短信验证、调试和手动执行。
- GitHub Actions:适合把账号配置保存到 Repository Secrets 后,在 GitHub 上手动执行或启用定时任务。
git clone https://github.com/JairHan/deliCheck.git
cd deliCheck
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txtcp .env.example .env编辑 .env,至少填写:
DELI_MOBILE='你的手机号'
DELI_PASSWORD='你的原始登录密码'
DELI_TRUST_CODE=''
DELI_TERMINAL_ID=''
DELI_ORG_ID=''
DELI_MODE='dry'
DELI_RANDOM_DELAY='0'单组织账号可以不填写 DELI_ORG_ID。
python3 deli_eplus_auto_simple_v3.py login首次运行时,如果 DELI_TRUST_CODE 为空,脚本会通过短信验证码完成可信设备验证,并把获得的 trust_code 写入 .env。如果 DELI_TERMINAL_ID 为空,也会生成一个稳定 UUID 并保存,后续会持续复用。
python3 deli_eplus_auto_simple_v3.py check该命令只会检查登录状态、排班、当前动作、今日记录和 GPS 规则,不会真实提交打卡。
确认无误后再执行:
# 按服务端当前动作提交
python3 deli_eplus_auto_simple_v3.py check --execute
# 仅允许签到
python3 deli_eplus_auto_simple_v3.py check --expected checkin --execute
# 仅允许签退
python3 deli_eplus_auto_simple_v3.py check --expected checkout --execute也可以直接通过环境变量运行:
DELI_MODE=dry python3 deli_eplus_auto_simple_v3.py
DELI_MODE=checkin python3 deli_eplus_auto_simple_v3.py
DELI_MODE=checkout python3 deli_eplus_auto_simple_v3.py
DELI_MODE=auto python3 deli_eplus_auto_simple_v3.pyDELI_MODE |
行为 |
|---|---|
dry |
只检查,不提交 |
checkin |
仅当当前动作是签到时真实提交 |
checkout |
仅当当前动作是签退时真实提交 |
auto |
按服务端返回的当前动作真实提交 |
推荐首次运行始终从
dry开始,确认配置和排班正常后再启用真实提交。
仓库已经包含:
.github/workflows/deli-check.yml
可以直接使用 GitHub 托管 Runner 执行脚本。当前仓库默认关闭 schedule,因此只支持手动运行,不会自动定时打卡。
如果你是其他用户,建议先 Fork 本仓库到自己的 GitHub 账号,然后在自己的仓库中配置 Secrets 和 Actions。
建议先按照上面的“本地运行”步骤执行:
python3 deli_eplus_auto_simple_v3.py login获取并保存稳定的:
DELI_TRUST_CODE
DELI_TERMINAL_ID
GitHub Actions Runner 每次运行都是临时环境,因此不要依赖 Actions 运行过程中写入的 .env 持久保存这两个值。
进入自己的仓库:
Settings → Secrets and variables → Actions → Repository secrets
建议添加:
| Secret | 是否必需 | 说明 |
|---|---|---|
DELI_MOBILE |
是 | 得力 E+ 登录手机号 |
DELI_PASSWORD |
是 | 原始登录密码 |
DELI_TRUST_CODE |
是 | 本地初始化后获得的可信设备代码 |
DELI_TERMINAL_ID |
是 | 稳定复用的设备标识 |
DELI_ORG_ID |
多组织账号需要 | 单组织账号可以不设置 |
SMTP_EMAIL |
可选 | QQ 邮箱通知发件地址 |
SMTP_PASSWORD |
可选 | QQ 邮箱 SMTP 授权码 |
SMTP_TO |
可选 | 通知接收地址 |
Secret 的 Value 只填写实际值,不要写变量名,也不要额外添加 .env 中的引号。例如:
13800138000
不要写成:
DELI_MOBILE='13800138000'
进入:
Actions → Deli E+ 自动打卡 → Run workflow
选择运行模式:
| 模式 | 行为 |
|---|---|
dry |
只检查,不提交 |
checkin |
仅在服务端当前动作是签到时提交 |
checkout |
仅在服务端当前动作是签退时提交 |
auto |
按服务端当前动作提交 |
第一次建议选择:
dry
确认 Actions 日志中的账号、组织、排班和 GPS 校验全部正常后,再测试 checkin / checkout。
当前 workflow 中的定时配置默认被注释:
on:
# schedule:
# - cron: '30 8 * * *'
# timezone: 'Asia/Shanghai'
#
# - cron: '0 20 * * *'
# timezone: 'Asia/Shanghai'
workflow_dispatch:因此默认不会自动执行。
需要自动运行时取消注释,例如:
on:
schedule:
# 每天北京时间 08:30 签到
- cron: '30 8 * * *'
timezone: 'Asia/Shanghai'
# 每天北京时间 20:00 签退
- cron: '0 20 * * *'
timezone: 'Asia/Shanghai'
workflow_dispatch:仓库当前的模式判断逻辑为:
每天 08:30 → DELI_MODE=checkin
每天 20:00 → DELI_MODE=checkout
手动运行 → 使用 Run workflow 页面选择的 mode
* * * 会让任务周一到周日每天触发。如果只想周一至周五:
- cron: '30 8 * * 1-5'
timezone: 'Asia/Shanghai'
- cron: '0 20 * * 1-5'
timezone: 'Asia/Shanghai'不过脚本本身还会读取服务端的工作日和排班状态。如果所在组织存在周末补班或节假日调休,每天触发,再由服务端排班判断是否执行通常更符合实际情况。
GitHub Actions 的 scheduled workflow 不是实时调度器,任务可能因为平台负载出现一定延迟,不适合要求精确到秒的场景。
Repository Secret 不会仅因为名称相同就自动进入脚本,必须在 workflow 中显式引用:
env:
DELI_MOBILE: ${{ secrets.DELI_MOBILE }}
DELI_PASSWORD: ${{ secrets.DELI_PASSWORD }}如果 workflow 直接写:
DELI_RANDOM_DELAY: '0'那么最终脚本读取的就是 0。即使 Repository Secrets 中存在同名 DELI_RANDOM_DELAY,只要 workflow 没有引用 ${{ secrets.DELI_RANDOM_DELAY }},那个 Secret 就不会生效。
本项目的配置优先级可以理解为:
GitHub Actions env
↓
本地 .env
↓
Python CONFIG 默认值
当前 workflow 已直接设置:
DELI_RANDOM_DELAY: '0'因此不需要额外创建 DELI_RANDOM_DELAY Secret。
DELI_MODE 也不需要创建 Repository Secret:手动执行由 workflow_dispatch 选择,定时执行由 cron 触发时间决定。
workflow 已预留:
SMTP_SSL: 'true'
SMTP_EMAIL: ${{ secrets.SMTP_EMAIL }}
SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }}
SMTP_TO: ${{ secrets.SMTP_TO }}
SMTP_SERVER: 'smtp.qq.com:465'
SMTP_NAME: 'GitHub Actions 得力打卡'需要通知时,配置 SMTP_EMAIL 与 SMTP_PASSWORD 即可。SMTP_PASSWORD 必须使用 QQ 邮箱生成的 SMTP 授权码,而不是 QQ 登录密码。
- 不要把手机号、密码、
trust_code、terminal_id、邮箱授权码直接写进 workflow。 - 不要提交真实
.env。 - 不要主动在 Actions 日志中打印完整 token、密码或 HAR。
- 首次测试优先使用
dry。 - 固定早晚任务推荐分别使用
checkin/checkout,避免auto在异常情况下补打另一种动作。
- 首次通过短信验证码获取并保存
trust_code,后续使用手机号和密码登录 - 自动获取组织信息,支持多组织时指定
org_id - 登录综合签到服务
- 查询今日排班、当前应执行动作和今日打卡记录
- 获取服务端 GPS 打卡规则并进行距离校验
- 本地生成
gps_info.sig双重 MD5 签名 - 预览完整提交表单,不发送打卡请求
- 支持签到、签退和按服务端状态自动提交
- 支持通过环境变量在青龙等定时任务平台运行
- 支持通过 GitHub Actions 手动运行或按计划定时运行
- 支持启动时在配置的秒数范围内随机延迟
- 支持通过 QQ 邮箱推送成功或失败的完整执行日志
- Python 3.9 或更高版本
- 可访问得力 E+ 相关接口的网络环境
- 一个有效且有综合签到权限的得力 E+ 账号
项目运行时仅依赖 requests:
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt主程序为 deli_eplus_auto_simple_v3.py。推荐通过环境变量提供敏感信息:
| 环境变量 | 必填 | 说明 |
|---|---|---|
DELI_MOBILE |
是 | 得力 E+ 登录手机号 |
DELI_PASSWORD |
是 | 登录密码 |
DELI_TRUST_CODE |
首次可留空 | 留空时通过短信验证码获取并自动保存 |
DELI_TERMINAL_ID |
可留空 | 留空时生成一次稳定 UUID 并自动保存 |
DELI_ORG_ID |
多组织账号必填 | 组织 ID;单组织账号可留空自动选择 |
DELI_MODE |
无参数运行时使用 | dry、auto、checkin 或 checkout |
DELI_RANDOM_DELAY |
否 | 每次启动随机等待 0~N 秒;默认 0,即不延迟 |
SMTP_SSL |
邮件推送时使用 | QQ 邮箱填写 true |
SMTP_EMAIL |
邮件推送时使用 | 完整的 QQ 邮箱地址,同时作为 SMTP 用户名 |
SMTP_PASSWORD |
邮件推送时使用 | QQ 邮箱授权码,不是 QQ 密码 |
SMTP_NAME |
否 | 发件人显示名称,默认“青龙脚本运行通知” |
SMTP_SERVER |
否 | 默认 smtp.qq.com,也支持 smtp.qq.com:465 |
SMTP_PORT |
否 | 单独指定端口;SSL 默认 465 |
SMTP_TO |
否 | 收件邮箱;默认发给 SMTP_EMAIL,多个地址用逗号分隔 |
安装依赖后,复制配置模板并填写一次即可。脚本会自动读取与自身位于同一目录的 .env:
cp .env.example .env编辑 .env:
DELI_MOBILE='你的手机号'
DELI_PASSWORD='你的原始登录密码'
DELI_TRUST_CODE=''
DELI_TERMINAL_ID=''
DELI_ORG_ID=''
DELI_MODE='dry'
DELI_RANDOM_DELAY='0'
SMTP_SSL='true'
SMTP_EMAIL='你的QQ邮箱@qq.com'
SMTP_PASSWORD='你的QQ邮箱授权码'
SMTP_NAME='青龙脚本运行通知'
SMTP_SERVER='smtp.qq.com:465'系统环境变量和青龙环境变量的优先级高于 .env。单组织账号可将 DELI_ORG_ID 留空;多组织账号需填写目标组织 ID。DELI_MODE 首次建议使用 dry。
例如,设置 DELI_RANDOM_DELAY='300' 后,每次启动会先随机等待 0~300 秒,再进行登录、状态查询和提交。GPS 时间戳与签名仍会在真正提交前生成,不会使用延迟前的时间。
脚本参考青龙常用推送方式,运行结束后优先调用可用的 rnl_push.sendNotify 或 notify.sendNotify;如果这两个模块不存在,则使用脚本内置 SMTP。只要同时设置 SMTP_EMAIL 和 SMTP_PASSWORD 就会启用 QQ 邮箱推送。脚本无论执行成功还是业务检查失败,都会尝试发送本次完整日志;邮件发送失败只会写入控制台日志,不会改变签到任务本身的成功或失败状态。SMTP_PASSWORD 必须使用 QQ 邮箱生成的授权码,不要填写 QQ 登录密码。
手机通知标题显示真实打卡结果,例如 签到成功|得力 E+、签到失败|得力 E+、签退成功|得力 E+。只有服务端提交接口成功返回时才显示签到或签退成功;Dry-run 显示 仅检查,未提交打卡|得力 E+,非工作日、无排班或当前动作不匹配则显示具体跳过原因。因此无需打开邮件,也能从通知预览中区分真实打卡成功与脚本仅完成检查。
首次运行建议执行:
python3 deli_eplus_auto_simple_v3.py login如果 .env 中的 DELI_TRUST_CODE 为空,脚本会自动发送登录短信并提示输入验证码。验证成功后,服务端返回的 trust_code 会写回 .env,文件权限会设置为 600;以后运行将直接使用密码和已保存的 trust_code,不再要求验证码。
如果 DELI_TERMINAL_ID 为空,脚本会在首次成功登录后生成一个大写 UUID 并写回 .env。该值只生成一次,以后始终复用;如果用户已经配置了官方 App 的设备标识,脚本不会覆盖。
非交互环境可先通过官方 App 获取验证码,再临时提供已经收到的验证码:
DELI_SMS_CODE='短信验证码' python3 deli_eplus_auto_simple_v3.py loginDELI_SMS_CODE 只用于当次验证,不会写入 .env。设置该变量时脚本不会再次发送短信。首次初始化更推荐在可交互终端中完成,再把生成的 DELI_TRUST_CODE 配置到青龙环境变量。青龙等非交互环境如果没有提供验证码,会在发送短信之前停止,避免定时任务反复发送验证码。
gps_name、lat、lgt、gps_location 和 gps_range 默认留空时,会使用服务端返回的第一条 GPS 规则。如需自定义这些非敏感高级选项,可修改脚本顶部的 CONFIG。
.env已被.gitignore排除。不要使用git add -f .env,也不要把真实账号信息写回脚本或.env.example。分享代码或抓包前,还应检查 HAR、日志和 Git 历史中是否残留 token、手机号、位置等敏感数据。若凭据曾被公开,应立即更换密码并撤销相关会话。
手机号和原始登录密码由用户自行填写;trust_code 可由脚本在首次运行时通过短信验证自动获取。terminal_id 留空时会生成并持久化一个随机 UUID,也可以改为本人官方 App 请求中的真实设备标识。多组织账号的 org_id 可以在登录后根据脚本列出的组织信息填写。不要照搬他人的字段:这些值与账号、组织、设备或登录会话有关。
| 配置字段 | 获取位置 | JSON 路径 | 是否长期配置 |
|---|---|---|---|
mobile |
本人的登录手机号 | 无需抓包 | 是 |
password |
本人的原始登录密码 | 无需抓包 | 是 |
trust_code |
首次短信登录响应或可信设备登录请求体 | data.trust_code |
可由脚本首次自动获取 |
org_id |
组织列表响应 | data[].org_id |
仅多组织账号需要 |
terminal_id |
自动生成,或官方 App 打卡提交请求体 | terminal_id |
留空时自动生成并保存 |
phone_model |
打卡提交请求体 | phone_model |
可选,脚本已有默认值 |
| GPS 地点信息 | GPS 支持接口响应 | data.gps_list[] |
默认由脚本自动获取 |
注意以下字段不能混用:
- 环境变量
DELI_PASSWORD应填写原始密码。抓包中的password已经过客户端编码,不要把它复制到环境变量中;脚本会自行完成编码。 Authorization、sourceToken和签到服务返回的token都是临时会话凭据,不需要写入CONFIG。member_id、user_id和组织成员序号会在登录过程中自动获取,不是DELI_ORG_ID。- 单组织账号可以不设置
DELI_ORG_ID,脚本会自动选择唯一组织。
脚本涉及两个服务域名:
https://v2-app.delicloud.com
https://checkin2-app.delicloud.com
不同客户端版本可能调整接口字段或版本号,应以本人官方 App 的实际请求为准。
POST https://v2-app.delicloud.com/api/v3.0/auth/app/trusted/login
Content-Type: application/json
client_id: eplus_app
X-Service-Id: userauth请求体结构:
{
"trust_code": "<需要提取的 trust_code>",
"mobile": "<手机号>",
"password": "<客户端编码后的密码>"
}脚本通常不再需要从这里手工提取 trust_code;该请求主要用于理解后续可信密码登录。响应中的 data.token 和 data.user_id 会由脚本在每次登录时自动获取,不需要保存。
GET https://v2-app.delicloud.com/api/v3.0/org/list?user_id=<user_id>
Authorization: <主 App 临时 token>
user_id: <user_id>
client_id: eplus_app
X-Service-Id: organization响应中需要关注:
{
"data": [
{
"org_id": "<组织 ID>",
"org_name": "<组织名称>",
"seq_no": "<组织成员序号>"
}
]
}如果 data 只有一项,无需设置 DELI_ORG_ID;如果存在多个组织,把目标组织的 org_id 配置为 DELI_ORG_ID。
POST https://checkin2-app.delicloud.com/api/v2.0/auth/login
Content-Type: application/json
client_id: eplus_app
x-service-id: auth请求体结构:
{
"memberId": "<组织成员序号>",
"sourceToken": "<主 App 临时 token>",
"sourceId": "deli",
"orgId": "<组织 ID>"
}该接口用于换取综合签到服务的临时 token,并返回签到服务使用的 member_id 和 org_id。这些值由脚本自动处理,不需要手工配置。
POST https://checkin2-app.delicloud.com/ass/api/v2.0/phone/checkin/support
Authorization: <综合签到临时 token>
member_id: <签到成员 ID>
org_id: <签到组织 ID>
x-service-id: ass
Content-Type: application/json请求体为空对象。响应中的 data.gps_list[] 通常包含以下字段:
{
"name": "<打卡点名称>",
"location": "<地址描述>",
"lat": "<纬度>",
"lgt": "<经度>",
"range": 200
}脚本默认自动读取这些规则,因此通常不需要手工填写 GPS 配置。
在官方 App 执行一次正常打卡,查找以下请求:
POST https://checkin2-app.delicloud.com/ass/api/v2.1/phone/checkin/execute
Authorization: <综合签到临时 token>
member_id: <签到成员 ID>
org_id: <签到组织 ID>
x-service-id: ass
Content-Type: application/json请求体结构:
{
"terminal_id": "<需要提取的设备标识>",
"gps_info": {
"time": "<毫秒时间戳>",
"sig": "<本次请求签名>",
"lat": "<纬度>",
"lgt": "<经度>",
"name": "<打卡点名称>",
"location": "<地址描述>"
},
"checkin_type": "gps",
"phone_model": "<设备型号>"
}自动生成的 UUID 会作为 terminal_id 使用。如果服务端或所在组织不接受该值,可把请求体顶层的真实 terminal_id 保存为 DELI_TERMINAL_ID,它会覆盖自动生成值。gps_info.time 和 gps_info.sig 每次请求都会变化,不能复制为固定配置。
以下流程仅适用于本人设备、本人账号或已明确授权的测试环境。
-
在电脑上安装并启动 Charles 或 Proxyman,确保电脑与手机连接同一局域网。
-
在抓包工具中查看电脑的局域网 IP 和代理端口,通常为
8888;以工具实际显示为准。 -
打开手机当前 Wi-Fi 的代理设置,选择“手动”,服务器填写电脑 IP,端口填写抓包工具端口。
-
按抓包工具的 iOS/Android 设备指引,在手机上安装其 CA 证书。iOS 还需要在“关于本机 → 证书信任设置”中启用完全信任。
-
在抓包工具中为以下域名启用 SSL Proxying/HTTPS 解密:
v2-app.delicloud.com checkin2-app.delicloud.com -
完全关闭并重新打开得力 E+,使用本人账号正常登录,然后进入综合签到页面。
-
使用 URL 关键字依次筛选
trusted/login、org/list、auth/login、checkin/support和checkin/execute。 -
在请求详情的 JSON Body 中提取
terminal_id;多组织账号再从org/list响应中确定org_id。trust_code默认由脚本通过短信验证自动获取。 -
配置完成后移除手机 Wi-Fi 代理,并根据需要删除或停用抓包 CA 证书。
如果只能看到 CONNECT、请求失败或 App 提示网络异常,通常表示证书没有正确安装/信任,或当前客户端启用了证书绑定。Android 7 及以上版本的 App 也可能默认不信任用户安装的 CA。请优先使用抓包工具提供的官方设备教程和已授权测试设备,不要在不属于自己的设备或账号上绕过安全控制。
抓取 checkin/execute 会伴随一次真实的官方 App 打卡。请在正常考勤时间、正确地点和符合所在组织制度的情况下操作,避免为获取参数反复提交。
HAR 通常包含完整请求头、登录 token、手机号、设备标识、组织信息、定位和签到记录,应视为账号密码同等级别的敏感文件:
- 不要提交到 Git、网盘公开链接或公开 issue。
- 不要把完整 HAR 发给不可信的第三方。
- 分享排障片段前,删除
Authorization、Cookie、token、手机号、坐标和设备 ID。 - 完成提取后可删除 HAR,或保存在加密目录中。
- 如果 HAR 曾被公开,应更换密码、重新登录以刷新会话,并撤销仍有效的设备或 token。
建议先依次执行只读命令,确认账号、排班和 GPS 规则均符合预期,再考虑提交。
# 仅验证登录并显示组织信息
python3 deli_eplus_auto_simple_v3.py login
# 查看今日排班、当前动作、打卡记录和 GPS 校验结果
python3 deli_eplus_auto_simple_v3.py status
# 展示将要发送的请求头和请求体,但不提交
python3 deli_eplus_auto_simple_v3.py form
# 完整检查,默认 dry-run,不提交
python3 deli_eplus_auto_simple_v3.py check确认无误后,可以显式添加 --execute:
# 按服务端返回的当前动作提交
python3 deli_eplus_auto_simple_v3.py check --execute
# 只有当前动作是签到时才提交
python3 deli_eplus_auto_simple_v3.py check --expected checkin --execute
# 只有当前动作是签退时才提交
python3 deli_eplus_auto_simple_v3.py check --expected checkout --execute程序会在以下情况拒绝提交:
- 当天不是工作日
- 当天没有排班
- 当前动作与
--expected不一致 - 指定坐标不在服务端允许的 GPS 范围内
- 缺少登录、组织或设备配置
- 接口请求或响应校验失败
无参数运行时,程序读取 DELI_MODE:
DELI_MODE |
行为 |
|---|---|
dry 或其他值 |
只检查,不提交 |
auto |
按服务端当前动作真实提交 |
checkin |
当前动作为 checkin 时真实提交 |
checkout |
当前动作为 checkout 时真实提交 |
DELI_MODE=dry python3 deli_eplus_auto_simple_v3.py未设置
DELI_MODE且不带命令行参数时,程序默认采用dry,不会提交。真实提交仍应通过明确设置模式或添加--execute来启用。
在青龙面板中,可将上述账号配置和 DELI_MODE 添加为环境变量,再按需要设置定时任务。例如,先使用以下命令观察日志:
DELI_MODE=dry python3 deli_eplus_auto_simple_v3.py确认运行结果后,再根据实际制度选择 checkin、checkout 或 auto。不建议在尚未验证排班和账号配置时直接启用自动提交。
手机号登录
↓
获取并选择组织
↓
登录综合签到服务
↓
查询排班、当前动作与今日记录
↓
获取并校验 GPS 规则
↓
生成当前时间戳与 gps_info.sig
↓
dry-run / 表单预览 / 条件提交
签名逻辑位于 Deli.gps_proof()。它使用本次请求的毫秒时间戳以及 lat、lgt、location、name 生成内层 MD5,再加入客户端固定后缀生成最终 MD5。字段值和顺序必须与请求体一致,否则服务端会拒绝签名。
.
├── .github/
│ └── workflows/
│ └── deli-check.yml # GitHub Actions 手动/定时执行工作流
├── .env.example # 不含真实值的配置模板
├── .gitignore # Git 忽略规则
├── README.md # 使用说明
├── requirements.txt # Python 依赖
└── deli_eplus_auto_simple_v3.py # 主程序
HAR、IPA、提取后的 JS、反编译输出和一次性验证脚本属于本地研究材料,不参与程序运行,并通过 .gitignore 排除,以避免泄露个人信息或提交大文件。
- 登录密码会按照客户端格式进行 Base64 编码并反转后发送。
- 请求使用两个服务域名:主 App 服务负责登录与组织查询,综合签到服务负责排班、规则和打卡。
- GPS 坐标为空时,代码会选用服务端第一条规则的中心点;指定坐标时,会使用 Haversine 公式检查距离。
form模式会生成新的时间戳和签名,但只打印请求,不发送。- Authorization 输出会被掩码;其他日志仍可能含组织、位置与成员信息,请谨慎保存和分享。
- 签名算法来自客户端行为分析,后续 App 或服务端升级可能使其失效。
为 DELI_ORG_ID 设置目标组织 ID,或在 CONFIG['org_id'] 中填写。错误信息会列出当前账号可用的组织名称和 ID。
先执行 status 查看服务端规则。如果手动配置了经纬度,确认坐标在允许范围内;也可以将 GPS 配置留空,让程序读取服务端规则。
这是 --expected 的保护行为。例如指定 --expected checkout 时,如果服务端认为当前应签到,程序不会提交。
账号会话、trust_code、接口字段和签名规则都可能随客户端升级而变化。如果 trust_code 已失效,可将 .env 中的 DELI_TRUST_CODE 清空,再运行一次 login 重新完成短信验证。仍然失败时,先检查账号能否在官方 App 正常使用,再通过本地抓包结果定位差异。请勿在日志或 issue 中公开完整 token、密码和 HAR。
本仓库不是得力官方项目,与得力集团或得力 E+ 无隶属、合作或背书关系。项目按现状提供,不保证接口长期可用,也不保证自动化结果满足任何组织的考勤要求。请仅操作本人账号及获授权的数据。