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

注意:本文只负责识别二维码,而不能验证用户信息,因此那些和账户关联的二维码,本文爱莫能助。

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

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

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

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

Alt text
在 Mac 上扫描二维码获取文件

Keyboard Maestro 版动作下载

动作使用

本文随后提供的代码是通用的,在不同自动化工具中的效果也大同小异,展示部分仅以 Keyboard Maestro 为例,不会重复展示各个自动化工具。

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

Alt text
ZBar 是一款开源二维码识别工具

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

brew install zbar

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

Alt text
通过 ZBar 识别二维码

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

  1. 按下快捷键 ‌⇧Shift-⌘Command-0,开始截屏;
  2. 选取屏幕任意位置的二维码,包括某些禁止复制的网页,毕竟截屏是系统级操作,无法被阻止;
  3. 稍等片刻,二维码内容即可被拷贝至剪贴板,同时 Keyboard Maestro 会以大号文字显示识别结果
Alt text
在 Mac 上扫描二维码获取文件

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

Alt text
识别结果的提示方式可以自行修改

原理简析

为方便在其他自动化工具中使用,我把核心操作写成了 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

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

  1. 截图,将屏幕上的二维码截取下来保存到桌面;
  2. 调用 ZBar 识别二维码,并从中去除提示信息等无用部分,只留下识别出来的内容;
  3. 将识别结果拷贝到剪贴板;
  4. 移除桌面上的截图图片

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

Keyboard Maestro 用户可以搭配 Palette 使用

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

Alt text
将截图相关的操作都放进同一个 Palette

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

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

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

小结

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

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注