CloudMonad:可编程的互联网

CloudMonad是一个无需编程,让用户通过Web界面组合各种预定义配件实现特定功能的云服务。

CloudMonad主要有3个模块:Feed,Spec和Action。
  1. Feed是数据输入源,由定时执行的爬虫或者微信消息等第三方部件持续提供。

  2. Spec是对数据源数据的检测,符合特定条件后触发后续Action,否则静默处理。

  3. Action是最终执行动作,其输入由触发该Action的Feed提供,完成某一特定任务。

组合这3个模块,可以实现各种有意思的功能,比如:

例1:微信消息Kindle推送
例2:利用搜狗微信搜索监控公众号文章更新并推送到Kindle
例3:微信分享链接推送到RSS源
例4:京东价格变化微信通知
例5:使用FetchUrl实现将任意网站作为输入源
例6:12306车票购买
例7:微信公众号自动发文
例8:利用RestApi Action实现方糖微信通知
例9:针对淘宝商品特定套餐的价格变化监控

这些功能只是CloudMonad的应用示例,它们都是通过一个Serverless的Web应用页面用Json配置生成,新增功能对后端完全透明。

和IFTTT的区别?

IFTTT 是“IF This Then That”的缩写。其目标是利用各种开放的API,将技术复杂性隐藏起来,使每个人都可以成为互联网无需编程的程序员,让整个互联网都可以为我所用。来源

它的成功依赖于国外开放的API环境,通过和Facebook,Twitter,Gmail等帐号绑定即可获得授权实现大量功能。而国内各厂商相对更封闭一点,通过API授权能获取的功能很少,有些甚至根本不提供,这也是IFTTT的国内山寨版没有成形的重要原因。

同时,即使在国外,第三方授权方式在功能上也会相对受限,适用场景比较窄,这很容易理解,没有一家公司会希望用户只需通过第三方服务访问自己。

CloudMonad走的是另外一条途径:通过自动化的浏览器模拟用户行为实现功能,理论上只要用户通过浏览器能完成的功能,CloudMonad都能提供。

造数以及 import的区别

相同的地方是都用了爬虫技术,造数和import更接近于传统意义上的爬虫,主要目的是批量获取数据。而CloudMonad更像是一个自动化的浏览器,注重的是浏览过程产生的结果,这个结果可能是搜集到一些数据,也有可能只是浏览过程中产生的一些side effect(如购买了某件商品,发送了一条评论)。

换句话说,造数和import满足的是爬取大量数据然后离线分析的需求,CloudMonad只想满足一个偷懒的用户。

CloudMonad如何应对网站的反爬虫措施

CloudMonad不是爬虫,因而可以用更灵活的方式来处理一些普通爬虫无法处理的验证措施。
我专门为它做了一个名为imhuman的验证码处理模块,可完美处理12306和微信扫码验证。

技术栈和使用到的资源

CloudMonad的前端,后端以及一个Android模块(微信)都是用Scala语言写的。
全栈Scala的最大好处除了复用代码,便于维护,还杜绝了前后端通信时数据结构不一致导致的错误。

CloudMonad在设计之初有一个小目标:要在尽可能低的系统资源下支持高扩展性(Scalable),而爬虫特别是 Headless 浏览器是高资源消耗操作,如何在系统低载时尽可能少的消耗资源,又能应付突发大流量请求是一个难题,最后的解决方案是各种按需付费的云服务。

CloudMonad 用了多种云资源:
包括一个整合了阿里云MNS和亚马逊SQS双备份的 CloudQueue 用于任务分发。
LeanCloud数据库配合阿里云OSS用于前后端通信。
IBM 的openwhisk ,亚马逊的LambdaDigitalOcean 按需使用的虚拟主机用于动态调整资源。
目前整个 CloudMonad 系统的硬性支出只有一台阿里云最低配虚拟主机,其他资源都是按需使用的,那台阿里云虚拟机上运行着一个Akka node用于协调资源,用户管理等工作,具体的脏活都外包给其他云服务执行。

如何使用

注册和绑定

CloudMonad每次执行会消耗一定的CloudPoint,具体数量根据执行时间确定,如Feed花了12秒爬取搜狗微信公众号文章,Action花了9秒推送到Kindle,那么此次运行会扣除你21个CP。

每个用户初始会分配500个CloudPoint,用完后该用户所有的任务都会暂停。如果你碰到这个情况,请通知我,在后台手动给你增加。

你可以在[我的账户]查看你的CloudPoint,同时每个用户有一个唯一的推荐链接,如果你觉得这个服务对你有用的话欢迎用这个链接推荐给你的好友,后台会有记录。

如何调试

CloudMonad创建成功后,点击「详情」按钮,可查看CloudMonad的运行细节:如Feed的执行结果,Spec的判定过程和结果,Action的输入和输出。

CloudMonad运行中如果碰到不能恢复的异常,会自动禁用,并记录异常内容,如果是爬虫执行类异常,还会提供一个异常发生时的浏览器截图。

为什么我的CloudMonad没有运行?
CloudMonad遇到下面这些情况会停止运行:
1. 用户的CloudPoint不足(可在「用户信息」中查看)。
2. 运行过程中代码抛异常了。
3. 运行次数超出创建时指定的「最多执行次数」。默认为5次,最大可设置为100.

从目前的测试情况看,最有可能的问题是用户没有正确设置Cron定时器,导致任务短时间内多次运行,快速消耗了运行次数配额和CloudPoint。

另外还有一些参数设置不正确,导致Feed输出的数据没能传递给Action,请根据运行日志做相应调整。

feed

如果你创建的CloudMonad未能按预期运行,请点击「详情」页面将它任务ID反馈给我。

额外配置选项:

Cron配置: 用于生成Cron定时器的UI
爬虫配置: 用于个性化爬虫

IFTTT创始人Tibbets说:「我们始终认为人们应该具备一种与生俱来的信念。万事皆在我掌控而并非被万事所囚笼,正是为了贯彻这个信念我们才启动了这个项目。」,这也是我做CloudMonad的初衷,它像你在互联网上的代理,帮你遍历网站,检查更新,执行命令,让互联网变成一个为你服务的大程序。

CloudMonad目前还处于概念验证阶段,如果能吸引足够多的用户,会考虑做一个大的改版,现在还是以功能性为主,有些UI操作不是很用户友好,诸位使用中有什么问题,欢迎反馈。

关于CloudMonad的问题和建议可在此提issue
或直接给我发邮件

本文已同步到知乎专栏一个人的云计算