WorkBuddy 加油站自动领取 · 一键安装器
概述
本技能是一个安装编排器:它把「WorkBuddy 加油站每日积分自动领取」整套能力封装为
可供他人一键部署的包。技能源文件已内置在 payload/ 目录,无需联网下载。
当用户说"帮我安装"(或等价表述)时,自动完成以下全流程:
- 安全预检(对
payload/内的脚本做危险模式扫描)。 - 安装技能文件到
~/.workbuddy/skills/wb-gas-station-claim/。 - 初始化:建隔离 venv 并安装
uiautomation(首次--dry-run会自举完成)。 - 创建(或更新)每天 07:00 的自动化任务。
- 自动执行 dry-run 测试,验证 UI 自动化链路正常,并汇报结果。
整个过程无需用户逐步操作,结束后给出明确成功/失败结论。
触发条件
- 用户说"帮我安装""安装加油站""部署积分自动领取""install gas station claimer"等。
- 本技能只做安装与验证,不负责每日实际领取(那由已安装的
wb-gas-station-claim技能 + 每日 07:00 自动化完成)。
安装流程(严格按顺序执行)
第 0 步:定位本技能目录
先确定本技能根目录 SKILL_ROOT:它等于包含本 SKILL.md 的目录;其下 payload/
即待安装源。若不确定,用 Glob 查找 **/wb-gas-station-installer/payload/wb_gas_claim.py
定位。后续所有命令均使用 SKILL_ROOT 与 ~/.workbuddy/... 的绝对路径,
不要用 cd 切换目录(见下方"坑位")。
第 1 步:解析 Python 解释器(关键,跨用户可移植)
不同机器的受管 Python 路径不同。用以下片段解析,结果记为 RESOLVED_PYTHON:
"RESOLVED_PYTHON" - <<'PY'
import glob, os, shutil, subprocess, sys
cands = []
for c in ["python", "python3"]:
p = shutil.which(c)
if p:
cands.append(p)
cands += glob.glob(os.path.expanduser(r"~/.workbuddy/binaries/python/versions/*/python.exe"))
cands += glob.glob(r"C:/Users/*/.workbuddy/binaries/python/versions/*/python.exe")
if cands:
print("PYTHON=" + cands[0])
else:
print("PYTHON=None")
PY
若输出 PYTHON=None,明确告知用户:本机未找到可用的 Python,安装无法进行,
并终止流程(不要自行编造路径)。
第 2 步:安全预检(belt-and-suspenders)
对 payload/wb_gas_claim.py 做一次性危险模式扫描,确认与出厂审查一致
(预期:P2 安全,无 eval/exec/socket/os.system/shell=True/urllib 外传):
"RESOLVED_PYTHON" - <<'PY'
import re, os
p = os.path.join(r"SKILL_ROOT", "payload", "wb_gas_claim.py")
src = open(p, encoding="utf-8").read()
bad = ["eval(", "exec(", "socket.", "os.system", "shell=True", "urllib", "__import__("]
hits = [b for b in bad if b in src]
print("DANGEROUS_HITS=" + (",".join(hits) if hits else "NONE"))
PY
DANGEROUS_HITS=NONE→ 继续。- 出现命中 → 暂停并提示用户,不要继续安装。
第 3 步:安装技能文件
把 payload/ 下的 4 个源文件复制到用户级技能目录
~/.workbuddy/skills/wb-gas-station-claim/(覆盖式,幂等;不要复制 venv,
venv 由下一步重建):
"RESOLVED_PYTHON" - <<'PY'
import os, shutil
src = os.path.join(r"SKILL_ROOT", "payload")
dst = os.path.expanduser(r"~/.workbuddy/skills/wb-gas-station-claim")
os.makedirs(dst, exist_ok=True)
for f in ["SKILL.md", "config.yaml", "wb_gas_claim.py", "发布说明.md"]:
s = os.path.join(src, f)
if os.path.exists(s):
shutil.copy2(s, os.path.join(dst, f))
print("installed:", f)
else:
print("MISSING:", f)
print("done")
PY
第 4 步:初始化 venv(自举)
直接以绝对路径运行一次 --dry-run。脚本内部会在首次运行时用
subprocess(无 shell)建好 .venv_claim 并 pip install uiautomation,
随后读取 WorkBuddy 无障碍树验证面板与按钮——不点击、不消耗积分:
"RESOLVED_PYTHON" "SKILL_ROOT/payload/wb_gas_claim.py" --dry-run
> 注意:此处直接用 RESOLVED_PYTHON 跑 payload 里的脚本即可完成初始化与验证。
> 真正每日运行时由 .venv_claim 内的 python 执行(见第 5 步命令)。
捕获输出,确认退出码为 0,且日志中出现加油站面板与"领取按钮"检测成功。
第 5 步:创建/更新每日 07:00 自动化
先去重:调用 automation_update(mode=list)检查是否已存在同名任务
(名称见下)。若存在则 mode=update 复用其 id;否则 mode=create。
新建任务参数:
name:WorkBuddy加油站每日积分自动领取scheduleType:recurringrrule:FREQ=DAILY;BYHOUR=7;BYMINUTE=0(每天仅触发一次,非循环/常驻)status:ACTIVEcwds:~/.workbuddy/skills/wb-gas-station-claimprompt(用RESOLVED_PYTHON与技能目录绝对路径填充<PY>与<SKILL_DIR>):
执行以下命令领取 WorkBuddy 加油站每日积分,并把脚本最后一行以 RESULT: 开头的内容直接报告给我:
if [ -x "<SKILL_DIR>/.venv_claim/Scripts/python.exe" ]; then "<SKILL_DIR>/.venv_claim/Scripts/python.exe" -u "<SKILL_DIR>/wb_gas_claim.py"; else "<PY>" "<SKILL_DIR>/wb_gas_claim.py"; fi
注意(严格遵循,避免无谓消耗 TOKEN):
1. 脚本已内置全部检测/刷新/领取/验证与一次内部重试,正常情况下拿到 RESULT 行即可直接报告结束,不要做任何额外步骤(不要预检、不要读日志、不要重复跑)。
2. 仅当第一次运行返回的 RESULT 为 FAIL 或 ENV_ERROR 时,才独立再跑一次上面的脚本作为兜底;严禁用 || / && 把重跑串进同一条命令(会并发打架)。
3. 第二次仍 FAIL/ENV_ERROR 则直接报告失败原因并结束,不要再重试。
4. 若返回 OK | CLAIMED 或 OK | ALREADY_CLAIMED 即视为当日成功,直接报告。
第 6 步:自动测试(验证功能正常运行)
再次执行 dry-run,作为安装后的功能验证:
"RESOLVED_PYTHON" "SKILL_ROOT/payload/wb_gas_claim.py" --dry-run
判定标准:
- 退出码 0,且日志命中加油站面板(如「Buddy加油站·N期」)与"领取按钮=有" → 测试通过。
- 否则 → 测试失败,汇报失败原因与最后若干行日志,请用户排查(常见:WorkBuddy
桌面端未运行/未登录、无障碍权限未授予)。
第 7 步:汇报
向用户输出结构化简报:
- 技能安装位置与文件清单;
- venv /
uiautomation是否已就位; - 自动化任务 id、下次运行时间(应为最近的 07:00);
- 测试结果(通过/失败)与关键日志证据;
- 提示:每日 07:00 自动领取;若想立即真实领取一次,可另说"现在领取",
届时直接运行不带--dry-run的同款命令即可(会真实点击"立即领取")。
⚠️ 坑位(务必遵守)
- 禁止
cd后接&&。部分 Windows Git-bash 沙箱中cd内建异常
(cd: null directory),会导致整条命令在cd处短路失败。
→ 一律用绝对路径直接执行;需要切换目录时用 Python 的os.chdir+subprocess,
不要用 shellcd。 - 脚本用
__file__定位自身,不依赖 cwd;因此在任何目录下用绝对路径调用都安全。 - 绝对路径里的反斜杠:在 Python 片段中用原始字符串
r"..."或正斜杠;
在 Shell/automation prompt 中用正斜杠或双反斜杠。 - TOKEN 控制:每日任务脚本自带上限(1 次内部重试 + 至多 1 次 agent 兜底)。
prompt 已硬性禁止无限重试与||串联重跑,避免无谓消耗。 - 运行前提:每日 07:00 时 WorkBuddy 桌面端需运行且已登录;若未运行,脚本会尝试
自启,失败则报ENV_ERROR并于次日再试(不会重复扣积分)。
安全说明
payload/ 内脚本仅对本人 WorkBuddy 桌面客户端做 UI 自动化点击"立即领取":
无网络请求、无凭据收集、无文件破坏、无持久化/后门;唯一外部动作是首次运行建 venv
并安装 PyPI 已知包 uiautomation,以及只读进程探测。出厂安全评级 P2(安全)。
卸载(备用)
- 删除
~/.workbuddy/skills/wb-gas-station-claim/目录; - 调用
automation_update(mode=delete)删除每日自动化任务。