DuetG Blog

Keep It Simple, Stupid

标签: monitor

  • 利用Huginn监控iPad mini发售

    利用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不错,但似乎也没有那么抢手。所以上面这一通折腾我到底又是为了什么呢?