Duet G. Blog

Keep It Simple, Stupid

利用Huginn监控iPad mini发售

阅读本文需要有一定的Huginn和IFTTT使用基础

作为一个iPad mini 2的老用户,对今年的iPad mini说实话还是很满意的。只不过一直看好的蜂窝网络版始终显示还在报批中,这让我非常的恼火。一来不知道猴年马月能用上,再来又害怕没赶上开卖,下单又要等更久的时间。毕竟现在iPhone 13 Pro官网要等上一个月才发货,而又有传闻蜂窝网络版iPad mini 6就是因为把芯片匀给了iPhone才推迟了上市。总之众说纷纭,让我十分不爽。

年中的时候一个偶然的事件让我深度地研究了一下Huginn的用法,又在腾讯云开了台服务器(国内的服务器真不知道还能干些啥),把Huginn以Docker的形式挂了上去。虽然后来原本计划用到Huginn的事情没能成行,但机器倒也还一直跑着。于是就决定利用Huginn来完成iPad mini发售的监控。下面简单说一说思路和具体操作。

Huginn作为一个自动采集平台,虽然没有python来的自由,但贵在有用户界面,并且系统稳定(至少半年跑下来非常稳)。但单独使用Huginn来抓取页面很多时候是会失败的,原因在于这个需要抓取的页面是动态生成的,需要浏览器来渲染生成才可以(这是半年前我花了一两天才想明白的问题)。这次抓取苹果官方商店页面时也同样遇到这样的情况,单独使用Website Agent是获取不到页面的。这个时候还需要一个能够让页面完成渲染的服务,我这里用的是browserless。browerless也是开源软件,在服务器里多跑一个Docker容器就完事儿了。

那么总结一下工作逻辑:
1、使用Post Agent调用browerless的API完成页面的渲染,设置每十分钟渲染一次
2、使用Website Agent获取渲染完成的页面并解析(如果是监控的话,找出可能变动的位置)
3、使用Data Output Agent完成RSS输出
//以上是在Huginn中完成
4、使用IFTTT的rss to email Applet(这样的Applet有很多,搜一下就有了,不需要自己写)。把rss地址设置成Huginn的RSS地址,邮箱可以设置成QQ邮箱。
//以上是在IFTTT中完成
5、利用微信中的QQ邮箱获取提醒

放一下Huginn每个Agent的代码

//Post Agent
//留意browserless需要设置Token
{
  "post_url": "http://[browserless_IP]:[browserless_Port]/content?token=[browserless_Token]",
  "expected_receive_period_in_days": "1",
  "content_type": "json",
  "method": "post",
  "payload": {
    "url": "https://www.apple.com.cn/shop/buy-ipad/ipad-mini",
    "gotoOptions": {
      "timeout": "10000",
      "waitUntil": "networkidle2"
    }
  },
  "emit_events": "true",
  "no_merge": "false",
  "output_mode": "clean"
}
//Website Agent
//抓取的是标题位置的div,因为下方会有小字说明正在等待批准,开售后小字会被移除
{
  "expected_update_period_in_days": "2",
  "data_from_event": "{{ body }}",
  "type": "html",
  "mode": "on_change",
  "extract": {
    "url": {
      "value": ".",
      "xpath": "//*[@id=\"as-standardnav\"]/div/div[2]/div[1]/a/@href"
    },
    "title": {
      "value": "normalize-space(.)",
      "xpath": "//*[@id=\"root\"]/div[2]/div[3]/div[2]/div[1]/div/div/h1"
    },
    "description": {
      "xpath": "//*[@id=\"root\"]/div[2]/div[3]/div[2]/div[1]/div",
      "value": "normalize-space(.)"
    }
  }
}

Data Output Agent没什么特殊的设置,按照Website Agent把地址,标题和描述设置好就行了。

最后说一下成果。今天上午突然微信收到邮件提示可以买了,鉴于每十分钟轮询一遍网页,理论上我下单的时间应该是够早的,但在网站给出的发货时间已经是4-5周了。没办法,即便如此还是要等的。(目前网站提示的已经是5周后了)看来虽然iPad mini 6不错,但似乎也没有那么抢手。所以上面这一通折腾我到底又是为了什么呢?