查快递,还是显示结果?

想必大家对快递已经十分熟悉了,而长期看少数派的朋友对 Workflow 也一定有所耳闻。Workflow 可以帮助你创建自己的工作流,就如 Workflow 这个词语本身的意思一样。

App 发布两年多后,历经多次更新,现在已经加入了 HTML 的 POST PUT 请求,对于 IFTTT, Telegram 等第三方程序的联动等等。可以说,它不仅能提高我们的日常生活效率,同时还能使办公也变得更轻松。

Api.png

Workflow 的巅峰莫过于对于 API 的处理,我们有时在电视中听到数据信息提供商的广告,这些公司提供的就是 API,也就是应用程序接口。不说用途,它本身也很广泛,有天气数据 API,有身份证校验 API,当然也有查快递 API。

WechatIMG128.jpeg

少数派稍早前发布的《Workflow + 快递 100,原来快递还能这么查》已经把如何结合 Workflow 与快递 100 在通知中心查快递讲的非常透彻了。而这篇文章的标题和它近似,但又不同,不同点在于末尾——还能这么显示。

实际上,当你请求 API 时,反馈到的结果是一串你看起来头都大的文字:

{"message":"ok","nu":"960097361990","ischeck":"1","condition":"F00","com":"shunfeng","status":"200","state":"3","data":[{"time":"2016-12-20 10:55:31","ftime":"2016-12-20 10:55:31","context":"已签收(门友 ),感谢使用顺丰,期待再次为您服务","location":"null"},{"time":"2016-12-20 10:14:53","ftime":"2016-12-20 10:14:53","context":"正在派送途中,请您准备签收(派件人:李巍,电话:18628275102)","location":"null"},{"time":"2016-12-20 10:05:30","ftime":"2016-12-20 10:05:30","context":"快件到达 【成都市龙泉驿区成龙大道营业点】","location":"【成都市龙泉驿区成龙大道营业点】"},{"time":"2016-12-20 06:34:23","ftime":"2016-12-20 06:34:23","context":"快件到达 【成都双流集散中心2】","location":"【成都双流集散中心2】"},{"time":"2016-12-19 21:59:42","ftime":"2016-12-19 21:59:42","context":"快件在【上海总集散中心】已装车,准备发往 【成都双流集散中心2】","location":"【上海总集散中心】"},{"time":"2016-12-19 21:31:41","ftime":"2016-12-19 21:31:41","context":"快件到达 【上海总集散中心】","location":"【上海总集散中心】"},{"time":"2016-12-19 14:52:09","ftime":"2016-12-19 14:52:09","context":"顺丰速运 已收取快件","location":"null"}]}

这其实是一串 JSON 结果,很多网站都提供 JSON 格式化(着色)功能,将它处理一下便可以看到其实每一个项目都是有它的逻辑位置和关系,上下层层递进而成。而如果像上图右边一样,直接把数据显示出来,这只能说是一个结果展示,并不能拿到实际的用途,再加上 iOS Workflow 在通知中心容易显示不全,这样的结果不仅不美观,还容易将原本就很紧凑的通知中心弄的乱七八糟。

Pasted Graphic 1副本.jpg

所以这篇文章旨在教你如何用 Workflow 处理数据。查快递不仅仅是现实结果,更多的在于对数据的处理过程。如果你学过编程,接下来的内容可能会非常简单,不过没学过也不要紧,你所需要的只是明白它的逻辑,明白之后一切都很好办了。

成果展示

  • 在剪切板中直接复制单号运行

Image

  • 在提醒事项中保存好的单号,无需剪切板而直接运行

Image

制作思路

处理剪切板和提醒事项

当你添加 Workflow 时,我设置了 Import Question 询问你是否想禁用提醒事项,因为在我先前的几个版本中,我收到大量用户反馈他们更喜欢用剪切板而非提醒事项的方式,你现在可以选择只启用剪切板,不从提醒事项读入以节省时间。

IMG_6087.PNG

提醒事项的处理逻辑是,在任意提醒事项列表创建开头为「快递单号」的提醒事项,然后紧跟单号数字,如果你希望写备注,可以继续加上”备注”然后紧跟备注,如:

快递单号960097361990备注AirPods

提醒事项处理.jpg

日期的显示处理

在这个截图中你可以看到我最近的一条快递它将昨天真正的显示为了「昨天」,这是怎么做到的呢?其实是用到了 Workflow 中的 Format Date,它又一个 Relative 模式可以显示出关联日期,比如 Yesterday 昨天这样的文字。

Image

*显示语言按照系统的区域语言显示,而非系统语言,如果你在 iPhone 中使用英语,但区域格式是中国,那么还是会显示中文字。

IMG_6089.PNG

同时,因为 Yesterday 已经超过 9 个字,故按照下图逻辑将永远不会使用 Relative,所以这个功能在英语区域文字下会失效,我觉得没有必要去刻意修复这个问题。

日期处理.jpg

翻页

如何在保持界面美观的情况下尽可能完全的显示出更多条物流信息?这也是一个难题,有些用户更喜欢像刚刚那个没有处理数据的 Workflow 一样展示出多条结果,而有些用户又喜欢只显示最新的几条。

WechatIMG132.jpeg

感谢微博用户 @i张永 提出的建议,翻页是一个非常有趣的解决方法,你想看几页看几页,一页显示两条信息,如果你不想继续看了,只想看这么多,点下一条你就可以接着看另一个单子,如果你想看这个单子的更多记录,点击下一页,就可以翻页直到最老的一条更新,效果如图。

IMG_6094.PNG点击下一页就可以完成翻页动作。

IMG_6095.PNG

然而实现这个功能可不是一个简单的事情,需要处理好无论是 Workflow 还是编程中都相当麻烦的东西——循环。

IMG_6096.PNG

除了次数循环,Workflow 提供了一个对单项循环,也就是 Repeat with Each,这个非常有用,特别是处理 JSON 这种组合数据。但是 Workflow 同时又没有一种非常重要的循环,叫做 Repeat Until,也就是循环直到。

Pasted Graphic 4副本.jpg

让我们用一个简单的 Python 程序来说明循环直到的作用,首先定义 a = 10,当 a > 0 的时候,满足 while 循环条件,进入循环体,首先 a 自身 - 1,然后打印文字「a 还是一个 非 0 数」,这个时候又回到循环判断,a 现在为 9,仍然满足 >0,继续循环……直到 a - 1 后 = 0 了,这个时候不再满足 a > 0 条件,退出循环。

# -*- coding:utf-8 -*-
a = 10
while (a > 0):
  print "a =", a, "还是一个非 0 数"
  a = a - 1
print "a 现在 = 0了!"

为了在 Workflow 中实现类似的功能,我只好绕考这个模式,下面请看详细分解,由于过程复杂我分成几张图来解释:

首先是对于头部的处理

翻页预处理.jpg

变量初始化

页码处理.jpg

只有一条的情况

只有一个处理.jpg

奇数个情况

奇数处理.jpg

循环输出

循环处理.jpg

变量处理

加法处理.jpg

到这里翻页循环就结束了,主体逻辑是区分开只有一条,有奇数条,有偶数条的三种情况,再用循环套循环来实现输出用户界面。

使用方法

其实刚刚已经差不多说到了,有以下两种方法

  • 直接复制单号到剪切板运行,你可以搭配 Pin 等工具将这步操作效率提升
  • 在提醒事项的任何列表中新建以下格式的提醒事项,请注意不要标记为完成,标记后 Workflow 将自动跳过。

WechatIMG142.jpeg

疑难解答

由于这个工作流会分享给每个看到这篇文章的人,有必要说明一些常见问题的处理方法:

请注意,尝试以下方法之前先多次运行该 Workflow 排除偶然性。

错误 201 单号不存在:这很有可能是你的快件刚刚发出,快递 100 的 API 尚未获取到数据,请注意,官网更新不代表快递 100 能接收到更新,因此如果刚刚发出的快递,而官网已经更新物流了,仍然无法查到,请等待一段时间。或者,你如果使用提醒事项,可能是你的格式有问题,请确保快递单号四个字和数字之间,备注两个字和备注之间没有空格

错误 400 参数错误:这很有可能是快递 100 API 不识别你单号对应的快递公司,如果这个快件不是刚刚发出,且确定你的格式,剪切板内容没有问题,无解。

错误 500 服务器错误:这是短时间错误,一般直接重新运行即可解决。

运行后,Workflow Widget 显示无法载入:这是 iOS bug,请直接重启设备。

WechatIMG144.jpeg

结语

IMG_6222.JPG

让我们回到这张图片,我特意找回图中右边那条 Workflow 数了一下它的 blocky 数量,一共 27 条,你想知道实现左边这条用了多少个吗,答案是 213。

屏幕快照 2017-01-05 下午9.24.47.png

我们用的 App,小到新浪微博,大到各位可能比我知道的更复杂的 App,凡事与互联网交流的,之间都少不了数据的获取,而获取之后并不会直接显示 RAW,处理数据则成为了关键。这如同我们的生活,干成一件事情很容易,干好一件事情就另当别论了。

下载

核心 https://junyilou.github.io/kuaidi20170105.wflow

或者 https://workflow.is/workflows/8bfb633d09fd40a58079c8c62928d537

我自己没事做了个方便添加的,如果你寄快递很多可以用,日常使用我觉得通过剪切板和提醒事项手动创建已经非常方便了 :)

添加 https://workflow.is/workflows/03421d0a650c4e2790a9813e9d537212

如果这篇文章前面你一个字也没看,请至少看清楚使用方法,谢谢。

*看到很多朋友说绕远了,为什么不直接打开快递 100 App?这篇文章的主要目的还是说明 Workflow 的可开发性,并以快递为例子,讲述对 API 冗杂数据的处理方式,希望借此激发各位的开发激情,做出更多更好的 Workflow。