Siri Shortcuts 始于之前的 Workflow。实话说,自己当时对 Workflow 的印象属于鸡肋,由于 iOS 系统的限制,很多功能做不到,也需要在 Widget 去启动。相比 JSBox 的直接明了,功能确实差了不少。而自己却连要用 JSBox 做什么都没想明白,更勿谈 Workflow 了。因此,尽管苹果收购了 Workflow,我也没有对这个应用抱有太多注意力——手机上能做到的所谓效率和自动化实在太有限了,在这上面刻意追求有些错了方向。同样的,还有 IFTTT 这样的应用,不过它的着重点和 Workflow 似乎不太一样,有许多 Applet 是完全不依赖本机的。(比如每个 Google Voice 用户都会尝试的保活 Applet)

今年的 WWDC 推出了 iOS 12,其中将原来的 Workflow 和 Siri 整合到了一起,作为一个新的系统功能叫做 Siri Shortcuts。当然,还是需要额外安装。我一直觉得,Siri 是个有些无用的东西。(当然了,所有的语音助手在这一点上都没什么根本区别,而 Siri 的语音合成还明显不如微软的 Cortana)今年 Google 在开发者大会上用语音助手自动点餐的 Demo 震撼了许多人。而苹果终于选择放下曾经的固执,朝着另一个方向,在 Siri 有根本性的突破之前,走一走 Amazon Echo 的路子,让用户自己定义自己的语音助手。

把 Siri 和 Workflow 结合起来,意味着你可以自定义语音指令,驱使手机去帮你做一些事情。这无关所谓真正的「智能」,不过这确实让它变得更加实用了。另外,Workflow 变成 Shortcuts 之后,显得更加官方化,有更多苹果生态下的 App 开发者主动为它提供了接口,这也使得它的功能边界更拓展了一些。

这里是个有趣的例子,我们想要检查一个人有没有发布新的微博。不想每次都点开,甚至像我这样把微博 App 删除了的人连特别关注都没得设置。我们想用 Siri 做到这一点。就以@带带大师兄为例吧。

新建一个叫做「孙狗微博」的 Shortcut,在里面随便设置一个喜欢的颜色和图案。

New Shortcut

点击进入编辑内容。首先我们需要一个信息源。Shortcuts 有 RSS 的组件,但微博并没有给我们提供官方的 RSS 接口。或者可以在自己的一台 VPS 上写一个脚本定时刷新内容然后暴露一个 API 出来,但这样也太麻烦了。Shortcuts 支持在给定页面上运行一段 JavaScript 代码并返回结果,这个不错。不过这里发现了更好的选择,即微博的 API。这个 API 是从网页调试工具里发现的,带带大师兄的微博内容在这里,以 JSON 格式呈现。

我们需要的字段主要有两个,一个是最新一条微博的发布时间,一条是最新一条微博的内容。方便的是,微博已经帮我们处理好了发布时间的可读性,近在 3 小时前发布的微博,结果会显示为 3 小时前而不是具体的时间。

JSON Format

好了,我们现在可以使用 Shortcuts 的 URL 组件,将字符串「转换」为 URL 对象。然后用「Get Contents of URL」获取内容,注意是 GET 方法。这个的结果就是这个 API 返回的字符串了。

URL Component

接下来需要获取指定位置的数据,在 data/cards/2/mblog 中。我们先将之前的字符串利用「Get Dictionary from Input」转换为 Dictionary,然后一步一步拿到数据。注意,这里的 List 索引是从 1 开始的。

Get Dictionary from Input

mblog 这里的时候,因为我们要用两次,所以先保存到一个变量中,用「Set Variable」,这个组件的输出就是变量的值。

Set Variable

于是乎就可以把时间先念出来了,用「Speak Text」。我手机的语言是英文,所以这里的「Language」不能为默认,而是要指定成中文,不然 Siri 会念不出来。如果系统语言是中文的话应该不存在这个问题。

Speak Text

接下来也一样,先取出之前保存下来的 mblog 的值,因为 JSON 里的原结果是 HTML,所以要先转换一下,不然 Siri 就会把标签符号一个一个念出来了。话说,这里还有富文本、HTML 和 Markdown 的相互转换工具,很有用。

https://i.e7s.me/4a510892-b64b-4e5c-a17a-41bacc500192.jpeg

最后我们在设置里指定一个语言指令,比如「孙狗发微博了吗」。

Text Command Content

看起来运行得不错。

Demo

自 iOS 12 正式版发布以来,有很多应用都专门加入了针对 Siri Shortcuts 的更新。在选择组件的界面,我们也可以看到有许多应用提供的接口,包括我手机并没有安装的 Ulysses 和 Drafts。结合应用的 x-callback-url,能做的事情可以很多,只要有足够的想象力。当然,像我们这里这样简单的流程,已经需要比较复杂的定义和操作。如果真的有更复杂的需求,还是用 JSBox 和 Pythonista 这样的应用好一些。不过,目前这两个应用还不支持从应用返回结果,只能执行特定脚本然后返回输入。希望未来他们能够做得更好。

最后,我把这个 Shortcut 放到了 iCloud 上