article_image

编注:留学期间短暂回国的朋友,或者从事跨境电商的读者,或者单纯是喜欢折腾的玩家,都可能需要接收境外服务商的短信。

不过,毕竟是跨境服务,外来的商人可不比游方的和尚,在境内别说像御三家那样大摇大摆,就连及时推送验证码都很勉强(暂就可怜的 iOS 而言)。

我读书时在几个周边国家和地区参加公益活动,回国后因为收发不便,电话卡就随之废弃(其实有安全隐患,好在本就是几周到数月的临时卡)。

最近偶然看到 Se7en 晒出的验证码转发方案。Se7en 平时低调,不过本站的老读者可能还记得他,没错,此君正是《用 Shortcuts 远程调用 Downie 下载视频》《用 Hazel 自动优化漫画文件的显示效果(macOS)》等深度文章的作者,此次的转发方案也与《用 Shortcuts 远程调用 Downie 下载视频》一文遥相呼应,延续将 Mac 电脑作为服务器的思路,熟练组合 AppleScript、Keyboard Maestro 和 Shortcuts(快捷指令)等自动化工具,一步一步疏通讯息渠道。

总之,无论是苦于验证码转发的读者,还是对于“Mac 服务器化”感兴趣的朋友,都推荐阅读本文。

在注册部分网站时,我使用了 Google Voice 的电话号码,Google 会通过 Google Voice.app电子邮件这两种方式向用户转发网站下发的验证码短信。

但是这两种方式都存在不便之处:

  • iOS 平台的 Google Voice.app 无法及时推送。
  • iOS 原生 Mail.app 无法及时推送,且邮件预览会优先显示邮件主题,例如「New text message from 100651」,导致预览行数不够,看不到正文中的验证码。
  • Outlook 等第三方邮件客户端推送比较及时,但预览行数同样不够。

原本想通过 Keyboard Maestro 抓取 Mail.app 的活动来触发 Macro, 可直到最新的 Keyboard Maestro 11 版本,依然没有 Mail 相关的 Trigger。

经摸索发现,macOS 平台的 Mail.app 可以通过「邮件规则」运行 AppleScript, 经由 AppleScript 调用 Keyboard Maestro 将邮件正文中的验证码等信息通过 iMessage 转发给自己,触发 iOS 或 macOS 的自动填充功能以自动输入验证码。若万一未能触发自动填充,也可使用 Shortcuts Automaton 和 Keyboard Maestro 将短信中的验证码提取后,复制至系统剪贴板供手动粘贴。

此自动化流程由四个部分组成:

  1. 在 macOS 平台的 Mail.app 定义「邮件规则」,通过特定发件人、关键字等方式触发运行预先制作好的 AppleScript 脚本。
  2. 在 AppleScript 内获取邮件正文内容(也就是验证码短信内容),作为参数传输给 Keyboard Maestro 中预先制作好的 Macro。
  3. Macro 将完整的邮件正文内容通过 iMessage 发送给自己,同时提取其中的验证码,复制至系统剪贴板,以应对可能出现的无法自动填充的情况。
  4. iOS 系统通过 Shortcuts Automation 快捷指令自动化提取 iMessage 中的验证码,复制至系统剪贴板。

AppleScript 脚本下载 Keyboard Maestro Macro 下载 Shortcuts 快捷指令下载

iMessage 信息会通过 iCloud 在 macOS 和 iOS 设备间同步,因此有一定几率会出现,macOS 作为发送方转发给 iOS 的 iMessage 信息,在同步给 iOS 设备之后,iOS 设备将自己当作信息发送方,而不是接收方,从而无法自动填充验证码、运行快捷指令自动化。为避免上述情况的发生,在正式配置自动化流程之前,需要对 iMessage 和通讯录进行一些设置。

在 macOS 平台 Messages.app 的偏好设置中,仅保留一个邮箱作为收信、发信的方式,本文中我选择了 @me.com 的邮箱。 在 iOS 平台系统设置内的信息设置中,「发送与接收」选项,仅保留手机号作为收信、发信的方式,本文中我选择了 186 号段的手机号。

Alt text
iMessage_Settings

在通讯录中新建 2 个联系人,分别命名为 「张三 @me.com」 和 「张三 mobile」,将上文中的邮箱和手机号对应填入这 2 个联系人。同时确保上文中的邮箱和手机号未重复出现在通讯录其他联系人条目中。

Alt text
New_Contacts

上述设置操作完成后,即可正式开始配置此自动化流程。

在 Mail.app 的偏好设置中,添加一条新规则,命名为「Google_Voice_AS」,将触发条件设置为关键字「验证码」。执行的操作则是运行名称同样为「Google_Voice_AS」的 AppleScript 脚本。

注意此处需要提前将上文提供的 AppleScript 脚本移动到 ~/Library/Application Scripts/com.apple.mail 文件夹中。

Alt text
Mail_Rules

打开 AppleScript 脚本可以看到,第二行代码最后的绿色字符 Google_Voice_AS 指代的是 Mail.app 中的邮件规则名称。

代码 do script "Verification Code from Mail" with parameter msgContent 中的 Verification Code from Mail 则是 Keyboard Maestro 中 Macro 的名称。with parameter msgContent 表示将变量 msgContent(邮件正文内容)作为参数传递给 Keyboard Maestro Macro。

Alt text
AppleScript

在 Keyboard Maestro 中,通过 AppleScript 传递给 Macro 的参数,默认变量名称为 %TriggerValue%,为了方便记忆以及后续调用,第一步操作就是将其赋值给名为 messageContent 的变量。

通过 Keyboard Maestro 的 iMessage 模块,将邮件正文内容发送给自己,注意此处选择的信息接收方,是「张三 mobile」。

通过正则表达式提取其中的数字验证码,复制至系统剪贴板,若无法自动填充,还可以手动粘贴。可以看到,用于匹配的正则表达式为[0-9]{6}|[0-9]{5}|[0-9]{4}, 其意义在于,先匹配 6 位连续的阿拉伯数字,若匹配不成功,再匹配 5 位数字,最后再匹配 4 位数字。考虑到不同网站的验证码长度不同,这样能提高匹配的成功率。

Alt text
KM_Macro

在 iOS 的 Shortcuts 快捷指令中新建自动化,触发条件选择「信息」,「发件人」选择「张三 @me.com」,「信息包含」设置为关键字「验证码」,运行方式勾选「立即运行」。点击下一步之后,选择上文提供的 Shortcuts 快捷指令。

Alt text
Shortcuts_Automation

将上述流程设置好之后,需要做的就是在 macOS 平台打开 Mail.app 并保持运行。经实测,转发验证码的整个过程耗时 15 秒左右,延迟处于尚可接受的水平。

Alt text
Final_Result