pdl-cli —— paidanla.com 平台 CLI(pdlctl)
通过 pdlctl 调用平台 API(/api/v1/*)完成表单/渠道/海报/提交数据管理。
CLI 是纯 Python3 标准库脚本(pdlctl.py,随本 skill 一起分发,无需装任何依赖),
输出统一为格式化 JSON(stdout,直接 parse);错误在 stderr,退出码非 0。
1. 准备(首次使用)
本 skill 的 CLI 是纯 Python3 脚本,源码以 base64 内嵌在下面(商店只保留 SKILL.md,故内嵌;
base64 可避免任何转义/换行损坏)。首次使用时原样执行这段 bash,它把脚本解码写到
~/.cache/pdlctl/pdlctl.py;之后统一用 $PDLCTL 调用(下文简写 pdlctl)。只需 Python3
(mac/Linux 自带;Windows 用 python),无二进制、无第三方依赖。
mkdir -p ~/.cache/pdlctl
python3 <<'PDLCTL_B64'
import base64, os
data = base64.b64decode("""
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJwZGxjdGwg4oCU4oCUIHBhaWRhbmxhLmNvbSDlubPlj7AgQ0xJKOe6ryBQeXRo
b24zIOagh+WHhuW6kyzml6DnrKzkuInmlrnkvp3otZYp44CCCgrorqTor4E6546v5aKD5Y+Y6YePIFBETF9BUElfS0VZKOW5
s+WPsOOAjEFQSSBLZXnjgI3pobXliJvlu7oscGRsXyDliY3nvIApLOaIlueZu+W9leS8muivnQogICAgICAoYHBkbGN0bCBh
dXRoIGxvZ2luYCDlkI4gSldUIOWtmCB+Ly5jb25maWcvcGRsY3RsL3Nlc3Npb24p44CCCuebruaghzpQRExfQkFTRV9VUkwo
6buY6K6kIGh0dHBzOi8vcGFpZGFubGEuY29tKSzmiJYgLS1iYXNlLXVybOOAggrovpPlh7o657uf5LiA5qC85byP5YyWIEpT
T04oc3Rkb3V0KTvplJnor6/lhpkgc3RkZXJyIOW5tuS7pemdniAwIOmAgOWHuuOAggoiIiIKaW1wb3J0IGFyZ3BhcnNlCmlt
cG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB1cmxsaWIuZXJyb3IKaW1wb3J0IHVybGxpYi5yZXF1ZXN0
CgoKY2xhc3MgQ2xpRXJyb3IoRXhjZXB0aW9uKToKICAgIHBhc3MKCgojIC0tLS0tLS0tLS0g55uu5qCHIC8g5Lya6K+dIC0t
LS0tLS0tLS0KCmRlZiByZXNvbHZlX2Jhc2UoYmFzZV91cmwpOgogICAgYmFzZSA9IGJhc2VfdXJsIG9yIG9zLmVudmlyb24u
Z2V0KCJQRExfQkFTRV9VUkwiKSBvciAiaHR0cHM6Ly9wYWlkYW5sYS5jb20iCiAgICByZXR1cm4gYmFzZS5yc3RyaXAoIi8i
KQoKCmRlZiBzZXNzaW9uX3BhdGgoKToKICAgIHJvb3QgPSBvcy5lbnZpcm9uLmdldCgiWERHX0NPTkZJR19IT01FIikgb3Ig
b3MucGF0aC5qb2luKG9zLnBhdGguZXhwYW5kdXNlcigifiIpLCAiLmNvbmZpZyIpCiAgICByZXR1cm4gb3MucGF0aC5qb2lu
KHJvb3QsICJwZGxjdGwiLCAic2Vzc2lvbiIpCgoKZGVmIHJlYWRfc2Vzc2lvbigpOgogICAgdHJ5OgogICAgICAgIHdpdGgg
b3BlbihzZXNzaW9uX3BhdGgoKSwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICB0b2sgPSBmLnJl
YWQoKS5zdHJpcCgpCiAgICAgICAgICAgIHJldHVybiB0b2sgb3IgTm9uZQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAg
cmV0dXJuIE5vbmUKCgpkZWYgd3JpdGVfc2Vzc2lvbih0b2tlbik6CiAgICBwID0gc2Vzc2lvbl9wYXRoKCkKICAgIG9zLm1h
a2VkaXJzKG9zLnBhdGguZGlybmFtZShwKSwgZXhpc3Rfb2s9VHJ1ZSkKICAgIHdpdGggb3BlbihwLCAidyIsIGVuY29kaW5n
PSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgZi53cml0ZSh0b2tlbikKICAgIHRyeToKICAgICAgICBvcy5jaG1vZChwLCAwbzYw
MCkKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIHBhc3MKICAgIHJldHVybiBwCgoKZGVmIGF1dGhlZF9iZWFyZXIoKToK
ICAgICIiIumAmueUqOWRveS7pDpQRExfQVBJX0tFWSA+IOS8muivneaWh+S7tuOAgiIiIgogICAgYiA9IG9zLmVudmlyb24u
Z2V0KCJQRExfQVBJX0tFWSIpIG9yIHJlYWRfc2Vzc2lvbigpCiAgICBpZiBub3QgYjoKICAgICAgICByYWlzZSBDbGlFcnJv
cigi5pyq6K6k6K+BOuiuvue9riBQRExfQVBJX0tFWSzmiJblhYggYHBkbGN0bCBhdXRoIGxvZ2luIC0tcGhvbmUgPOaJi+ac
uuWPtz5gIikKICAgIHJldHVybiBiCgoKZGVmIHNlc3Npb25fYmVhcmVyKCk6CiAgICAiIiJBUEkgS2V5IOeuoeeQhuWRveS7
pDrlj6rorqTnmbvlvZXkvJror50o5pyN5Yqh56uv5ouS57udIEFQSSBLZXkg6Ieq566h55CGKeOAgiIiIgogICAgYiA9IHJl
YWRfc2Vzc2lvbigpCiAgICBpZiBub3QgYjoKICAgICAgICByYWlzZSBDbGlFcnJvcigiQVBJIEtleSDnrqHnkIbpnIDnmbvl
vZXkvJror5066K+35YWIIGBwZGxjdGwgYXV0aCBsb2dpbiAtLXBob25lIDzmiYvmnLrlj7c+YCjkuI3og73nlKggUERMX0FQ
SV9LRVkpIikKICAgIHJldHVybiBiCgoKIyAtLS0tLS0tLS0tIEhUVFAgLS0tLS0tLS0tLQoKZGVmIF9kbyhtZXRob2QsIGJh
c2UsIHBhdGgsIGJlYXJlcj1Ob25lLCBib2R5PU5vbmUsIGNvbnRlbnRfdHlwZT1Ob25lKToKICAgIHVybCA9ICIlcy9hcGkv
djElcyIgJSAoYmFzZSwgcGF0aCkKICAgIGhlYWRlcnMgPSB7fQogICAgaWYgYmVhcmVyOgogICAgICAgIGhlYWRlcnNbIkF1
dGhvcml6YXRpb24iXSA9ICJCZWFyZXIgIiArIGJlYXJlcgogICAgaWYgY29udGVudF90eXBlOgogICAgICAgIGhlYWRlcnNb
IkNvbnRlbnQtVHlwZSJdID0gY29udGVudF90eXBlCiAgICByZXEgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KHVybCwgZGF0
YT1ib2R5LCBtZXRob2Q9bWV0aG9kLCBoZWFkZXJzPWhlYWRlcnMpCiAgICB0cnk6CiAgICAgICAgd2l0aCB1cmxsaWIucmVx
dWVzdC51cmxvcGVuKHJlcSwgdGltZW91dD0xMjApIGFzIHJlc3A6CiAgICAgICAgICAgIHJhdyA9IHJlc3AucmVhZCgpCiAg
ICAgICAgICAgIHN0YXR1cyA9IHJlc3AuZ2V0Y29kZSgpCiAgICAgICAgICAgIHJldHVybiBzdGF0dXMsIHJhdwogICAgZXhj
ZXB0IHVybGxpYi5lcnJvci5IVFRQRXJyb3IgYXMgZToKICAgICAgICByYXcgPSBlLnJlYWQoKQogICAgICAgIGNvZGUsIG1z
ZyA9ICJVTktOT1dOIiwgIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGIgPSBqc29uLmxvYWRzKHJhdykKICAgICAgICAg
ICAgZXJyID0gYi5nZXQoImVycm9yIiwge30pCiAgICAgICAgICAgIGNvZGUgPSBlcnIuZ2V0KCJjb2RlIiwgIlVOS05PV04i
KQogICAgICAgICAgICBtc2cgPSBlcnIuZ2V0KCJtZXNzYWdlIiwgIiIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAg
ICAgICAgICAgbXNnID0gcmF3LmRlY29kZSgidXRmLTgiLCAicmVwbGFjZSIpWzoyMDBdCiAgICAgICAgcmFpc2UgQ2xpRXJy
b3IoIkhUVFAgJXMgJXM6ICVzIiAlIChlLmNvZGUsIGNvZGUsIG1zZykpCiAgICBleGNlcHQgdXJsbGliLmVycm9yLlVSTEVy
cm9yIGFzIGU6CiAgICAgICAgcmFpc2UgQ2xpRXJyb3IoIuivt+axguWksei0pTogJXMiICUgKGUucmVhc29uLCkpCgoKZGVm
IGNhbGxfanNvbihtZXRob2QsIGJhc2UsIHBhdGgsIGJlYXJlcj1Ob25lLCBqc29uX2JvZHk9Tm9uZSk6CiAgICAiIiLml6Ag
Ym9keSDmiJYgSlNPTiBib2R5IOivt+axgizov5Tlm57op6PmnpDlkI7nmoQgSlNPTigyMDQv56m6IOKGkiBOb25lKeOAgiIi
IgogICAgYm9keSA9IE5vbmUKICAgIGN0eXBlID0gTm9uZQogICAgaWYganNvbl9ib2R5IGlzIG5vdCBOb25lOgogICAgICAg
IGJvZHkgPSBqc29uLmR1bXBzKGpzb25fYm9keSwgZW5zdXJlX2FzY2lpPUZhbHNlKS5lbmNvZGUoInV0Zi04IikKICAgICAg
ICBjdHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIgogICAgc3RhdHVzLCByYXcgPSBfZG8obWV0aG9kLCBiYXNlLCBwYXRoLCBi
ZWFyZXIsIGJvZHksIGN0eXBlKQogICAgaWYgc3RhdHVzID09IDIwNCBvciBub3QgcmF3OgogICAgICAgIHJldHVybiBOb25l
CiAgICByZXR1cm4ganNvbi5sb2FkcyhyYXcpCgoKZGVmIGNhbGxfbXVsdGlwYXJ0KGJhc2UsIHBhdGgsIGJlYXJlciwgZmll
bGRzLCBmaWxlX2ZpZWxkPU5vbmUpOgogICAgIiIibXVsdGlwYXJ0L2Zvcm0tZGF0YSDor7fmsYIo5rW35oql55Sf5oiQKeOA
gmZpZWxkczogWyhuYW1lLCB2YWx1ZSld44CCZmlsZV9maWVsZDogKG5hbWUsIGZpbGVwYXRoKeOAgiIiIgogICAgYm91bmRh
cnkgPSAiLS0tLXBkbGN0bC1ib3VuZGFyeS03ZjNhOWQyZTViMWMiCiAgICBwYXJ0cyA9IFtdCiAgICBmb3IgbmFtZSwgdmFs
dWUgaW4gZmllbGRzOgogICAgICAgIHBhcnRzLmFwcGVuZCgKICAgICAgICAgICAgKCItLSVzXHJcbkNvbnRlbnQtRGlzcG9z
aXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIiVzXCJcclxuXHJcbiVzXHJcbiIgJSAoYm91bmRhcnksIG5hbWUsIHZhbHVlKSku
ZW5jb2RlKCJ1dGYtOCIpCiAgICAgICAgKQogICAgaWYgZmlsZV9maWVsZDoKICAgICAgICBuYW1lLCBmaWxlcGF0aCA9IGZp
bGVfZmllbGQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgInJiIikgYXMgZjoKICAgICAg
ICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgICAgIHJh
aXNlIENsaUVycm9yKCLor7vlj5YgJXMg5aSx6LSlOiAlcyIgJSAoZmlsZXBhdGgsIGUpKQogICAgICAgIGZpbGVuYW1lID0g
b3MucGF0aC5iYXNlbmFtZShmaWxlcGF0aCkKICAgICAgICBwYXJ0cy5hcHBlbmQoCiAgICAgICAgICAgICgiLS0lc1xyXG5D
b250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIlc1wiOyBmaWxlbmFtZT1cIiVzXCJcclxuQ29udGVudC1U
eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cclxuXHJcbiIgJSAoYm91bmRhcnksIG5hbWUsIGZpbGVuYW1lKSkuZW5j
b2RlKCJ1dGYtOCIpCiAgICAgICAgKQogICAgICAgIHBhcnRzLmFwcGVuZChjb250ZW50KQogICAgICAgIHBhcnRzLmFwcGVu
ZChiIlxyXG4iKQogICAgcGFydHMuYXBwZW5kKCgiLS0lcy0tXHJcbiIgJSBib3VuZGFyeSkuZW5jb2RlKCJ1dGYtOCIpKQog
ICAgYm9keSA9IGIiIi5qb2luKHBhcnRzKQogICAgc3RhdHVzLCByYXcgPSBfZG8oIlBPU1QiLCBiYXNlLCBwYXRoLCBiZWFy
ZXIsIGJvZHksICJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0iICsgYm91bmRhcnkpCiAgICBpZiBzdGF0dXMgPT0g
MjA0IG9yIG5vdCByYXc6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBqc29uLmxvYWRzKHJhdykKCgpkZWYgZG93
bmxvYWQoYmFzZSwgcGF0aCwgYmVhcmVyLCBvdXQpOgogICAgIiIi5LiL6L295LqM6L+b5Yi25ZON5bqU5Yiw5paH5Lu244CC
IiIiCiAgICBzdGF0dXMsIHJhdyA9IF9kbygiR0VUIiwgYmFzZSwgcGF0aCwgYmVhcmVyKQogICAgdHJ5OgogICAgICAgIHdp
dGggb3BlbihvdXQsICJ3YiIpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUocmF3KQogICAgZXhjZXB0IE9TRXJyb3IgYXMg
ZToKICAgICAgICByYWlzZSBDbGlFcnJvcigi5YaZ5YWlICVzIOWksei0pTogJXMiICUgKG91dCwgZSkpCiAgICByZXR1cm4g
eyJzYXZlZCI6IG91dCwgImJ5dGVzIjogbGVuKHJhdyl9CgoKZGVmIHJlYWRfanNvbl9maWxlKHBhdGgpOgogICAgdHJ5Ogog
ICAgICAgIHdpdGggb3BlbihwYXRoLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBq
c29uLmxvYWQoZikKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgQ2xpRXJyb3IoIuivu+WPliAlcyDl
pLHotKU6ICVzIiAlIChwYXRoLCBlKSkKICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvciBhcyBlOgogICAgICAgIHJh
aXNlIENsaUVycm9yKCIlcyDkuI3mmK/lkIjms5UgSlNPTjogJXMiICUgKHBhdGgsIGUpKQoKCiMgLS0tLS0tLS0tLSDlkb3k
u6Tlrp7njrAgLS0tLS0tLS0tLQoKZGVmIGNtZF9hdXRoKGFyZ3MpOgogICAgYmFzZSA9IHJlc29sdmVfYmFzZShhcmdzLmJh
c2VfdXJsKQogICAgaWYgYXJncy5hdXRoX2FjdGlvbiA9PSAic21zLWNvZGUiOgogICAgICAgIGNhbGxfanNvbigiUE9TVCIs
IGJhc2UsICIvYXV0aC9waG9uZS9zbXMtY29kZSIsIGpzb25fYm9keT17InBob25lIjogYXJncy5waG9uZX0pCiAgICAgICAg
cmV0dXJuIHsic2VudCI6IFRydWUsICJwaG9uZSI6IGFyZ3MucGhvbmV9CiAgICBpZiBhcmdzLmF1dGhfYWN0aW9uIGluICgi
bG9naW4iLCAicmVnaXN0ZXIiKToKICAgICAgICBwYXRoID0gIi9hdXRoL3Bob25lLyVzIiAlICgibG9naW4iIGlmIGFyZ3Mu
YXV0aF9hY3Rpb24gPT0gImxvZ2luIiBlbHNlICJyZWdpc3RlciIpCiAgICAgICAgcmVzID0gY2FsbF9qc29uKCJQT1NUIiwg
YmFzZSwgcGF0aCwganNvbl9ib2R5PXsicGhvbmUiOiBhcmdzLnBob25lLCAiY29kZSI6IGFyZ3MuY29kZX0pCiAgICAgICAg
dG9rZW4gPSAocmVzIG9yIHt9KS5nZXQoInRva2VuIikKICAgICAgICBpZiBub3QgdG9rZW46CiAgICAgICAgICAgIHJhaXNl
IENsaUVycm9yKCLlk43lupTnvLrlsJEgdG9rZW4iKQogICAgICAgIHNhdmVkID0gd3JpdGVfc2Vzc2lvbih0b2tlbikKICAg
ICAgICByZXR1cm4geyJsb2dnZWRfaW4iOiBUcnVlLCAic2Vzc2lvbiI6IHNhdmVkfQogICAgaWYgYXJncy5hdXRoX2FjdGlv
biA9PSAibG9nb3V0IjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLnJlbW92ZShzZXNzaW9uX3BhdGgoKSkKICAgICAg
ICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiB7ImxvZ2dlZF9vdXQiOiBUcnVlfQog
ICAgcmFpc2UgQ2xpRXJyb3IoIuacquefpSBhdXRoIOWtkOWRveS7pCIpCgoKZGVmIGNtZF9hcGlrZXlzKGFyZ3MpOgogICAg
YmFzZSA9IHJlc29sdmVfYmFzZShhcmdzLmJhc2VfdXJsKQogICAgYmVhcmVyID0gc2Vzc2lvbl9iZWFyZXIoKQogICAgaWYg
YXJncy5hcGlrZXlzX2FjdGlvbiA9PSAibGlzdCI6CiAgICAgICAgcmV0dXJuIGNhbGxfanNvbigiR0VUIiwgYmFzZSwgIi9h
cGlrZXlzIiwgYmVhcmVyKQogICAgaWYgYXJncy5hcGlrZXlzX2FjdGlvbiA9PSAiY3JlYXRlIjoKICAgICAgICByZXR1cm4g
Y2FsbF9qc29uKCJQT1NUIiwgYmFzZSwgIi9hcGlrZXlzIiwgYmVhcmVyLCB7Im5hbWUiOiBhcmdzLm5hbWV9KQogICAgaWYg
YXJncy5hcGlrZXlzX2FjdGlvbiA9PSAicmV2b2tlIjoKICAgICAgICByZXR1cm4gY2FsbF9qc29uKCJERUxFVEUiLCBiYXNl
LCAiL2FwaWtleXMvJXMiICUgYXJncy5pZCwgYmVhcmVyKQogICAgcmFpc2UgQ2xpRXJyb3IoIuacquefpSBhcGlrZXlzIOWt
kOWRveS7pCIpCgoKZGVmIGNtZF93aG9hbWkoYXJncyk6CiAgICBiYXNlID0gcmVzb2x2ZV9iYXNlKGFyZ3MuYmFzZV91cmwp
CiAgICByZXR1cm4gY2FsbF9qc29uKCJHRVQiLCBiYXNlLCAiL2F1dGgvbWUiLCBhdXRoZWRfYmVhcmVyKCkpCgoKZGVmIGNt
ZF9mb3JtcyhhcmdzKToKICAgIGJhc2UgPSByZXNvbHZlX2Jhc2UoYXJncy5iYXNlX3VybCkKICAgIGIgPSBhdXRoZWRfYmVh
cmVyKCkKICAgIGEgPSBhcmdzLmZvcm1zX2FjdGlvbgogICAgaWYgYSA9PSAibGlzdCI6CiAgICAgICAgcmV0dXJuIGNhbGxf
anNvbigiR0VUIiwgYmFzZSwgIi9mb3JtcyIsIGIpCiAgICBpZiBhID09ICJnZXQiOgogICAgICAgIHJldHVybiBjYWxsX2pz
b24oIkdFVCIsIGJhc2UsICIvZm9ybXMvJXMiICUgYXJncy5pZCwgYikKICAgIGlmIGEgPT0gImNyZWF0ZSI6CiAgICAgICAg
cmV0dXJuIGNhbGxfanNvbigiUE9TVCIsIGJhc2UsICIvZm9ybXMiLCBiLCByZWFkX2pzb25fZmlsZShhcmdzLmZpbGUpKQog
ICAgaWYgYSA9PSAidXBkYXRlIjoKICAgICAgICByZXR1cm4gY2FsbF9qc29uKCJQVVQiLCBiYXNlLCAiL2Zvcm1zLyVzIiAl
IGFyZ3MuaWQsIGIsIHJlYWRfanNvbl9maWxlKGFyZ3MuZmlsZSkpCiAgICBpZiBhID09ICJwdWJsaXNoIjoKICAgICAgICBy
ZXR1cm4gY2FsbF9qc29uKCJQT1NUIiwgYmFzZSwgIi9mb3Jtcy8lcy9wdWJsaXNoIiAlIGFyZ3MuaWQsIGIpCiAgICBpZiBh
ID09ICJzdG9wIjoKICAgICAgICByZXR1cm4gY2FsbF9qc29uKCJQT1NUIiwgYmFzZSwgIi9mb3Jtcy8lcy9zdG9wIiAlIGFy
Z3MuaWQsIGIpCiAgICBpZiBhID09ICJkZWxldGUiOgogICAgICAgIHJldHVybiBjYWxsX2pzb24oIkRFTEVURSIsIGJhc2Us
ICIvZm9ybXMvJXMiICUgYXJncy5pZCwgYikKICAgIHJhaXNlIENsaUVycm9yKCLmnKrnn6UgZm9ybXMg5a2Q5ZG95LukIikK
CgpkZWYgY21kX2NoYW5uZWxzKGFyZ3MpOgogICAgYmFzZSA9IHJlc29sdmVfYmFzZShhcmdzLmJhc2VfdXJsKQogICAgYiA9
IGF1dGhlZF9iZWFyZXIoKQogICAgYSA9IGFyZ3MuY2hhbm5lbHNfYWN0aW9uCiAgICBpZiBhID09ICJsaXN0IjoKICAgICAg
ICByZXR1cm4gY2FsbF9qc29uKCJHRVQiLCBiYXNlLCAiL2NoYW5uZWxzIiwgYikKICAgIGlmIGEgPT0gImdldCI6CiAgICAg
ICAgcmV0dXJuIGNhbGxfanNvbigiR0VUIiwgYmFzZSwgIi9jaGFubmVscy8lcyIgJSBhcmdzLmlkLCBiKQogICAgaWYgYSA9
PSAiY3JlYXRlIjoKICAgICAgICByZXR1cm4gY2FsbF9qc29uKCJQT1NUIiwgYmFzZSwgIi9jaGFubmVscyIsIGIsIHsibmFt
ZSI6IGFyZ3MubmFtZX0pCiAgICBpZiBhID09ICJyZW5hbWUiOgogICAgICAgIHJldHVybiBjYWxsX2pzb24oIlBBVENIIiwg
YmFzZSwgIi9jaGFubmVscy8lcyIgJSBhcmdzLmlkLCBiLCB7Im5hbWUiOiBhcmdzLm5hbWV9KQogICAgaWYgYSA9PSAiZGlz
YWJsZSI6CiAgICAgICAgcmV0dXJuIGNhbGxfanNvbigiUE9TVCIsIGJhc2UsICIvY2hhbm5lbHMvJXMvZGlzYWJsZSIgJSBh
cmdzLmlkLCBiKQogICAgcmFpc2UgQ2xpRXJyb3IoIuacquefpSBjaGFubmVscyDlrZDlkb3ku6QiKQoKCmRlZiBjbWRfcG9z
dGVycyhhcmdzKToKICAgIGJhc2UgPSByZXNvbHZlX2Jhc2UoYXJncy5iYXNlX3VybCkKICAgIGIgPSBhdXRoZWRfYmVhcmVy
KCkKICAgIGEgPSBhcmdzLnBvc3RlcnNfYWN0aW9uCiAgICBpZiBhID09ICJsaXN0IjoKICAgICAgICByZXR1cm4gY2FsbF9q
c29uKCJHRVQiLCBiYXNlLCAiL2Zvcm1zLyVzL3Bvc3RlcnMiICUgYXJncy5mb3JtX2lkLCBiKQogICAgaWYgYSA9PSAiZ2Vu
ZXJhdGUiOgogICAgICAgIGZpZWxkcyA9IFsoImNoYW5uZWxfaWQiLCBhcmdzLmNoYW5uZWwpXQogICAgICAgIGlmIGFyZ3Mu
YWlfcHJvbXB0OgogICAgICAgICAgICBmaWVsZHMuYXBwZW5kKCgiYWlfcHJvbXB0IiwgYXJncy5haV9wcm9tcHQpKQogICAg
ICAgICAgICBpZiBhcmdzLmFpX21vZGU6CiAgICAgICAgICAgICAgICBmaWVsZHMuYXBwZW5kKCgibW9kZSIsIGFyZ3MuYWlf
bW9kZSkpCiAgICAgICAgZm9yIGssIHYgaW4gKCgiYm94X3giLCBhcmdzLmJveF94KSwgKCJib3hfeSIsIGFyZ3MuYm94X3kp
LCAoImJveF93IiwgYXJncy5ib3hfdyksCiAgICAgICAgICAgICAgICAgICAgICgiYm94X2giLCBhcmdzLmJveF9oKSwgKCJx
cl93aWR0aCIsIGFyZ3MucXJfd2lkdGgpKToKICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAg
IGZpZWxkcy5hcHBlbmQoKGssIHN0cih2KSkpCiAgICAgICAgZmlsZV9maWVsZCA9ICgiYmFja2dyb3VuZCIsIGFyZ3MuYmFj
a2dyb3VuZCkgaWYgYXJncy5iYWNrZ3JvdW5kIGVsc2UgTm9uZQogICAgICAgIHJldHVybiBjYWxsX211bHRpcGFydChiYXNl
LCAiL2Zvcm1zLyVzL3Bvc3RlcnMiICUgYXJncy5mb3JtX2lkLCBiLCBmaWVsZHMsIGZpbGVfZmllbGQpCiAgICBpZiBhID09
ICJkb3dubG9hZCI6CiAgICAgICAgcmV0dXJuIGRvd25sb2FkKGJhc2UsICIvcG9zdGVycy8lcy9pbWFnZSIgJSBhcmdzLnBv
c3Rlcl9pZCwgYiwgYXJncy5vdXQpCiAgICByYWlzZSBDbGlFcnJvcigi5pyq55+lIHBvc3RlcnMg5a2Q5ZG95LukIikKCgpk
ZWYgY21kX3N1Ym1pc3Npb25zKGFyZ3MpOgogICAgYmFzZSA9IHJlc29sdmVfYmFzZShhcmdzLmJhc2VfdXJsKQogICAgYiA9
IGF1dGhlZF9iZWFyZXIoKQogICAgaWYgYXJncy5zdWJtaXNzaW9uc19hY3Rpb24gPT0gImxpc3QiOgogICAgICAgIHJldHVy
biBjYWxsX2pzb24oIkdFVCIsIGJhc2UsICIvZm9ybXMvJXMvc3VibWlzc2lvbnMiICUgYXJncy5mb3JtX2lkLCBiKQogICAg
aWYgYXJncy5zdWJtaXNzaW9uc19hY3Rpb24gPT0gImV4cG9ydCI6CiAgICAgICAgcmV0dXJuIGRvd25sb2FkKGJhc2UsICIv
Zm9ybXMvJXMvc3VibWlzc2lvbnMvZXhwb3J0IiAlIGFyZ3MuZm9ybV9pZCwgYiwgYXJncy5vdXQpCiAgICByYWlzZSBDbGlF
cnJvcigi5pyq55+lIHN1Ym1pc3Npb25zIOWtkOWRveS7pCIpCgoKZGVmIGNtZF9hbmFseXRpY3MoYXJncyk6CiAgICBiYXNl
ID0gcmVzb2x2ZV9iYXNlKGFyZ3MuYmFzZV91cmwpCiAgICBiID0gYXV0aGVkX2JlYXJlcigpCiAgICBpZiBhcmdzLmFuYWx5
dGljc19hY3Rpb24gPT0gImdldCI6CiAgICAgICAgcmV0dXJuIGNhbGxfanNvbigiR0VUIiwgYmFzZSwgIi9mb3Jtcy8lcy9h
bmFseXRpY3MiICUgYXJncy5mb3JtX2lkLCBiKQogICAgaWYgYXJncy5hbmFseXRpY3NfYWN0aW9uID09ICJleHBvcnQiOgog
ICAgICAgIHJldHVybiBkb3dubG9hZChiYXNlLCAiL2Zvcm1zLyVzL2FuYWx5dGljcy9leHBvcnQiICUgYXJncy5mb3JtX2lk
LCBiLCBhcmdzLm91dCkKICAgIHJhaXNlIENsaUVycm9yKCLmnKrnn6UgYW5hbHl0aWNzIOWtkOWRveS7pCIpCgoKZGVmIGNt
ZF9hZG1pbihhcmdzKToKICAgIGJhc2UgPSByZXNvbHZlX2Jhc2UoYXJncy5iYXNlX3VybCkKICAgIGIgPSBhdXRoZWRfYmVh
cmVyKCkKICAgIGEgPSBhcmdzLmFkbWluX2FjdGlvbgogICAgaWYgYSA9PSAidXNlcnMiOgogICAgICAgIHBhdGggPSAiL2Fk
bWluL3VzZXJzIiArICgiP3N0YXR1cz0lcyIgJSBhcmdzLnN0YXR1cyBpZiBhcmdzLnN0YXR1cyBlbHNlICIiKQogICAgICAg
IHJldHVybiBjYWxsX2pzb24oIkdFVCIsIGJhc2UsIHBhdGgsIGIpCiAgICBpZiBhIGluICgiYXBwcm92ZSIsICJyZWplY3Qi
LCAiYmFuIiwgInVuYmFuIik6CiAgICAgICAgcmV0dXJuIGNhbGxfanNvbigiUE9TVCIsIGJhc2UsICIvYWRtaW4vdXNlcnMv
JXMvJXMiICUgKGFyZ3MuaWQsIGEpLCBiKQogICAgcmFpc2UgQ2xpRXJyb3IoIuacquefpSBhZG1pbiDlrZDlkb3ku6QiKQoK
CiMgLS0tLS0tLS0tLSDlj4LmlbDop6PmnpAgLS0tLS0tLS0tLQoKZGVmIGJ1aWxkX3BhcnNlcigpOgogICAgcCA9IGFyZ3Bh
cnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9InBkbGN0bCIsIGRlc2NyaXB0aW9uPSJwYWlkYW5sYS5jb20g5bmz5Y+wIENMSSjo
oajljZUv5rig6YGTL+a1t+aKpS/mj5DkuqQv57uf6K6hKSIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1iYXNlLXVybCIsIGhl
bHA9IuW5s+WPsOWcsOWdgDvkuqblj6/nlKjnjq/looPlj5jph48gUERMX0JBU0VfVVJMIikKICAgIHN1YiA9IHAuYWRkX3N1
YnBhcnNlcnMoZGVzdD0iY29tbWFuZCIsIHJlcXVpcmVkPVRydWUpCgogICAgIyBhdXRoCiAgICBwYSA9IHN1Yi5hZGRfcGFy
c2VyKCJhdXRoIiwgaGVscD0i6LSm5Y+36K6k6K+BOuaJi+acuuWPtyArIOmqjOivgeeggeazqOWGjC/nmbvlvZUiKQogICAg
c2EgPSBwYS5hZGRfc3VicGFyc2VycyhkZXN0PSJhdXRoX2FjdGlvbiIsIHJlcXVpcmVkPVRydWUpCiAgICB4ID0gc2EuYWRk
X3BhcnNlcigic21zLWNvZGUiLCBoZWxwPSLlj5HpgIHnn63kv6Hpqozor4HnoIEiKQogICAgeC5hZGRfYXJndW1lbnQoIi0t
cGhvbmUiLCByZXF1aXJlZD1UcnVlKQogICAgZm9yIG5hbWUgaW4gKCJyZWdpc3RlciIsICJsb2dpbiIpOgogICAgICAgIHgg
PSBzYS5hZGRfcGFyc2VyKG5hbWUsIGhlbHA9IuazqOWGjCIgaWYgbmFtZSA9PSAicmVnaXN0ZXIiIGVsc2UgIueZu+W9lSIp
CiAgICAgICAgeC5hZGRfYXJndW1lbnQoIi0tcGhvbmUiLCByZXF1aXJlZD1UcnVlKQogICAgICAgIHguYWRkX2FyZ3VtZW50
KCItLWNvZGUiLCByZXF1aXJlZD1UcnVlKQogICAgc2EuYWRkX3BhcnNlcigibG9nb3V0IiwgaGVscD0i5riF6Zmk5pys5Zyw
5Lya6K+dIikKICAgIHBhLnNldF9kZWZhdWx0cyhmdW5jPWNtZF9hdXRoKQoKICAgICMgYXBpa2V5cwogICAgcGsgPSBzdWIu
YWRkX3BhcnNlcigiYXBpa2V5cyIsIGhlbHA9IkFQSSBLZXkg566h55CGKOmcgOeZu+W9leS8muivnSkiKQogICAgc2sgPSBw
ay5hZGRfc3VicGFyc2VycyhkZXN0PSJhcGlrZXlzX2FjdGlvbiIsIHJlcXVpcmVkPVRydWUpCiAgICBzay5hZGRfcGFyc2Vy
KCJsaXN0IiwgaGVscD0i5YiX5Ye6IEFQSSBLZXkiKQogICAgeCA9IHNrLmFkZF9wYXJzZXIoImNyZWF0ZSIsIGhlbHA9IuWI
m+W7uiBBUEkgS2V5IikKICAgIHguYWRkX2FyZ3VtZW50KCItLW5hbWUiLCByZXF1aXJlZD1UcnVlKQogICAgeCA9IHNrLmFk
ZF9wYXJzZXIoInJldm9rZSIsIGhlbHA9IuWQiumUgCBBUEkgS2V5IikKICAgIHguYWRkX2FyZ3VtZW50KCJpZCIpCiAgICBw
ay5zZXRfZGVmYXVsdHMoZnVuYz1jbWRfYXBpa2V5cykKCiAgICAjIHdob2FtaQogICAgcHcgPSBzdWIuYWRkX3BhcnNlcigi
d2hvYW1pIiwgaGVscD0i5b2T5YmN5Yet6K+B5b2S5bGe6LSm5Y+3IikKICAgIHB3LnNldF9kZWZhdWx0cyhmdW5jPWNtZF93
aG9hbWkpCgogICAgIyBmb3JtcwogICAgcGYgPSBzdWIuYWRkX3BhcnNlcigiZm9ybXMiLCBoZWxwPSLooajljZXnrqHnkIYi
KQogICAgc2YgPSBwZi5hZGRfc3VicGFyc2VycyhkZXN0PSJmb3Jtc19hY3Rpb24iLCByZXF1aXJlZD1UcnVlKQogICAgc2Yu
YWRkX3BhcnNlcigibGlzdCIpCiAgICBmb3IgbmFtZSBpbiAoImdldCIsICJwdWJsaXNoIiwgInN0b3AiLCAiZGVsZXRlIik6
CiAgICAgICAgeCA9IHNmLmFkZF9wYXJzZXIobmFtZSkKICAgICAgICB4LmFkZF9hcmd1bWVudCgiaWQiKQogICAgeCA9IHNm
LmFkZF9wYXJzZXIoImNyZWF0ZSIpCiAgICB4LmFkZF9hcmd1bWVudCgiLS1maWxlIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHgg
PSBzZi5hZGRfcGFyc2VyKCJ1cGRhdGUiKQogICAgeC5hZGRfYXJndW1lbnQoImlkIikKICAgIHguYWRkX2FyZ3VtZW50KCIt
LWZpbGUiLCByZXF1aXJlZD1UcnVlKQogICAgcGYuc2V0X2RlZmF1bHRzKGZ1bmM9Y21kX2Zvcm1zKQoKICAgICMgY2hhbm5l
bHMKICAgIHBjID0gc3ViLmFkZF9wYXJzZXIoImNoYW5uZWxzIiwgaGVscD0i5rig6YGT566h55CGIikKICAgIHNjID0gcGMu
YWRkX3N1YnBhcnNlcnMoZGVzdD0iY2hhbm5lbHNfYWN0aW9uIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHNjLmFkZF9wYXJzZXIo
Imxpc3QiKQogICAgeCA9IHNjLmFkZF9wYXJzZXIoImdldCIpCiAgICB4LmFkZF9hcmd1bWVudCgiaWQiKQogICAgeCA9IHNj
LmFkZF9wYXJzZXIoImNyZWF0ZSIpCiAgICB4LmFkZF9hcmd1bWVudCgiLS1uYW1lIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHgg
PSBzYy5hZGRfcGFyc2VyKCJyZW5hbWUiKQogICAgeC5hZGRfYXJndW1lbnQoImlkIikKICAgIHguYWRkX2FyZ3VtZW50KCIt
LW5hbWUiLCByZXF1aXJlZD1UcnVlKQogICAgeCA9IHNjLmFkZF9wYXJzZXIoImRpc2FibGUiKQogICAgeC5hZGRfYXJndW1l
bnQoImlkIikKICAgIHBjLnNldF9kZWZhdWx0cyhmdW5jPWNtZF9jaGFubmVscykKCiAgICAjIHBvc3RlcnMKICAgIHBwID0g
c3ViLmFkZF9wYXJzZXIoInBvc3RlcnMiLCBoZWxwPSLmtbfmiqXnlJ/miJDkuI7kuIvovb0iKQogICAgc3AgPSBwcC5hZGRf
c3VicGFyc2VycyhkZXN0PSJwb3N0ZXJzX2FjdGlvbiIsIHJlcXVpcmVkPVRydWUpCiAgICB4ID0gc3AuYWRkX3BhcnNlcigi
bGlzdCIpCiAgICB4LmFkZF9hcmd1bWVudCgiZm9ybV9pZCIpCiAgICB4ID0gc3AuYWRkX3BhcnNlcigiZ2VuZXJhdGUiKQog
ICAgeC5hZGRfYXJndW1lbnQoImZvcm1faWQiKQogICAgeC5hZGRfYXJndW1lbnQoIi0tY2hhbm5lbCIsIHJlcXVpcmVkPVRy
dWUpCiAgICB4LmFkZF9hcmd1bWVudCgiLS1iYWNrZ3JvdW5kIiwgaGVscD0i6Ieq5a6a5LmJ6IOM5pmv5Zu+6Lev5b6EKFBO
Ry9KUEVHKSIpCiAgICB4LmFkZF9hcmd1bWVudCgiLS1haS1wcm9tcHQiLCBkZXN0PSJhaV9wcm9tcHQiLCBoZWxwPSLmjInm
j5DnpLror40gQUkg55Sf5oiQ5rW35oqlKOacque7meiDjOaZr+WbvuaXtueUn+aViCkiKQogICAgeC5hZGRfYXJndW1lbnQo
Ii0tYWktbW9kZSIsIGRlc3Q9ImFpX21vZGUiLCBjaG9pY2VzPVsidGVtcGxhdGUiLCAiYWlfcG9zdGVyIl0sCiAgICAgICAg
ICAgICAgICAgICBoZWxwPSJBSSDlh7rlm77mlrnlvI86dGVtcGxhdGU9QUnlh7rog4zmma8r57O757uf5qih5p2/5o6S54mI
KOm7mOiupCzmloflrZfmuIXmmbApO2FpX3Bvc3Rlcj1BSeWHuuaVtOW8oOa1t+aKpeezu+e7n+WPquWPoOeggSjorr7orqHo
h6rnlLEs5Lit5paH5Y+v6IO95LiN5YeGKSIpCiAgICB4LmFkZF9hcmd1bWVudCgiLS1ib3gteCIsIGRlc3Q9ImJveF94Iiwg
dHlwZT1mbG9hdCkKICAgIHguYWRkX2FyZ3VtZW50KCItLWJveC15IiwgZGVzdD0iYm94X3kiLCB0eXBlPWZsb2F0KQogICAg
eC5hZGRfYXJndW1lbnQoIi0tYm94LXciLCBkZXN0PSJib3hfdyIsIHR5cGU9ZmxvYXQpCiAgICB4LmFkZF9hcmd1bWVudCgi
LS1ib3gtaCIsIGRlc3Q9ImJveF9oIiwgdHlwZT1mbG9hdCkKICAgIHguYWRkX2FyZ3VtZW50KCItLXFyLXdpZHRoIiwgZGVz
dD0icXJfd2lkdGgiLCB0eXBlPWZsb2F0KQogICAgeCA9IHNwLmFkZF9wYXJzZXIoImRvd25sb2FkIikKICAgIHguYWRkX2Fy
Z3VtZW50KCJwb3N0ZXJfaWQiKQogICAgeC5hZGRfYXJndW1lbnQoIi1vIiwgIi0tb3V0IiwgcmVxdWlyZWQ9VHJ1ZSkKICAg
IHBwLnNldF9kZWZhdWx0cyhmdW5jPWNtZF9wb3N0ZXJzKQoKICAgICMgc3VibWlzc2lvbnMKICAgIHBzID0gc3ViLmFkZF9w
YXJzZXIoInN1Ym1pc3Npb25zIiwgaGVscD0i5o+Q5Lqk5pWw5o2u5p+l55yL5LiO5a+85Ye6IikKICAgIHNzID0gcHMuYWRk
X3N1YnBhcnNlcnMoZGVzdD0ic3VibWlzc2lvbnNfYWN0aW9uIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHggPSBzcy5hZGRfcGFy
c2VyKCJsaXN0IikKICAgIHguYWRkX2FyZ3VtZW50KCJmb3JtX2lkIikKICAgIHggPSBzcy5hZGRfcGFyc2VyKCJleHBvcnQi
KQogICAgeC5hZGRfYXJndW1lbnQoImZvcm1faWQiKQogICAgeC5hZGRfYXJndW1lbnQoIi1vIiwgIi0tb3V0IiwgcmVxdWly
ZWQ9VHJ1ZSkKICAgIHBzLnNldF9kZWZhdWx0cyhmdW5jPWNtZF9zdWJtaXNzaW9ucykKCiAgICAjIGFuYWx5dGljcwogICAg
cG4gPSBzdWIuYWRkX3BhcnNlcigiYW5hbHl0aWNzIiwgaGVscD0i6K6/6ZeuL+i9rOWMlue7n+iuoSIpCiAgICBzbiA9IHBu
LmFkZF9zdWJwYXJzZXJzKGRlc3Q9ImFuYWx5dGljc19hY3Rpb24iLCByZXF1aXJlZD1UcnVlKQogICAgeCA9IHNuLmFkZF9w
YXJzZXIoImdldCIpCiAgICB4LmFkZF9hcmd1bWVudCgiZm9ybV9pZCIpCiAgICB4ID0gc24uYWRkX3BhcnNlcigiZXhwb3J0
IikKICAgIHguYWRkX2FyZ3VtZW50KCJmb3JtX2lkIikKICAgIHguYWRkX2FyZ3VtZW50KCItbyIsICItLW91dCIsIHJlcXVp
cmVkPVRydWUpCiAgICBwbi5zZXRfZGVmYXVsdHMoZnVuYz1jbWRfYW5hbHl0aWNzKQoKICAgICMgYWRtaW4KICAgIHBtID0g
c3ViLmFkZF9wYXJzZXIoImFkbWluIiwgaGVscD0i566h55CG5ZGY5pON5L2cKOmcgCBhZG1pbiDotKblj7flh63or4EpIikK
ICAgIHNtID0gcG0uYWRkX3N1YnBhcnNlcnMoZGVzdD0iYWRtaW5fYWN0aW9uIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHggPSBz
bS5hZGRfcGFyc2VyKCJ1c2VycyIpCiAgICB4LmFkZF9hcmd1bWVudCgiLS1zdGF0dXMiLCBoZWxwPSJwZW5kaW5nL2FwcHJv
dmVkL3JlamVjdGVkIikKICAgIGZvciBuYW1lIGluICgiYXBwcm92ZSIsICJyZWplY3QiLCAiYmFuIiwgInVuYmFuIik6CiAg
ICAgICAgeCA9IHNtLmFkZF9wYXJzZXIobmFtZSkKICAgICAgICB4LmFkZF9hcmd1bWVudCgiaWQiKQogICAgcG0uc2V0X2Rl
ZmF1bHRzKGZ1bmM9Y21kX2FkbWluKQoKICAgIHJldHVybiBwCgoKZGVmIG1haW4oKToKICAgIGFyZ3MgPSBidWlsZF9wYXJz
ZXIoKS5wYXJzZV9hcmdzKCkKICAgIHRyeToKICAgICAgICByZXN1bHQgPSBhcmdzLmZ1bmMoYXJncykKICAgIGV4Y2VwdCBD
bGlFcnJvciBhcyBlOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInBkbGN0bDogJXNcbiIgJSBlKQogICAgICAgIHJldHVy
biAxCiAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgcmV0dXJuIDEzMAogICAgcHJpbnQoanNvbi5kdW1w
cyhyZXN1bHQsIGVuc3VyZV9hc2NpaT1GYWxzZSwgaW5kZW50PTIpKQogICAgcmV0dXJuIDAKCgppZiBfX25hbWVfXyA9PSAi
X19tYWluX18iOgogICAgc3lzLmV4aXQobWFpbigpKQo=
""")
with open(os.path.expanduser("~/.cache/pdlctl/pdlctl.py"), "wb") as f:
f.write(data)
PDLCTL_B64
PDLCTL="python3 $HOME/.cache/pdlctl/pdlctl.py" # Windows: PDLCTL="python $HOME/.cache/pdlctl/pdlctl.py"
$PDLCTL --help
2. 配置目标环境(环境变量)
| 变量 | 说明 | 默认 |
|---|---|---|
PDL_BASE_URL |
平台地址 | https://paidanla.com |
PDL_API_KEY |
API Key(pdl_ 前缀) |
可选 |
两种认证,任选其一(通用命令凭证优先级 PDL_API_KEY > 登录会话):
- API Key(适合脚本/CI):平台网页端「API Key」页创建,
export PDL_API_KEY=pdl_…。 - 登录会话(适合交互):
pdlctl auth login --phone <手机号> --code <验证码>,JWT 存~/.config/pdlctl/session(0600)。
- API Key 管理(
apikeys子命令)只认登录会话,不接受PDL_API_KEY(平台硬限制:Key 不能管理 Key,防泄漏自繁殖)。要建/吊销 Key 得先auth login。 - 不要把 Key/令牌写进任何文件或提交到仓库,只在当前 shell 里 export。
- 本地开发:后端
cd backend && make run(:8080),export PDL_BASE_URL=http://127.0.0.1:8080。 - 默认目标是生产:改动生产内容(建/删表单、停用渠道、审核用户、注册账号)前先向用户确认。
3. 命令速查
# 认证(手机号 + 验证码;即注册即用,免审核)
pdlctl auth sms-code --phone 13800138000 # 发验证码
pdlctl auth login --phone 13800138000 --code 123456 # 登录(未注册自动建号),存本地会话
pdlctl auth register --phone 13800138000 --code 123456 # 显式注册,等价于登录(即注册即用)
pdlctl auth logout # 清除本地会话
# API Key 管理(需登录会话)
pdlctl apikeys list
pdlctl apikeys create --name "CI 脚本" # 明文令牌仅返回一次
pdlctl apikeys revoke <id>
pdlctl whoami # 当前凭证归属账号(验证配置)
pdlctl forms list
pdlctl forms get <id>
pdlctl forms create --file form.json # 定义结构见下节
pdlctl forms update <id> --file form.json # 有提交后字段定义锁定(FIELDS_LOCKED)
pdlctl forms publish <id> # draft → published,开始收表
pdlctl forms stop <id> # 停止收集
pdlctl forms delete <id>
pdlctl channels list # 含已停用
pdlctl channels create --name "朋友圈"
pdlctl channels rename <id> --name "视频号"
pdlctl channels disable <id> # 软停用,不可重新启用
pdlctl posters list <form_id>
pdlctl posters generate <form_id> --channel <channel_id> \
[--background bg.png | --ai-prompt "山景 海报背景" [--ai-mode template|ai_poster]] \
[--box-x 0.3 --box-y 0.6 --box-w 0.4 --box-h 0.3] [--qr-width 0.28]
pdlctl posters download <poster_id> -o poster.png
pdlctl submissions list <form_id> # 含 PII,注意保密
pdlctl submissions export <form_id> -o subs.csv # CSV(带 BOM,Excel 直开)
pdlctl analytics get <form_id> # 访问/提交/转化,按渠道细分
pdlctl analytics export <form_id> -o stats.csv
pdlctl admin users [--status pending] # 需 admin 账号的凭证
pdlctl admin approve <id> # 通过待审核账号
pdlctl admin reject <id> # 拒绝待审核账号
pdlctl admin ban <id> # 封禁已生效账号(立即禁止登录)
pdlctl admin unban <id> # 解封
账号体系:手机号 + 验证码即注册即用(免审核)——登录时号不存在自动建号并登录。邮箱+密码登录仅管理员/存量账号(邮箱注册已下线)。被管理员拒绝/封禁(rejected)的号仍不能登录。手机号发码有防刷限流(同号 60s 间隔 / 每日 10 次 / IP 每分钟 5 次)。
4. 表单定义 JSON(forms create/update)
{
"title": "活动报名",
"description": "副标题(可空)",
"fields": [
{ "key": "name", "type": "text", "label": "姓名", "required": true },
{ "key": "phone", "type": "phone", "label": "手机号", "required": true, "require_sms_verify": false },
{ "key": "level", "type": "select", "label": "级别", "required": false, "options": ["初级", "中级"] }
],
"primary_key": "phone"
}
type:text/phone/select(select 必须给options)。primary_key指向某个 field 的 key,用于查重(重复提交 → DUPLICATE_SUBMISSION)。require_sms_verify仅 phone 字段有效:开启后填写者要过短信验证码。
5. 关键业务规则(操作前必读)
- 海报必须绑渠道:
posters generate的--channel必填;表单需 published、渠道需 active,
否则 INVALID_STATE。填写链接/二维码为{域名}/f/{formId}?c={channelId},渠道归因走查询参数c。 - 背景三选一:
--background(上传图)优先;否则--ai-prompt用 LLM 图像服务生成
(服务端需配 LLM_BASE_URL/LLM_API_KEY,未配返回 AI_UNAVAILABLE;上游失败 AI_GENERATION_FAILED);
都不给则默认白底模板。AI 生成约 1-2 分钟,耐心等待。 --ai-mode(仅配合--ai-prompt):template(默认)= AI 出背景 + 系统模板排版,标题/二维码由系统合成,
文字最清晰、版式统一;ai_poster= AI 出整张成品海报(二维码位画品红占位块),系统色键探测后
把真实可扫二维码贴到该位置,设计更自由、效果最好,但 AI 渲染的中文偶尔不准(图像模型通病)。- 字段锁定:表单一旦有提交,
forms update改字段会被拒(FIELDS_LOCKED);只能改标题/描述。 - 渠道停用不可逆,已分发二维码仍可填写但新提交归为「未知渠道」。
- 提交数据含 PII(姓名/手机号):只在用户明确要求时导出,不要粘贴到公开场合。
- 错误格式统一
{"error":{"code","message"}},码表见docs/api/conventions.md。
6. 典型流程:从零发一个可扫码报名的表单
pdlctl forms create --file form.json # 得到 form_id(draft)
pdlctl forms publish <form_id>
pdlctl channels create --name "朋友圈" # 得到 channel_id(或复用已有)
pdlctl posters generate <form_id> --channel <channel_id>
pdlctl posters download <poster_id> -o 朋友圈海报.png # 发给用户传播
# 收表后:
pdlctl analytics get <form_id>
pdlctl submissions export <form_id> -o 报名数据.csv