# 利用Huginn监控iPad mini发售

- Link: https://duetg.com/2021/11/monitoring-ipad-mini-release-by-huginn/
- Published: 2021-11-10T23:55:33+08:00
- Author: DuetG

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

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

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

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

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

放一下Huginn每个Agent的代码

    ```language-yaml
    //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"
    }
    ```

    ```language-yaml
    //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不错，但似乎也没有
那么抢手。所以上面这一通折腾我到底又是为了什么呢？
