自动化数字生活:收藏网页 - iPhone

借助已有的 HTTP API,如何在 iPhone 上最方便地收藏网页?

ITTO

最近看 PMP,其核心内容都是以 ITTO 的形式来展现的。用这种思维去看问题,确实能够得到比较清晰的架构。

Inputs

在前面第一部分的介绍中,我们提到了「书签托管」,并选择了 Pinboard 作为示例。我们还提到了书签托管服务提供的 API,以及我们自己根据这些 API 自己写了一个「预处理程序」。这些就是今天的输入部分。

Tools 与 Techniques

工具和技术可以合起来讲。iPhone 上,我准备主要通过 Workflow 来完成这些自动化的过程。你也可以用 Pin,也可以用别的,虽然 iOS 系统限制让自动化工具们显得是在「带着枷锁跳舞」,但……不妨碍跳舞。

Outputs

既然是最方便地收藏书签,那输出部分肯定包括一系列自动化收藏网页的解决方案,另外会有一些「组织过程资产」留下来,包括熟悉使用 Workflow 这个东西,熟悉 iOS 的一些使用上的机理,熟悉 HTTP 通信的过程,当然还包括这个文章——虽然我一直拖着没写,一拖就是好几年。

认识 Workflow

今天的主角名叫 Workflow,这玩意儿我以前写过文章介绍的,那时候想写个系列,后来因为忽然买了新的 Android 手机,iOS 成了备用,就不了了之了。

Workflow 本来是个独立应用,卖 18 块钱,也不贵。后来苹果把它收了,作为系统应用免费提供,改名称为「Shortcuts」,中文叫「捷径」。现在可能从 iOS 12 开始,它的名字改成了「快捷指令」,倒是更加地道了。

目前的 Workflow 已经可以跟 Siri 联动,由于很多开发者都在适配 Siri,所以 Workflow 的可玩性也变强了很多。

前面已经给了链接,iOS 的话直接点开就可以安装。也可以在 App Store 中搜索「捷径」或者「Shortcuts」来安装,装好后桌面图标是「快捷指令」。emm…

建立快捷指令

点击主界面右上角的加号,新建一个快捷指令。这时候可以在底下看到许多「操作」了。这里有个 trick,你必须 点一下搜索栏,才能看到完整的操作列表。

借此可以操作系统应用比如 App Store、日历、通讯录、照片,可以操作设备信息比如位置、步数,也可以操作文本、网页,还可以操作适配的第三方应用。此外,在「脚本」中还藏着非常丰富的基础操作,给快捷指令设计提供了非常多的可能性。

网络请求

收藏网页整个快捷指令的主体是网络请求。

接口

在之前文章中,我们学着 Pinboard API 设计了一个纯 GET 的接口,然而这并不是最佳实践。我这里用一个 POST 类型的接口,简单做了个示例:

http://demo.pin.o2as.com/bookmark

POST 的消息体包括两部分:

  • auth 验证
  • url 收藏的网址

以 JSON 的形式返回,也是两部分:

  • message Pinboard 传回的结果
  • title 解析出来的标题

操作

先来添加一个「URL」操作:

在 URL 操作的介绍页面中,可以看到这个操作的效果非常简单:传递 URL 给下一个操作,别无其他。

依据前面给出的 API,在 URL 操作的输入框中填入:

http://demo.pin.o2as.com/bookmark

之后要开始联网访问这个 URL,使用的操作叫「获取 URL 内容」;事实上,相关的操作都可以在「网页」下面找到。

在「获取 URL 内容」这个操作中点开「高级」菜单,方法选择「POST」,头部不需要配置,请求体添加两项「文本」,分别是 authurl,尝试点击顶部的三角形执行按钮。得到如下的返回:

{"message":"Pinboard: success","title":"SanKo Blog"}

也就是说,书签成功收藏(这个示例程序中永远是成功的),标题解析出来是「SanKo Blog」。

一千个入口

前面提到,要「最方便」地收藏网页,那自然需要「随手收藏」的效果。我这边介绍其中几种触发方式和网址来源。

剪贴板

使用「获取剪贴板」这个操作,可以直接得到剪贴板内容。

这样,当我们在剪贴板里复制了一个网址之后,就可以启动快捷指令来收藏了。

Siri

配合 Siri,我们可以用「说话」的方式收藏网址。

无论如何,这都是一种很酷的触发方式,在快捷指令的设计中能有不错的效果。

小组件

这里说的小组件指的是——下拉菜单,左边滑动。如果没有「快捷指令」,那么先要拖动到底部「编辑」把快捷指令勾上。

好处是可以从任意应用界面进入,比如要保存个微信公众号的时候就很方便。

共享表单

进一步选择时,选中前面「触发方式」图中的四项即可。

共享表单是从应用的「分享」功能启动的系统分享。如果没有看到「快捷指令」,那么应该先在「更多」中把它勾上。

主屏幕

选择「添加到主屏幕」后,会弹出 Safari 并在页面中给出操作提示。

添加到主屏幕后,就可以通过点击桌面图标来触发。

应用自身

当然,最终必然可以的方式是通过「快捷指令」这个应用。

打开应用,点击相应的快捷指令,就可以直接执行了。

入口的编写

逻辑

先来想想应该怎么处理这么多的数据来源。网址的来源主要是两部分:

  • 分享
  • 剪贴板

其他几个触发方式都是使用了剪贴板的数据。所以入口的逻辑分成两部分:

  1. 判断是否有数据通过分享接口传进来
  2. 如果没有,那么使用剪贴板中的数据

无论采用哪种方式,最终我们都需要拿到一个变量,其中保存了需要收藏的网址。

操作

  1. 「计数」操作可以读取传入数据的数量,需要计数的单位是「项目」。如果是通过「分享」菜单触发的,那么这里的项目数肯定大于零
  2. 「如果」操作可以用来根据传入条件是否符合要求而进行不同的操作,这里我们把前面「计数」操作的结果传过来,判断是否大于零
  3. 如果大于零,显然就是从「分享」菜单过来的,那就把分享过来的文本保存下来,「获取变量」和「设定变量」两个操作连用可以实现变量的赋值
  4. 如果小于零,那就要取剪贴板的文本,同样把剪贴板的内容通过「设定变量」保存到同名变量中,方便下面调用

出口数据处理

依照前面的变量命名,「获取 URL 内容」中发送给服务器的 url 参数改成 Input 变量。

结果数据:

{"message":"Pinboard: success","title":"SanKo Blog"}

处理 JSON 数据可以用「脚本」中的词典值相关操作。这里读取数据,使用「获取词典值」的操作。

主要的任务,是把 messagetitle 信息提取出来,以系统通知的形式显示。

  1. 设置 url 为变量值
  2. 把「获取 URL 内容」的结果保存到「回复」这个变量中,以便后面使用;魔法变量固然好用,但是用多了容易乱,我还是喜欢对每个值进行定义
  3. 读取 JSON 中 message 字段的值并保存到「结果」这个变量中
  4. 获取一下前面保存的「回复」内容,传入「获取词典值」,继续读取 JSON 中的 title 并存为「标题」
  5. 显示一个通知,提示收藏书签的「结果」以及网址解析的「标题」

效果演示

好,终于到 show time!

Safari 浏览器

先来看浏览器分享的方式:

主屏幕图标

我把网址复制到了剪贴板中,然后点击主屏幕图标:

通知栏小组件

接下来试试小组件保存微信公众号文章:

小组件也可以直接在主界面向左滑动一屏(负一屏)进入。

应用内分享

其实都怪微信没做系统分享,像知乎就可以直接调用,而不需要通过剪贴板:

系统搜索

在系统搜索栏中,直接搜索「收藏」(名字取决于你把收藏书签的这个快捷指令命名成了什么)就会提示「运行收藏」,点击后也可以直接执行:

Siri

最后,来秀一把 Siri ——当然链接是需要提前复制好的:

iPad 上的快捷指令

得益于 iCloud,在 iPhone 上编写的快捷指令会自动传送到 iPad 上,并且可以直接在 iPad 上运行。

下图中,我用 iPad 在 App Store 保存了一个应用。

系统中涉及到链接的地方都可以通过分享菜单进行收藏。

不这样做呢?

稍微提一下其他解决方案。

抛开 URL 请求

其实快捷指令本身就有 Pinboard 相关的操作,其中一个就是「添加到 Pinboard」,所以我们也不一定非要自己去执行 URL 请求。

这个操作需要预先登录,所以就不需要在使用时每次都输入自己的账号;但是它需要指定标题,如果不指定,那么会用 URL 直接作为标题保存。

它没有返回值,无论成功与否,都只是把传入的 URL 原样输出传递下去。它默认覆盖并且不能修改,也就是说,如果保存同一个链接,它会把旧的直接覆盖掉。它也不能自动获取标题,因此它可能不算是保存书签的好方式。

抛开预处理程序

搭建预处理程序对许多人来说还是略有门槛,因为得自己有个服务器,得稍微懂点脚本编码,还得花时间去写这样一个脚本出来。

要想抛开预处理程序,也是可以的,就是把预处理程序中的内容全部移植到快捷指令中来进行:

  1. 修饰得到的 URL
  2. 访问 URL 来获取标题
  3. 对得到的标题进行修饰
  4. 借助 Pinboard API 添加收藏

这其中还涉及 iOS 分享中的许多类型,对每一种类型都需要分别处理。有些分享还会同时传出多个类型的数据,对这些内容就需要开循环一一处理。比如知乎的分享会同时传出两项内容,一项是文本格式,包含了标题,另一项是 URL 格式,包含的就是地址。

而前面 iPad 演示的 App Store 分享则更加复杂一点,除了应用名和链接地址,还包含了一个图像数据,也就是应用图标。Google Chrome 则纯粹只给出了一个 URL 地址。

澎湃新闻也是传出三项内容,但是它传出的文本内容是:

我在澎湃新闻看到一篇有意思的文章,推荐你看一下。
这是廖昌永第二次以全国人大代表身份参加全国两会。今年,他的发言和建议也继续围绕两件事:如何提供更优质的文化产品,以及如何推动传统文化更好走出去。

而这篇报道的标题却是:

专访|廖昌永:做院长不会影响艺术创作,愿意尝试更多可能性

所以大部分情况下,获取网页标题还是得靠自己。但是其实获取标题也没那么复杂,在快捷指令的变量中有个很有趣的小技巧:

也就是说,只要把一个 URL 变量以「PDF」的形式显示,并指定获取它的「名称」,那么这个变量最终会自动去获取网页或者文章标题的。——别问我怎么知道的,最简洁的方法背后都是辛酸的努力 = =

这时候你就会发现,直接使用快捷指令自带的 Pinboard 操作勉强也可以用了。更有一些追求的话,可以使用「获取 URL 内容」操作直接调用 Pinboard API,这样更灵活,也更准确。再有一些追求的话,使用「替换文本」操作修饰一下 URL 和标题,就显得很优雅了。

抛开 Workflow

在 App Store 中有不少多年不更新但是依然好用的 Pinboard 第三方应用,不少还收费挺贵,如果喜欢,你可以多试试。

它们基本上也都支持常见的一些收藏书签的方式,比如共享菜单、小组件。作为一个独立应用,它们还提供一些阅读和修改的界面。也有坑,我曾经用过的一款应用,在同步时存在问题,把我不少书签都删除了。

要是想读想修改,m.pinboard.in 绰绰有余。