Skip to content

Latest commit

 

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

deliCheck

得力 E+ 综合签到接口的分析与自动化脚本。项目通过复现 App 的登录、组织选择、排班查询、签到状态判断、GPS 规则校验和请求签名流程,实现命令行检查与按条件提交,并保留了签名算法的逆向分析材料。

本项目仅供接口研究、个人学习和经授权的自动化使用。请遵守所在组织的考勤制度、得力 E+ 服务条款及当地法律法规。使用者需自行承担账号、数据与操作风险。

🚀 快速开始

本项目主要有两种使用方式:本地运行GitHub Actions。如果只是想尽快跑起来,优先阅读本节即可。

  • 本地运行:适合首次初始化、短信验证、调试和手动执行。
  • GitHub Actions:适合把账号配置保存到 Repository Secrets 后,在 GitHub 上手动执行或启用定时任务。

方式一:本地运行

1. 克隆项目并安装依赖

git clone https://github.com/JairHan/deliCheck.git
cd deliCheck

python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt

2. 创建本地配置

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'

单组织账号可以不填写 DELI_ORG_ID

3. 首次登录初始化

python3 deli_eplus_auto_simple_v3.py login

首次运行时,如果 DELI_TRUST_CODE 为空,脚本会通过短信验证码完成可信设备验证,并把获得的 trust_code 写入 .env。如果 DELI_TERMINAL_ID 为空,也会生成一个稳定 UUID 并保存,后续会持续复用。

4. 先进行 Dry-run

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.py
DELI_MODE 行为
dry 只检查,不提交
checkin 仅当当前动作是签到时真实提交
checkout 仅当当前动作是签退时真实提交
auto 按服务端返回的当前动作真实提交

推荐首次运行始终从 dry 开始,确认配置和排班正常后再启用真实提交。


方式二:GitHub Actions

仓库已经包含:

.github/workflows/deli-check.yml

可以直接使用 GitHub 托管 Runner 执行脚本。当前仓库默认关闭 schedule,因此只支持手动运行,不会自动定时打卡。

如果你是其他用户,建议先 Fork 本仓库到自己的 GitHub 账号,然后在自己的仓库中配置 Secrets 和 Actions。

1. 先在本地完成一次初始化

建议先按照上面的“本地运行”步骤执行:

python3 deli_eplus_auto_simple_v3.py login

获取并保存稳定的:

DELI_TRUST_CODE
DELI_TERMINAL_ID

GitHub Actions Runner 每次运行都是临时环境,因此不要依赖 Actions 运行过程中写入的 .env 持久保存这两个值。

2. 配置 Repository Secrets

进入自己的仓库:

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'

3. 手动运行 GitHub Actions

进入:

Actions → Deli E+ 自动打卡 → Run workflow

选择运行模式:

模式 行为
dry 只检查,不提交
checkin 仅在服务端当前动作是签到时提交
checkout 仅在服务端当前动作是签退时提交
auto 按服务端当前动作提交

第一次建议选择:

dry

确认 Actions 日志中的账号、组织、排班和 GPS 校验全部正常后,再测试 checkin / checkout

4. 启用自动定时运行

当前 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 不是实时调度器,任务可能因为平台负载出现一定延迟,不适合要求精确到秒的场景。

5. Workflow 环境变量与 Secret

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 触发时间决定。

6. QQ 邮箱通知(可选)

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_EMAILSMTP_PASSWORD 即可。SMTP_PASSWORD 必须使用 QQ 邮箱生成的 SMTP 授权码,而不是 QQ 登录密码。

7. GitHub Actions 安全注意事项

  • 不要把手机号、密码、trust_codeterminal_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 无参数运行时使用 dryautocheckincheckout
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.sendNotifynotify.sendNotify;如果这两个模块不存在,则使用脚本内置 SMTP。只要同时设置 SMTP_EMAILSMTP_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 login

DELI_SMS_CODE 只用于当次验证,不会写入 .env。设置该变量时脚本不会再次发送短信。首次初始化更推荐在可交互终端中完成,再把生成的 DELI_TRUST_CODE 配置到青龙环境变量。青龙等非交互环境如果没有提供验证码,会在发送短信之前停止,避免定时任务反复发送验证码。

gps_namelatlgtgps_locationgps_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 已经过客户端编码,不要把它复制到环境变量中;脚本会自行完成编码。
  • AuthorizationsourceToken 和签到服务返回的 token 都是临时会话凭据,不需要写入 CONFIG
  • member_iduser_id 和组织成员序号会在登录过程中自动获取,不是 DELI_ORG_ID
  • 单组织账号可以不设置 DELI_ORG_ID,脚本会自动选择唯一组织。

抓包接口与参数

脚本涉及两个服务域名:

https://v2-app.delicloud.com
https://checkin2-app.delicloud.com

不同客户端版本可能调整接口字段或版本号,应以本人官方 App 的实际请求为准。

1. 可信设备登录

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.tokendata.user_id 会由脚本在每次登录时自动获取,不需要保存。

2. 查询组织列表

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

3. 登录综合签到服务

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_idorg_id。这些值由脚本自动处理,不需要手工配置。

4. 获取 GPS 打卡规则

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 配置。

5. 获取设备标识

在官方 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.timegps_info.sig 每次请求都会变化,不能复制为固定配置。

Charles / Proxyman 抓包教程

以下流程仅适用于本人设备、本人账号或已明确授权的测试环境。

  1. 在电脑上安装并启动 Charles 或 Proxyman,确保电脑与手机连接同一局域网。

  2. 在抓包工具中查看电脑的局域网 IP 和代理端口,通常为 8888;以工具实际显示为准。

  3. 打开手机当前 Wi-Fi 的代理设置,选择“手动”,服务器填写电脑 IP,端口填写抓包工具端口。

  4. 按抓包工具的 iOS/Android 设备指引,在手机上安装其 CA 证书。iOS 还需要在“关于本机 → 证书信任设置”中启用完全信任。

  5. 在抓包工具中为以下域名启用 SSL Proxying/HTTPS 解密:

    v2-app.delicloud.com
    checkin2-app.delicloud.com
    
  6. 完全关闭并重新打开得力 E+,使用本人账号正常登录,然后进入综合签到页面。

  7. 使用 URL 关键字依次筛选 trusted/loginorg/listauth/logincheckin/supportcheckin/execute

  8. 在请求详情的 JSON Body 中提取 terminal_id;多组织账号再从 org/list 响应中确定 org_idtrust_code 默认由脚本通过短信验证自动获取。

  9. 配置完成后移除手机 Wi-Fi 代理,并根据需要删除或停用抓包 CA 证书。

如果只能看到 CONNECT、请求失败或 App 提示网络异常,通常表示证书没有正确安装/信任,或当前客户端启用了证书绑定。Android 7 及以上版本的 App 也可能默认不信任用户安装的 CA。请优先使用抓包工具提供的官方设备教程和已授权测试设备,不要在不属于自己的设备或账号上绕过安全控制。

抓取 checkin/execute 会伴随一次真实的官方 App 打卡。请在正常考勤时间、正确地点和符合所在组织制度的情况下操作,避免为获取参数反复提交。

HAR 保存与脱敏

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

确认运行结果后,再根据实际制度选择 checkincheckoutauto。不建议在尚未验证排班和账号配置时直接启用自动提交。

工作流程

手机号登录
   ↓
获取并选择组织
   ↓
登录综合签到服务
   ↓
查询排班、当前动作与今日记录
   ↓
获取并校验 GPS 规则
   ↓
生成当前时间戳与 gps_info.sig
   ↓
dry-run / 表单预览 / 条件提交

签名逻辑位于 Deli.gps_proof()。它使用本次请求的毫秒时间戳以及 latlgtlocationname 生成内层 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。

GPS 校验失败

先执行 status 查看服务端规则。如果手动配置了经纬度,确认坐标在允许范围内;也可以将 GPS 配置留空,让程序读取服务端规则。

当前动作与预期不一致

这是 --expected 的保护行为。例如指定 --expected checkout 时,如果服务端认为当前应签到,程序不会提交。

登录或签名突然失效

账号会话、trust_code、接口字段和签名规则都可能随客户端升级而变化。如果 trust_code 已失效,可将 .env 中的 DELI_TRUST_CODE 清空,再运行一次 login 重新完成短信验证。仍然失败时,先检查账号能否在官方 App 正常使用,再通过本地抓包结果定位差异。请勿在日志或 issue 中公开完整 token、密码和 HAR。

免责声明

本仓库不是得力官方项目,与得力集团或得力 E+ 无隶属、合作或背书关系。项目按现状提供,不保证接口长期可用,也不保证自动化结果满足任何组织的考勤要求。请仅操作本人账号及获授权的数据。

About

得力e+ GPS定位签到,推荐配合使用青龙面板可实现自动化

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages