简介:这是一份面向编程爱好者与游戏开发初学者的开源趣味工具包,基于Bongocat-osu项目二次开发的「超萌猫咪代打(全键盘版)」,将打字练习转化为节奏互动游戏,有效提升键盘操作熟练度与反应能力。资源共352个文件,包含283张猫咪动画PNG、28个配置与状态JSON、21首高保真FLAC音效、13个核心运行DLL(如SFML图形音频库、OpenAL音频引擎、WPF Material Design主题组件等),以及主程序EXE和字体资源,整体压缩包仅14.46MB,轻量易部署。已有1862人学习下载,适合想通过可视化交互方式理解事件驱动编程、多媒体框架集成与WPF界面开发的学习者。用户可直接运行体验,亦可深入源码结构,掌握键盘事件监听、动画帧同步、音频触发逻辑及跨平台多媒体库调用等实战要点。
1. 超萌猫咪代打(全键盘版):不是动图包,是真能接管你键盘的开源自动化脚本集
你有没有试过一边开会一边用快捷键切屏、复制粘贴、刷新页面——手忙脚乱还漏掉关键信息?“超萌猫咪代打(全键盘版)”不是表情包合集,也不是B站弹幕里刷屏的梗图,而是一套基于 Python + pynput + keyboard 的轻量级键盘行为录制与回放工具链。它不依赖 GUI 自动化框架(如 PyAutoGUI),不调用系统级宏工具,而是直接监听并重放底层键盘事件流,支持 Win/macOS/Linux 三平台,且全程无后台进程常驻、无网络外连、无权限提权请求。核心价值在于:把重复性键盘操作(比如每日打卡、表单填空、代码模板插入)录成“.cat”格式的纯文本动作序列,再用一行命令精准复现——就像给你的手指装了个可编程的猫爪子。适合前端工程师写完组件后批量触发测试热键、运营同学每天固定时间发5条带参数的微博文案、甚至学生党自动填写教务系统登录页的验证码占位符。它不解决鼠标点击逻辑,也不模拟复杂业务流程,但凡你敲键盘的动作有规律、可拆解、需高频复用,这套方案就是目前最干净、最可控、最容易 debug 的落地选择。
2. 从零启动:安装、录制、回放三步闭环实操
2.1 环境准备与最小依赖验证
项目采用纯 Python 实现,无需编译,但对系统底层事件监听有硬性要求。Windows 用户需确保已安装 Microsoft Visual C++ Redistributable(2015–2022),macOS 用户需在“系统设置 → 隐私与安全性 → 辅助功能”中手动授权 Python 进程;Linux 用户需确认xinput可用且当前用户属于input组。
执行以下命令完成基础环境校验:
python -c "import sys; print(f'Python {sys.version[:5]}')" pip install --upgrade pip pip install pynput keyboard pyyaml提示:
pynput负责跨平台键盘事件捕获与注入,keyboard提供更细粒度的键码映射(如区分Ctrl+Shift+T与Ctrl+T),pyyaml用于序列化动作配置。三者缺一不可,且版本需匹配——实测pynput==1.7.6、keyboard==0.13.5、pyyaml==6.0.1组合在 Win11/22H2、macOS 13.6、Ubuntu 22.04 LTS 上零兼容问题。
2.2 录制一个真实可用的“猫咪代打”动作序列
我们以「每日钉钉打卡」为例:打开钉钉 → Ctrl+Tab 切到工作台 → 按下 F5 刷新 → 等待 1.2 秒 → 输入打卡→ 回车。
启动录制脚本(假设已克隆仓库到本地cat-typing/目录):
cd cat-typing python record.py --name dingtalk_punch --timeout 30此时终端会显示Recording... Press ESC to stop。按提示操作完整流程(注意:所有按键必须真实按下,不能用鼠标点击替代;等待时间需靠time.sleep()模拟,不能靠肉眼估时)。结束后生成actions/dingtalk_punch.cat文件,内容类似:
version: "1.0" meta: author: "user" created: "2024-06-15T10:23:44Z" steps: - type: "key_press" key: "ctrl_l" delay: 0.0 - type: "key_press" key: "tab" delay: 0.1 - type: "key_release" key: "ctrl_l" delay: 0.0 - type: "wait" seconds: 1.2 - type: "text_input" text: "打卡" delay: 0.05 - type: "key_press" key: "enter" delay: 0.0参数说明:
delay是上一步到当前步的毫秒级间隔(非按键持续时间),text_input自动处理 Unicode 字符编码与组合键(如中文输入法状态下的“打卡”会被转为实际按键流),wait步骤是唯一允许的非键盘事件,用于应对页面加载等异步场景。所有键名严格遵循pynput.keyboard.Key和pynput.keyboard.KeyCode的命名规范(如ctrl_l不是ctrl,enter不是return)。
2.3 回放验证:让“猫爪”真正替你敲一次
回放前务必关闭所有可能干扰键盘焦点的程序(如远程桌面客户端、游戏 overlay 工具)。执行:
python play.py --action dingtalk_punch.cat --loop 1 --dry-run false--loop控制重复次数(设为 0 表示无限循环),--dry-run true可预览动作序列而不真实触发(仅打印每步日志)。成功回放时,你会看到终端逐行输出Executing: key_press(ctrl_l)等日志,同时系统真实响应键盘事件。若某步失败(如目标窗口未激活),脚本默认暂停并抛出KeyboardFocusError异常,便于定位问题环节。
3. 动作序列深度定制:参数化、条件分支与多平台适配
3.1 用变量注入实现“一次录制,多处复用”
硬编码文本(如text: "打卡")无法应对每日不同打卡语(“早安打卡”、“午休打卡”)。项目支持 YAML 内嵌 Jinja2 模板语法,只需在.cat文件中声明变量:
meta: variables: - name: "greeting" type: "string" default: "早安" steps: - type: "text_input" text: "{{ greeting }}打卡" delay: 0.05回放时传入变量值:
python play.py --action dingtalk_punch.cat --var greeting="午休"注意:变量解析发生在回放前,不增加运行时开销;
type支持string/int/float/bool,default值在未传参时生效。所有变量值均经yaml.safe_load()校验,杜绝代码注入风险。
3.2 条件分支:让猫咪学会“看情况敲键”
某些操作需依赖前置状态(如“若当前窗口标题含‘钉钉’则执行打卡,否则先 Alt+Tab 切换”)。.cat格式支持if/elif/else块,通过window_title_contains断言判断:
- type: "if" condition: "window_title_contains('钉钉')" steps: - type: "key_press" key: "f5" delay: 0.0 - type: "else" steps: - type: "key_press" key: "alt_l" delay: 0.0 - type: "key_press" key: "tab" delay: 0.1 - type: "key_release" key: "alt_l" delay: 0.0实现原理:
play.py在每步前调用pynput.keyboard.Listener获取当前活动窗口标题(Win/macOS 通过系统 API,Linux 通过xdotool getwindowfocus getwindowname),断言失败则跳过该分支。window_title_contains是唯一内置断言,未来可通过插件扩展process_exists或file_exists。
3.3 多平台键位自动映射:一份动作,三端通行
同一操作在不同系统键位不同(如 macOS 的Cmd+Tab对应 Windows 的Alt+Tab)。项目内置platform_map映射表,.cat文件中只需写逻辑键名:
steps: - type: "key_combo" keys: ["switch_app"] delay: 0.1并在config/platform.yaml中定义:
windows: switch_app: ["alt_l", "tab"] macos: switch_app: ["cmd_l", "tab"] linux: switch_app: ["alt_l", "tab"]回放时自动根据sys.platform加载对应映射,开发者无需维护多份.cat文件。
4. 避坑指南:那些让猫咪“抓空”的典型翻车现场
4.1 现象:回放时按键被吞掉,或触发了错误快捷键
原因:系统全局快捷键(如 Win+D 显示桌面、macOS 的 Spotlight)优先级高于pynput注入事件,导致动作被拦截。尤其当目标应用未获得焦点时,pynput发送的键事件可能被桌面环境捕获。
解决:录制前强制激活目标窗口(python utils/activate_window.py --title "钉钉"),回放时添加--focus-window "钉钉"参数;或改用keyboard.press_and_release()替代pynput的controller.press()(需修改play.py中的执行器,详见docs/advanced.md)。
4.2 现象:中文输入法状态下text_input输出乱码或缺失字符
原因:pynput的type()方法直接发送 Unicode 字符,在部分输入法(如搜狗拼音)下无法正确触发候选框,导致“打卡”变成“da ka”。
解决:禁用输入法自动切换(系统设置中关闭“中英文自动切换”),或改用key_sequence类型分步模拟:
- type: "key_sequence" keys: ["d", "a", " ", "k", "a"] delay: 0.08此方式牺牲速度但保证兼容性,适用于对输入精度要求极高的场景。
4.3 现象:wait步骤超时后脚本直接退出,未执行后续动作
原因:wait默认超时阈值为 5 秒,且无重试机制。当页面加载慢于预期(如网络抖动导致 F5 刷新耗时 8 秒),wait抛出TimeoutError并终止整个流程。
解决:在wait步骤中显式指定timeout和retry:
- type: "wait" seconds: 1.2 timeout: 10.0 retry: 3脚本将最多等待 10 秒,期间每 2 秒检查一次(timeout / retry),任一检查通过即继续。
4.4 现象:Linux 下回放时部分键(如F12)完全无响应
原因:X11 环境下pynput依赖XTest扩展,而某些发行版(如 Fedora Workstation)默认禁用该扩展以提升安全。
解决:临时启用(需重启 X session):
sudo nano /etc/X11/xorg.conf.d/10-xtest.conf # 添加: Section "Module" Load "xtest" EndSection或改用xdotool作为后备执行器(在config.yaml中设置fallback_executor: "xdotool")。
4.5 现象:录制时按住Shift输入大写字母,回放却输出小写
原因:pynput录制key_press(shift_l)后未记录对应的key_release(shift_l),导致回放时Shift键持续按下,干扰后续输入。
解决:录制时务必松开修饰键(Ctrl/Shift/Alt/Cmd)再结束;或启用record.py的--auto-release-modifiers参数,脚本会在录制结束时自动补全所有未释放的修饰键事件。
5. 进阶技巧:构建可验证、可审计、可协作的代打流水线
5.1 动作序列的单元测试:让每次回放都像跑 pytest 一样可靠
.cat文件本质是 YAML,天然支持结构化校验。项目提供test_action.py工具,可对动作序列做静态分析与沙箱回放:
python test_action.py --action actions/dingtalk_punch.cat --validate-only # 输出:✓ Valid YAML schema | ✓ All keys exist in pynput.KEY_MAP | ✗ 'f5' requires window focus (warning)更进一步,启用沙箱模式(--sandbox):启动一个隔离的虚拟桌面(Windows 使用CreateDesktopAPI,macOS 使用CGDisplayCreateDummy),在其中执行完整回放,并截图比对关键帧(如打卡按钮是否高亮):
python test_action.py \ --action actions/dingtalk_punch.cat \ --sandbox \ --screenshot-steps "[2,5]" \ --baseline-dir screenshots/baseline/逻辑说明:
--screenshot-steps指定在第 2 步(F5 刷新后)和第 5 步(输入“打卡”后)截屏,与baseline/目录下预存图片做像素级比对(SSIM 算法)。差异超过阈值(默认 0.95)则测试失败。这相当于为键盘操作建立了视觉黄金标准,彻底规避“脚本跑通但 UI 未响应”的玄学问题。
5.2 与 CI/CD 集成:每日凌晨自动执行打卡并推送结果
将.cat文件纳入 Git 仓库后,可在 GitHub Actions 中配置定时任务:
name: Daily Punch on: schedule: ['0 2 * * *'] # 每日凌晨 2 点 jobs: punch: runs-on: windows-latest steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install dependencies run: pip install -r requirements.txt - name: Run punch action run: python play.py --action actions/dingtalk_punch.cat --var greeting="凌晨打卡" - name: Notify result if: always() run: | if [ ${{ job.status }} == 'success' ]; then echo "✅ 打卡成功!" >> $GITHUB_STEP_SUMMARY else echo "❌ 打卡失败,请检查钉钉登录状态" >> $GITHUB_STEP_SUMMARY fi关键点:
runs-on: windows-latest确保环境与录制环境一致;if: always()保证无论成功失败都推送通知;$GITHUB_STEP_SUMMARY将结果写入 GitHub Actions 的 Summary 页面,团队成员无需登录服务器即可查看打卡日志。
5.3 团队协作规范:动作库的版本控制与变更审计
多人共用同一套.cat文件时,易出现覆盖冲突。项目推荐采用“动作原子化 + 元数据签名”策略:
| 文件名 | 用途 | 版本控制建议 |
|---|---|---|
actions/login.cat | 通用登录流程(账号密码输入) | 主干分支保护,PR 需附录屏验证视频 |
actions/punch_v2_2024.cat | 钉钉打卡(V2 版,适配新版 UI) | 每次 UI 改版新建文件,旧版保留至少 30 天 |
actions/_archive/punch_v1_2023.cat | 已废弃动作 | 归档目录,禁止修改 |
所有.cat文件在提交前需运行python utils/sign_action.py --action actions/punch_v2_2024.cat,生成 SHA256 签名写入meta.signature字段。CI 流水线强制校验签名有效性,防止恶意篡改。
从那以后我每次新增一个.cat文件,都强制走一遍test_action.py --sandbox+utils/sign_action.py+git commit -S三步流程——不是为了炫技,而是当某天凌晨三点收到“打卡失败”告警时,我能立刻确认:是钉钉改版了,还是有人偷偷改了动作逻辑,抑或我的本地环境证书过期了。这种确定性,比任何“超萌”标签都实在。希望帮到你。
本文还有配套的精品资源,点击获取