Summary
openydt(艾科智泊停车开放平台 CLI)共享基座:profile/凭据配置、多环境(test/dev/prod)、v2/v3 签名、响应包络与 status/resultCode、退出码、限速重试、写操作安全规则、车场经验沉淀(park-notes)。首次使用 openydt、配置/切换…
xiaowen-0725/openydt-cli
openydt(艾科智泊停车开放平台 CLI)?
npx skills add xiaowen-0725/openydt-cli --skill openydt-shared
openydt(艾科智泊停车开放平台 CLI)共享基座:profile/凭据配置、多环境(test/dev/prod)、v2/v3 签名、响应包络与 status/resultCode、退出码、限速重试、写操作安全规则、车场经验沉淀(park-notes)。首次使用 openydt、配置/切换…
Other skills from xiaowen-0725/openydt-cli · top by installs.
npx skills add xiaowen-0725/openydt-cli
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Parsed from SKILL.md frontmatter.
Files included with this skill beyond the listing page.
SKILL.md
11,811 B
SUMMARY.md
446 B
本技能是艾科智泊停车开放平台 CLI(openydt)的共享基础规则。所有 openydt 域技能(park / parking / trade / coupon / ticket / device / blacklist / visitor / data 等)在执行具体任务前,都应先 Read 本文件,以统一处理配置、签名、状态码、限速与安全。
openydt 把开放平台接口封装成命令行:自动处理签名鉴权(v2/v3)、多授权商 profile、多环境(test/dev/prod),并内置重试与退避。
openydt update。openydt update;它更新 npm 包、原生二进制,并同步 npm 包内置的同版本 Skills。openydt update check;Agent 使用结构化结果:openydt update check --json。openydt skill sync;关闭后台版本检查:OPENYDTNOUPDATE_CHECK=1。下列规则违反代价高(误扣费 / 误改 prod / 用错签名 / 泄密),任何命令前先内化;每条附 why:
--dry-run 预览、再 --yes 实发 —— why:写操作改平台状态多不可逆(缴费/开闸/发券/开通月票)。1ZS7H5PQH9/PTD2YBBZ)+ 当前/相对时间 —— why:照抄历史 sampleBody 会撞 904/911/空结果。references/write-idempotency.md](references/write-idempotency.md);why:客户端自动重试,换新键=重复扣费。config list 已脱敏。prod 跑写操作 / prod 文件记真实车牌(PII) —— why:prod 误操作影响真实车主与营收;车牌是 PII。--all-pages --out 只抽取一次并复用本地 NDJSON —— why:同一时间窗反复拉全量明细会重复压平台与数仓,也容易让不同指标使用不一致的数据快照。references/result-reading-sop.md](references/result-reading-sop.md)(三层判读 / 金额单位=元 / 0 条≠无 / 分页全量)。凭据按「授权商 profile」管理,每个 profile 含 key/secret/env/sign。配置文件位于 ~/.config/openydt-cli/config.json(尊重 XDGCONFIGHOME),权限 0600。
# 新增或更新一个授权商 profile(首次使用从这里开始)
openydt config set --profile demo --key test --secret 123456 --env test --sign v2
# 列出所有 profile(secret 已脱敏),带 * 的是当前 profile
openydt config list
# 切换当前 profile
openydt config use demo
# 打印配置文件路径
openydt config path
config set 的 --profile / --key / --secret 必填;--env 默认 test,--sign 默认 v2。config set 时,若尚无当前 profile,会自动把它设为当前 profile。openydt config set-default --park <parkCode> --car-no <车牌> 可设 profile 级默认值(默认车场/车牌),缺参时命令自动补入,无需每次显式传。下列环境变量优先级高于 profile 中的值,可在不写配置文件的情况下临时覆盖:
| 变量 | 含义 | ||
|---|---|---|---|
OPENYDT_PROFILE |
选择 profile 名 | ||
OPENYDT_KEY |
覆盖 key | ||
OPENYDT_SECRET |
覆盖 secret | ||
OPENYDT_ENV |
覆盖环境 test\ | dev\ | prod |
OPENYDT_SIGN |
覆盖签名版本 v2\ | v3 | |
OPENYDTREADONLY |
置 1/true 开启只读模式 |
优先级(从低到高):内置默认 < profile < 环境变量 < 命令行显式 flag。空值会被忽略。只要设置了 OPENYDTKEY+OPENYDTSECRET,即使没有同名 profile 也能直接调用。
所有命令通用:
| Flag | 说明 | ||
|---|---|---|---|
--profile <名> |
指定授权商 profile(默认当前 profile) | ||
| `--env test\ | dev\ | prod` | 指定环境(默认 test) |
--output, `-o json\ |
table` | 输出格式(默认 json) | |
| `--sign v2\ | v3` | 签名版本(默认按 profile,否则 v2) | |
--yes, -y |
确认执行写操作 | ||
--dry-run |
只打印将发送的签名请求,不实际发送 | ||
--read-only |
只读模式,拒绝一切写操作(也认环境变量 OPENYDTREADONLY=1) |
||
--verbose, -v |
输出调试信息到 stderr | ||
--all-pages |
对带 pageNum/pageSize 的只读查询顺序获取全部记录,输出 NDJSON | ||
--out <文件> |
--all-pages 的 NDJSON 输出文件;默认 stdout,文件权限 0600 |
各环境 base URL:
https://openapi-test.yidianting.com.cnhttps://openapi-dev.yidianting.com.cnhttps://open.yidianting.xin配置好后,先做一次冒烟验证(内部调用 getAuthParkCodes 确认凭据/签名链路可用):
openydt auth test
成功输出 ✓ 认证通过 (status=1) 并列出授权车场;失败会打印 status/message/resultCode 并以对应退出码返回。
请求路径形如 POST {base}/openydt/api/v3/{cmd}?sign={sign},并带 Authorization: base64(key:ts) 头。时间戳 ts 为本地时间 yyyyMMddHHmmss,有效期 10 分钟。
| 版本 | 算法 | 说明 |
|---|---|---|
| v2(默认) | lower(md5(key:ts:secret)) |
不含 body;测试环境默认可用 |
| v3 | lower(md5(key:ts:body:secret)) |
含 compact 后的 body |
重要:实测测试 key 仅接受 v2;用 v3 调用测试 key 会返回「签名错误」(status=4),除非平台对该 key 专门开通了 v3。默认保持 v2 即可,仅在平台明确为该 key 开通 v3 后再用 --sign v3。
签名用的 body 与实际发送的 body 必须字节一致:CLI 会先做一次 JSON compact 再同时用于签名与发送(字符串内部空格如 "2019-04-16 00:11:25" 会保留)。
调用任意接口有三条路径,按优先级选择:
openydt <域> <命令>,参数已结构化为 flag,最易用。例如 openydt park get-auth-park-codes、openydt parking <子命令>。当前内置域:blacklist coupon data device park parking redlist ticket trade visitor。各域技能:[[openydt-billing]] trade查费缴费 · [[openydt-record]] parking记录/在场 · [[openydt-park]] 车场信息 · [[openydt-device]] 设备 · [[openydt-monthticket]] 月票 · [[openydt-coupon]] 电子券 · [[openydt-data]] 统计 · [[openydt-list]] 黑白名单/访客 · 通用兜底 [[openydt-api-explorer]] · 进出场编排 [[openydt-flow-park-access]]。
openydt api <cmd> --body '{...}',对任意业务编码 cmd 自动签名并 POST,覆盖任何可调用接口。``bash openydt api getParkFee --body '{"carCode":"粤EJW962"}' openydt api getAuthParkCodes echo '{"parkCode":"PTD2YBBZ"}' | openydt api getParkOnSiteCar --body-file - ` --body 与 --body-file 互斥;--body-file -` 从 stdin 读取。
平台统一包络 {data,message,resultCode,status};status 1成功/2业务失败/4签名/5key/6未授权/7参数/9接口不存在。
完整 status/resultCode(901-912,1801)/退出码表见 [references/status-codes.md](references/status-codes.md)
Retry-After,未提供时至少等待 5 秒。查费超时(resultCode 912) 是业务态,需按提示重新查费,不是网络重试范畴。--all-pages 仅用于 catalog 已知、含 pageNum/pageSize 的只读查询。CLI 从第 1 页开始,自动使用接口文档允许的最大 pageSize,单线程顺序翻页,每页间隔 500ms。--out records.ndjson 写文件,不传 --out 则写 stdout。进度(当前页/总页、已取条数)写 stderr,不污染数据流。get-car-out-list 按离场时间查询每次最多 1 天;月度分析应按天导出独立 NDJSON 文件,再由代码统一读取计算。openydt parking get-car-out-list \
--park-code PTD2YBBZ \
--leave-start-time 20260601000000 --leave-end-time 20260601235959 \
--all-pages --out 2026-06-01-out.ndjson
--yes:缴费、开闸、发券、开通月票、加/移黑名单等任何会改变平台状态的操作,必须显式带 --yes 才会执行,避免误操作。--dry-run 预览:危险或不确定的请求先用 --dry-run 查看将发送的签名请求(URL/sign/ts/body),确认无误后再去掉。config list 已对 secret 脱敏。test 环境验证;切到 prod 前务必与用户确认。按车场积累的经验存在 ~/.config/openydt-cli/park-notes/{parkCode}.{env}.md(frontmatter+Markdown,存 config 目录避免被技能同步擦除)。一车场一环境一文件,物理隔离 test/dev/prod。 任务开始前回忆匹配文件、openydt 成功后沉淀已验证事实;只写验证过的事实不写猜测。隐私红线:prod 文件不记 PII 车牌,常用车牌仅在 test/dev 文件记录。
完整回忆/沉淀约定与文件模板见 [references/park-notes.md](references/park-notes.md)
| parkCode | 用途 |
|---|---|
1ZS7H5PQH9 |
可查费,配套测试车牌 粤EJW962 |
PTD2YBBZ |
有存量数据,适合查记录 / 查在场车辆 |
示例:
openydt api getParkFee --body '{"parkCode":"1ZS7H5PQH9","carCode":"粤EJW962"}'
openydt api getParkOnSiteCar --body '{"parkCode":"PTD2YBBZ"}'