原始内容
name: wb-buddy-checkin description: 自动完成 WorkBuddy 桌面客户端「Buddy 加油站」每日签到、领取积分。当用户需要在 Windows 上自动点击头像→Buddy加油站→立即领取,并通过截图灰度校验是否成功(灰底「今日已领」)时使用。基于纯 ctypes 实现窗口置前、坐标点击与窗口截图,零第三方 Python 依赖,仅依赖 Windows 系统 API(可选复用 desktop-control-win skill 的截图)。 agent_created: true
wb-buddy-checkin —— WorkBuddy 每日签到
在 Windows 上自动给 WorkBuddy 桌面客户端的「Buddy 加油站」签到领积分(每日 100 积分)。 脚本用相对坐标点击 + 截图灰度校验,无需 OCR,主题无关(亮/暗色都能正确判定)。
何时使用
- 用户说「自动签到」「每天领 WorkBuddy 积分」「Buddy 加油站签到」。
- 配置定时任务,让它在每天固定时间(如 9:00)自动跑。
- 注意:这是通用、可分享的实现,不包含任何个人身份、路径或通知目标;若要把结果推送给某人(微信/钉钉等),由调用方在 skill 之外自行配置。
前置条件
- Windows 系统(脚本依赖
ctypes.windll/user32/gdi32)。 - Python 3(标准库即可,无需
pip install任何包)。 - WorkBuddy 桌面客户端正在运行。
- 首次使用必须校准坐标(见
references/calibration.md),因为不同屏幕/布局下点击点不同。这步跳过是移植后"只会点头像"的头号原因。
⚠️ 移植给别人 / 第一次用:先做这件事
先跑一次校准,再 -run。脚本内置的坐标是作者屏幕的校准值,别人的屏幕八成对不上——头像在左下角还能蒙对,但加油站/领取位置一偏,后续点击全打空,看起来就像"只点了头像"。
校准有两种,推荐用弹窗校准(通用、傻瓜、零依赖):
# 弹窗校准(推荐):自动弹出一个悬浮窗,按提示把鼠标移到三个目标点,
# 每步倒计时结束自动记录,三步写 calibrate.json。无需终端/微信/任何外部通道。
python scripts/wb_mouse_checkin.py -calibrate-gui
无 GUI 环境(如某些精简 Python 没带 tkinter)时,退而用终端文字校准:
# 终端校准:把鼠标依次移到 头像 / Buddy加油站 / 立即领取 三个点,各按一次回车
python scripts/wb_mouse_checkin.py -calibrate
校准后直接:
python scripts/wb_mouse_checkin.py -run
没校准就
-run,脚本会红字警告"用的是示例默认坐标,大概率打空",并打印算出的三个屏幕坐标供你对照。
使用方法
脚本位于 scripts/wb_mouse_checkin.py,三种模式:
# 1) 干跑:打印窗口信息 + 计算好的点击坐标 + 校准状态告警,不点击
python scripts/wb_mouse_checkin.py
# 2) 真实签到(自动读取 calibrate.json;无则告警并退回示例坐标)
python scripts/wb_mouse_checkin.py -run
# 3) 弹窗校准(推荐):悬浮窗倒计时自动采样鼠标,三步写 calibrate.json
python scripts/wb_mouse_checkin.py -calibrate-gui
# 3b) 终端校准(无 GUI 时):鼠标移到三个目标点各按回车
python scripts/wb_mouse_checkin.py -calibrate
退出码:0=成功(已处于「今日已领」) / 2=失败(未领取或面板异常,报错会指明该校准哪个点) / 3=未找到 WorkBuddy 窗口。
结果截图保存在脚本同目录 checkin_result.png,可用于人工确认或后续通知。
关键实现要点(避免重踩坑)
- 所有 Win32 调用必须显式声明
argtypes,HWND按c_void_p(64 位指针)传。不声明会被 ctypes 默认按 32 位c_int截断,导致SetForegroundWindow静默失败——表现为「窗口没置顶、点击打空」。本脚本已统一声明。 - 可靠置前三步:最小化先
ShowWindow(SW_RESTORE)→AttachThreadInput线程绑定绕过系统前台锁 →SetWindowPos(HWND_TOP)置顶 z 序。 - 坐标用「相对客户区左下角」(x=距左, y=距底),窗口任意缩放都命中,校准一次永久复用。
- 校验用「近黑像素数」而非白字数:灰底「今日已领」按钮也含白字,不能靠白字判定;黑底「立即领取」有大量近黑像素(r,g,b<70),灰按钮近黑像素≈0。用此区分,主题无关。
- 截图优先 desktop-control-win 的
screen-info.ps1(若存在),否则回退PrintWindow客户区截图;PNG编解码全用标准库手写(支持所有 filter),无外部依赖。
配置定时任务(示例)
在 WorkBuddy 自动化里建一个每日任务,prompt 大致为:
运行
python scripts/wb_mouse_checkin.py -run(脚本内置窗口置前与灰度校验)。 读checkin_result.png确认结果:灰色「今日已领」=完成;黑底「立即领取」仍在=失败。 按你的通知偏好(微信/钉钉等)把结果发给本人。通知目标和通道由你自己的配置决定,本 skill 不内置任何推送。
cwd 设为该 skill 的 scripts/ 所在目录(或脚本实际位置)。
参考
- 坐标校准与常见问题:
references/calibration.md