Python键盘自动化:轻量级录制回放工具链
发布时间:2026/10/25 15:06:41 锦皓数字建站

简介这是一份面向编程爱好者与游戏开发初学者的开源趣味工具包基于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 Redistributable2015–2022macOS 用户需在“系统设置 → 隐私与安全性 → 辅助功能”中手动授权 Python 进程Linux 用户需确认xinput可用且当前用户属于input组。执行以下命令完成基础环境校验python -c import sys; print(fPython {sys.version[:5]}) pip install --upgrade pip pip install pynput keyboard pyyaml提示pynput负责跨平台键盘事件捕获与注入keyboard提供更细粒度的键码映射如区分CtrlShiftT与CtrlTpyyaml用于序列化动作配置。三者缺一不可且版本需匹配——实测pynput1.7.6、keyboard0.13.5、pyyaml6.0.1组合在 Win11/22H2、macOS 13.6、Ubuntu 22.04 LTS 上零兼容问题。2.2 录制一个真实可用的“猫咪代打”动作序列我们以「每日钉钉打卡」为例打开钉钉 → CtrlTab 切到工作台 → 按下 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不是ctrlenter不是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/booldefault值在未传参时生效。所有变量值均经yaml.safe_load()校验杜绝代码注入风险。3.2 条件分支让猫咪学会“看情况敲键”某些操作需依赖前置状态如“若当前窗口标题含‘钉钉’则执行打卡否则先 AltTab 切换”。.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 通过系统 APILinux 通过xdotool getwindowfocus getwindowname断言失败则跳过该分支。window_title_contains是唯一内置断言未来可通过插件扩展process_exists或file_exists。3.3 多平台键位自动映射一份动作三端通行同一操作在不同系统键位不同如 macOS 的CmdTab对应 Windows 的AltTab。项目内置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 现象回放时按键被吞掉或触发了错误快捷键原因系统全局快捷键如 WinD 显示桌面、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 sessionsudo 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 使用CreateDesktopAPImacOS 使用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/checkoutv4 - name: Setup Python uses: actions/setup-pythonv4 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 --sandboxutils/sign_action.pygit commit -S三步流程——不是为了炫技而是当某天凌晨三点收到“打卡失败”告警时我能立刻确认是钉钉改版了还是有人偷偷改了动作逻辑抑或我的本地环境证书过期了。这种确定性比任何“超萌”标签都实在。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。