利用 Flask 和 VPS 搭建物流更新自动推送 RSS

想法

在我数个 Workflow 查快递 项目,或者说更新完成之后,可以说它已经非常完善了。利用非常稳定的 快递100 API,查一条快递的速度不到一秒钟。虽然我知道大多数人使用的是少数派之前推荐过的另一篇查快递方法,在这里我很骄傲的说,我的版本不仅速度和它相当,在界面的美观程度,效率,和功能上都要比它强很多,因此也来做一个小小的广告。

WechatIMG88.jpg

我算是得罪你们一下,不过顶上这个图右边这种毫无修正,直接套数据的真的看不下去... 之前好多人说我做的 Workflow,too long,too complex. 毕竟有一大部分都是在 UI 美化能不长吗。😂

屏幕快照 2016-12-20 下午9.58.11.png

2015 年 12 月我正是因为想到 Workflow 查快递的主意才申请加入 Matrix,到现在已经一年多了。而 Workflow 始终是一种被动的查询方式,查询,查询,你查才会有结果,而不是当物流信息有更新时,自动告诉你,这才是真正方便的物流查询方式。

IFTTT 于前段时间与 Telegram 做了合作,而 IFTTT 一直是支持 Feed 的,很早以前我喜欢用 IFTTT 订阅 Apple 媒体新闻和开发者新闻 RSS,来收取最新的 PR 文章和系统 Beta 更新推送。Momo.Kong 这篇文章讲到了 Telegram 和 Android 合作的一些用法,我脑子一转,为什么不可以用它来做一个查快递的工具呢?

转换为 RSS

RSS,在许多人眼里是一个已经被抛弃的东西。借用水深云际的话说:在 Google Reader 宣告关闭之后,网络上关于「RSS 将死」的言论一度甚嚣尘上,令人欣慰的是在经历短暂的阵痛期之后,RSS 非但没有死,反而出现了百花齐放百家争鸣的情况。多家 RSS 服务网站迅速崛起,很好的填补了 Google Reader 留下的空白,行业竞争也更趋良性。

屏幕快照 2016-12-19 下午10.33.29.png

一条条物流更新,就如 Feed 一样,或者说新闻,一条一条的随着时间更新,把快递做成 RSS 简直是再适合不过了。在我钻研一阵之后,没有找到较好的 JSON 或者 Dictionary 转 XML 或 RSS 的方法,但是 RSS 格式简单,请看下面的示例:

<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>这是 RSS 的标题</title>
  <link>http://www.example.com</link>
  <description>这是 RSS 的介绍</description>
  <item>
    <title>第一个 Item</title>
    <link>http://www.example.com/item-1.html</link>
    <description>这是第一个 Item 的介绍</description>
  </item>
</channel>
</rss>

如果需要添加多个 Item,只需要在第一个 </item> 之后再加 <item> 即可开始新一个项目,只要使用编程语言的循环语句,就可以轻松手动把简单的来自 快递 100 的 API 数据转换成 RSS 格式。

屏幕快照 2016-12-19 下午10.27.11.png

这里我花费一些时间写了个 Python,它虽然可能并不是最好的工具,不过是我用的比较熟悉的。再使用到了 Python 中的一个库 —— Flask,稍后会讲它的具体用途。运行这个 Python 程序,就可以将 JSON 转换为 RSS 了。通过 XML Document Tree,我们可以清楚地看到每一个 Item 的内容,物流信息和时间。

屏幕快照 2016-12-19 下午10.38.33.png

公网

有了上面的基础之后,我们就要想办法把这个 RSS 放到公网上,这里需要用到各位自己的 VPS,而 Flask 的用途也就在这里体现了。

屏幕快照 2016-12-19 下午10.42.28.pngFlask 可以帮助你把 Python 程序的运行结果直接输出成为网页,有了刚才我们的标准 RSS 文字代码,只需要将它做成一个网页,让别人访问就可以直接得到对应单号的 RSS。安装 Flask 非常简单:

sudo pip install Flask

完成安装后 cd 到你想放 Python 源代码的目录,直接运行 Python 即可:

屏幕快照 2016-12-19 下午10.47.13.png当你看到 Running on http://0.0.0.0:8080/ 就表示已经成功了,根据我的设定端口号为 8080,你也可以直接在 .py 中修改。现在用浏览器访问 http://127.0.0.1:8080/?id=快递单号,你就可以看到输出的 RSS 结果(浏览器可能会进行优化,查看 XML 请打开 "查看源代码")

屏幕快照 2016-12-19 下午10.49.25.png由于我们监听地址是 0.0.0.0,所以此时你的 RSS,也可以说你自己制作的 API 已经从 VPS 映射到全网,那么你只需要使用你自己的 RSS 浏览器输入 Feed 就可以订阅你自己制作的 RSS。

http://你的域名:8080/?id=快递单号

订阅和推送

在这些都完工之后,你只需要在 iOS 使用你喜欢的 RSS 阅读器,或者 IFTTT 你可以直接链接 Feed 创建 Applet 来通过邮件通知你,通过 iOS Notification 通知你,通过 Telegram 通知你,当然,你要是有兴趣可以设置成:当快件更新时,把 Philips Hue 设置成一种颜色,这样你回家看到灯变色了,你就知道你的快件更新了。

屏幕快照 2016-12-19 下午10.54.16.png

在我的 Python 中指定的内容如下,你可以自定义这些参数来个性化你收到的通知内容:

RSS 标题:顺丰快递 199318633030

RSS 链接:https://m.kuaidi100.com/result.jsp?nu=199318633030

Item 标题:10月30日 16:36 已签收,感谢使用顺丰,期待再次为您服务

Item 链接:<同上 RSS 链接>

Item 内容:已签收,感谢使用顺丰,期待再次为您服务

你可以尝试看懂我的 Python 代码直接修改这些参数的内容,所以说接下来就看一下效果图吧:

WechatIMG84.jpeg上图 Telegram;下图 某 RSS 订阅 App

359478.jpg联动 IFTTT 并个性化内容,你可以以你自己希望的格式收到通知:

WechatIMG86.jpeg以上截图均为直接使用真实 API 地址得到的结果,而非使用测试数据使其显示指定内容,所以图中是怎样的,你也会看到怎样的效果~

WechatIMG87.jpegIFTTT 应该是效果非常好的,我个人比较喜欢的方式是 Telegram 的 Superfeedr Bot,少数派有过介绍。或者图中的通过 Feed 更新发送消息到 Telegram 的方式。

开放

和往常不一样的是,一般到文末我就会提供一个可用的地址了,很遗憾,基于 VPS 的安全,隐私性考虑,我并不准备公开我自己的 VPS 地址来给可能混在人群中的存有一丝侥幸心理的人使用,请各位理解。

但是我正在尝试将它封装到 Telegram Bot,使它能以一种安全的形式公开,不过考虑到工程量的问题什么时候能做出来还真是一个未知数。

希望看到文章的各位,如果你们有能力并且愿意帮助我把它变得更好,欢迎在下方评论和我联系,继续把我 20 年专注查快递继续下去。🌚

噢,上面那条 Python 还是会开源的,在这里:https://github.com/junyilou/junyilou.github.io/blob/master/rss-kuaidi.py。简单易懂,根据自己的需要修改,效果更出色。


为您推荐了相关的技术文章:

  1. 王掌柜带你玩转 Zapier - Zapier vs. IFTTT
  2. 漏洞检测的那些事儿 - 从理论到实战
  3. 利用 Python 特性在 Jinja2 模板中执行任意代码
  4. 服务端模板注入攻击 (SSTI) 之浅析
  5. Introduction · Vulnerability box

原文链接: sspai.com