中国邮政揽收系统 - 自动填单工具 v2.0
通过 HTTP API + Node.js token bridge 实现,不依赖浏览器自动化。读取 Excel 运单数据,逐条自动填写产品、客户、运单信息并提交。
运行环境
- Windows 10/11 64 位
- Node.js 18+(用于 token bridge,计算 $_ts 安全框架的 c93l5Fya 动态 token)
快速开始
# 安装 Python 依赖
uv sync
# 安装 token bridge 依赖
cd token_bridge && npm install && cd ..
# 运行
uv run python main.py
打包
build.bat # Windows
bash build.sh # Linux
输出 dist/PickupAuto.exe,用户端需安装 Node.js 18+。
架构
┌─────────────────────────────────────────┐
│ Python (requests.Session) │
│ ├─ engine.py 引擎/表单组装/提交 │
│ ├─ pickup_api.py HTTP API 封装(18个) │
│ ├─ login_helper.py cookies 导入 │
│ ├─ field_mapping.py 中文字段映射 │
│ ├─ excel_reader.py Excel 读写 │
│ ├─ main.py Tkinter GUI │
│ └─ log.py 统一日志 │
├─────────────────────────────────────────┤
│ Node.js (HTTP server, 同进程启动) │
│ └─ token_bridge/server.js │
│ jsdom 加载 $_ts 安全 JS │
│ 计算 c93l5Fya token │
└─────────────────────────────────────────┘
数据流
Excel 行数据
→ 产品选择 (启动前搜索 + 缓存) → 用户确认
→ 客户选择 (启动前搜索 + 缓存) → 用户确认
→ 运单查询 → 获取收寄件人/地址/电话
→ 地址匹配 → 获取区划代码
→ 组装表单 (5层优先级) → 确认弹窗(首行) → 提交
表单字段优先级
强制固定值 (force=true)
> API 获取值 (运单/产品/客户/地址匹配)
> 固定值 (force=false)
> Excel 表格值
> 默认值 (config.json defaults)
token bridge 原理
揽收系统使用 $_ts 安全框架(954KB 混淆 JS),所有 AJAX 请求需附带 c93l5Fya=TOKEN 参数。token bridge 在 jsdom 中运行该 JS,通过 HTTP API 对外提供 token 计算服务,Python 拿到 token 后用自己的 requests.Session 发请求。
使用流程
1. 登录(获取 cookies)
点击 🔑 登录 → 弹出对话框 → 用浏览器 cookies 导出工具导出 10.4.188.1 的所有 cookies 为 JSON 数组 → 粘贴到对话框 → 保存。
cookies 保存到 session.json(与 exe 同目录)。登录成功后自动初始化 token bridge 和搜索 API,供后续产品/客户搜索使用。
2. 选择产品/客户
登录后,在"固定值设置"区域的产品和客户输入框中输入关键词,自动触发搜索并弹出下拉选择框。选中后自动获取产品详情和客户详情并缓存,缓存有效期为一个 batch(处理完一批 Excel 数据后自动清空)。
3. 选择 Excel
点击 选择文件,选择要处理的 Excel 文件。
4. 配置固定值(可选)
在固定值区域填写:
| 字段 | 说明 |
|---|---|
| 产品 | 用于 autocomplete 搜索,从下拉框选择 |
| 客户 | 用于 autocomplete 搜索,从下拉框选择 |
| 寄达地 | 强制覆盖运单返回的寄达地(勾选强制覆盖后生效) |
| 寄达地区划代码 | 直接决定寄达地,勾选强制覆盖后优先级最高 |
| 寄件人姓名 | 强制覆盖客户资料中的寄件人 |
| 寄件地址 | 强制覆盖客户资料中的寄件地址 |
5. 开始处理
点击 ▶ 开始处理 → 首行弹出确认弹窗 → 确认后自动批量处理后续行。提交结果实时显示在下方表格中。
Excel 格式
| 字段 | 说明 | 来源 |
|---|---|---|
| 单号 | 运单号 | Excel 必填 |
| 重量 | 单位克 | Excel |
| 产品名称 | 用于 autocomplete 搜索 | Excel/固定值 |
| 客户名称 | 用于 autocomplete 搜索 | Excel/固定值 |
| 收件人/手机/地址 | 运单 API 自动填充,Excel 可覆盖 | API/Excel |
| 寄件人/手机/地址 | 客户资料 API 自动填充 | API/固定值 |
| 寄达地/寄达地区划 | 地址匹配 API 自动获取,固定值可强制覆盖 | API/固定值 |
| 电商平台 | 默认 "无"(WU) | 默认值 |
| 付款方式 | 默认 "寄付"(1) | 默认值 |
| 内件属性 | 产品 API 返回 innerpartsType |
API |
| 运输类型 | 默认 "陆运"(1) | 默认值 |
配置说明 (config.json)
system
url: 揽收系统地址
timing
delay_between_rows_ms: 行间延时(毫秒),GUI 中间隔输入框单位也是毫秒
fixed_values
"字段名": {"value": "值", "force": false}
force: true 时覆盖 API 获取值。GUI 中通过复选框控制,点击"开始处理"时自动保存到配置文件。
defaults
字段的默认值(中文名,自动翻译为系统编码)。
field_mapping
Excel 列名 → 表单参数名的自定义映射。内置映射覆盖常见字段,仅需在此配置自定义列名。
开发
日志等级
log.py 中修改 LEVEL:
-1= 关闭所有日志(默认)0= 仅用户级消息1= 调试级2= 追踪级(API 请求/响应)
修改后重新打包生效。
文档
项目级文档见 ../docs/:
| 文件 | 说明 |
|---|---|
分析报告.md |
系统 API 分析 |
字段覆盖检查报告.md |
字段来源和覆盖关系 |
har-successful-submit-fields.json |
成功提交的完整表单字段模板 |
portal-to-pickup-full-flow.har |
门户→揽收页面完整网络流 |
product-customer-selection-flow.har |
产品/客户选择 API 流 |
successful-submit-with-address-change.har |
改寄达地后成功提交 |