# 如何在 macOS 上不掏出手机也能扫描二维码

> 本文公开全文。

原文：https://utgd.net/article/20140

强迫用户换设备才能完成的操作，都带着一丝冒犯，比如说：“扫描二维码，查看原文”。为什么我们分明端坐在电脑面前，却要掏出手机扫码呢？“脱裤子放屁”讲的就是这些无理要求。

麻烦其实只是表面原因，真正让人反感之处在于，滋生出这些二维码的网页默认我们是垃圾信息消费者，比如，默认我们在“刷公众号”——因为微信自带长按识别二维码的功能，不需要掏出第二台设备来扫码——但严肃的阅读往往不会在微信中进行，有追求的读者通常会使用 RSS 阅读器、稍后读服务甚至打印成 PDF 以便做批注，这时候遇上一个二维码，如鲠在喉。扫兴。

有人尝试过回击这些二维码，使用了一些在线解析服务，虽然保住了尊严、也避免了树木枯死，但经历一番截图、上传、复制识别结果再删掉图片的操作后，客观上恐怕还不如掏手机方便。扫码这种司空见惯的操作，就应该做成设备的一个自带功能，无需联网、打开即用，就像 iPhone 相机自带的二维码识别功能那样。

面对二维码的泛滥，我制作了一个 Keyboard Maestro 扫码动作，可以截图识别屏幕上的任何二维码，无需求助在线服务，更不用 频繁掏手机。本质是一段代码，下面仅提供 Keyboard Maestro 版，当然，复制粘贴一下您就可以获得 LaunchBar、Alfred、Automator 乃至 Shortcuts 版。

Keyboard Maestro 版动作下载

## 动作使用

本文各项动作均围绕二维码识别工具 ZBar 打造，这是一款开源的离线工具，在多个平台上被广泛使用，还有一个 iOS 客户端，在 iPhone 尚不支持原生扫码的时代还挺有名气；如今在手机上已经没必要安装 ZBar，但它在桌面端尤其是自动化领域还是老当益壮。

第一次安装可能有些麻烦，需要用到终端（Terminal），但以后就可以嵌入自动化工具、无需再折腾命令行界面。建议通过 HomeBrew 安装，方便日后统一管理。

```
brew install zbar
```

ZBar 的命令极其简单，需要了解的只有一句 zbarimg "图片路径"，该命令随后会返回二维码中的内容。

当然，本文不会让诸位使用命令行来识别二维码，那未免太敷衍了事，简直是把后厨的食品原料直接堆上桌。通过将 ZBar 命令融入自动化工具，即可实现从截图到获取二维码内容的整套流程。

- 按下快捷键 ‌⇧Shift\-⌘Command\-0，开始截屏；

- 选取屏幕任意位置的二维码，包括某些禁止复制的网页，毕竟截屏是系统级操作，无法被阻止；

- 稍等片刻，二维码内容即可被拷贝至剪贴板，同时 Keyboard Maestro 会以大号文字显示识别结果

最后一步显示识别结果是为避免恶意链接，某些网站在二维码中插入来者不善的内容，比方说，如果识别结果是一段 URL Scheme，那就应当小心，避免唤醒某些流氓软件。如果不习惯这种耿直的提醒方式，也可以在“Display Text Large”步骤中换成通知或者弹窗。

## 原理简析

为方便在其他自动化工具中使用，我把核心操作写成了 Shell 脚本，可以截屏扫码并拷贝识别结果到剪贴板。由于不涉及和自动化工具本身的交互，可以不做修改直接粘贴到 LaunchBar、Alfred 或 Automator 中运行。文章开头已提供多个版本的现成动作，熟悉 Shell 脚本的读者也可以自行修改下方代码，添加更多后续功能（比如识别到网址后自动打开该网页）。

```
PATH=$PATH:/usr/local/bin/
screencapture -i ~/qrimg.png
zbarimg "/Users/apple/qrimg.png" | sed -e 's/scanned.*//g' -e 's/QR-Code://g' | pbcopy
rm ~/qrimg.png
```

以上代码完整模拟了手动截图识别二维码的操作，大致流程如下：

- 截图，将屏幕上的二维码截取下来保存到桌面；

- 调用 ZBar 识别二维码，并从中去除提示信息等无用部分，只留下识别出来的内容；

- 将识别结果拷贝到剪贴板；

- 移除桌面上的截图图片

如果全程使用 Keyboard Maestro 自带模块完成以上操作，除了调用 ZBar 以外可以完全不用代码，不过既然已经有了通用的脚本，本文就不再提供只能用于 Keyboard Maestro 的动作。

## Keyboard Maestro 用户可以搭配 Palette 使用

本文动作的默认快捷键是 ‌⇧Shift\-⌘Command\-0，这组快捷键模仿了 macOS 自带截屏快捷键 ‌⇧Shift\-⌘Command\-4，前两位修饰键都一样，可以稍微降低一些记忆难度。而在 Keyboard Maestro，这一键位设计就不只是“稍微”给快捷键减压了——事实上，诸位可以把所有与“截屏”相关的操作都设成同一个键位，将相应动作塞进一个 Palette（调色盘）中。

Palette 是一组相关 Keyboard Maestro 的聚合，呈现为悬浮工具栏的样式。在本节的例子中，Palette 汇聚了拥有相同快捷键的动作，显示 Palette 后可以直接点选所需功能，也可以按下动作首字母的对应的键盘按键来触发它们（上图中颜色较亮的字母即可以按下的按键）。

识别二维码毕竟是偶然为之，如果单独为它设计一个键位，未免有点浪费，日后若是遇上截图 OCR 提取文字、截图翻译、截图以图搜图等一系列需求，很难想象如何为它们一一设置专用快捷键，即便勉强绑好了键位，用起来也像弹钢琴一样麻烦。使用 Palette 就能绕过“快捷键不够用”的问题，可以为日后的自动化预留空间。

Palette 种类多矣，用法更是丰富，需要深入了解的话可以参考前文《Keyboard Maestro Palette：macOS 上的全能工具箱》。

## 小结

越来越多的文章或网页奉行移动优先，这让手机已经成了互联网中名副其实的 单点（Single Point），一旦手机没电或不在身边，人好像就被去势了一样。我们没法改变潮流，只能清理已经冲到脚边的漂流垃圾。

---

[前往标准阅读页](https://utgd.net/article/20140?audience=web)
