kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

urlwatchでwebサイトを監視してSlackで通知する

  • これまで Zabbix で行っていた Web サイトの更新確認を urlwatch に変更した
  • cron による自動実行と Slack 連携で、自動でスマホに通知する仕組みを作る

urlwatch (https://github.com/thp/urlwatch)

Webサイトの更新確認を楽に行いたい

以前、以下のエントリでも投稿した通り、株価の監視やコロナワクチン情報サイトの監視に Zabbix を使ってきた。

kwatanabe.hatenablog.jp

Zabbix はサーバやサービスを監視するツールで、Web サイトの更新をただ監視するにはオーバスペックであり、そのため多くの設定が必要で保守が面倒だった*1。もっと手軽に使えるツールが欲しかった。

株価の判定のように、その時点の情報のみで完結するようなものは、n8n workflow などのローコード系のワークフローシステムが使いやすい。一方、Webサイトの更新検知においては、前回の情報との照合が必要なため、外部データベースやストレージを用意することになり、これは別の意味で面倒くさい。

そこで、Webページの更新監視に特化した urlwatch を試してみた。Webサーバの更新を検知したら、Slack 経由でスマホに通知して欲しいので、Slack 連携も設定した。

github.com

検証環境

手順

Slack の webhook URL を取得

Slack のアカウント、ワークスペース、チャネルは事前に構築済みとする。

  1. Slackにログイン
  2. Slack API から新規 Slack アプリを作成
  3. Create New App を押下
  4. From scratch を押下
  5. AppName に任意の名称を入力
  6. Pick a workspace to develop your app in: に投稿したい Slack ワークスペースを選択
  7. Create App を押下
  8. Features の Incoming Webhooks を押下
  9. Activate Incoming Webhooks を On
  10. Add New Webhook to Workspace を押下
  11. 権限リクエストで投稿先のチャネルを指定したうえで許可
  12. Webhook URL をコピー

正しく作成できているか確認するのであれば、curl で以下のようにすればテストができる。

$ curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' WebHookのURL`

urlwatch の導入

Debian であれば apt で導入できる。最新版が使いたいなら pip で導入する。

$ sudo apt update
$ sudo apt install urlwatch

urlwatch はサービスではなく単体起動するコマンドラインツールなので、設定ファイルはユーザのホームディレクトリに作成する構成が標準となっている。

今回は、監視からSlack通知まで自動化をしたいので、システムに設定ファイル用のディレクトリを用意しておく。

$ sudo mkdir /etc/urlwatch

設定ファイルの初期ファイルを生成させる。デフォルトの設定ファイルから保存場所を変更するため、パスを指定する。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml

    A default config has been written to /etc/urlwatch/config.yaml.
    Use "urlwatch --edit-config" to customize it.
        
    You need to create /etc/urlwatch/urls.yaml in order to use urlwatch.
    Use "urlwatch --edit" to open the file with your editor.

Slack 通知を有効化するため、設定ファイルを編集する。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml --edit-config
...
report:
...
  slack:
    enabled: true
    max_message_length: 40000
    webhook_url: 'WebHookのURL'
...

監視用のURLを登録する。1つの yaml で複数項目を列挙する仕様となっているため、監視対象ごとに --- で区切って列挙する。ここでは、何かしら更新されたら通知する設定を行う。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml --edit
kind: url
name: "テストページ"
url: "テストページのURL"
---
kind: url
name: "テストページ2"
url: "テストページ2のURL"

ほかにも、正規表現でマッチする箇所のみを監視したりやシェルスクリプトの実行結果での通知など、高度な設定もできる。詳細は公式のドキュメントを参照。

urlwatch.readthedocs.io

設定を認識しているか確認する。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml --list
1: テストページ ( テストページのURL )
2: テストページ ( テストページ2のURL )

動作確認

urlwatch を実行する。これまで実行したことない項目があれば、それが検知される。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml
===========================================================================
01. NEW: テストページ
02. NEW: テストページ2
===========================================================================

---------------------------------------------------------------------------
NEW: テストページ ( テストページのURL )
---------------------------------------------------------------------------


---------------------------------------------------------------------------
NEW: テストページ2 ( テストページ2のURL )
---------------------------------------------------------------------------

もし、前回実行時から更新されていれば、以下のように検知される。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml
===========================================================================
01. CHANGED: テストページ
===========================================================================

---------------------------------------------------------------------------
CHANGED: テストページ ( テストページのURL )
---------------------------------------------------------------------------

また、コンソールに出力されている内容と同じものが、Slack にも投稿される。

Slack 向けに体裁を整える

標準の出力はコンソールで実行する分には問題ないが、Slackに投稿されると通知が見づらいので、出力を小型化する。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml --edit-config
...
report:
...
  text:
...
    minimal: true
...

これで、出力が以下のように小型化される。

$ sudo urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml       
CHANGED: テストページ ( テストページのURL )

cron に登録

urlwatch はコマンドラインツールなので、cron から定期起動して更新を自動的に通知するように設定する。

$ sudo crontab -e
11,26,41,56 * * * * urlwatch --urls /etc/urlwatch/urls.yaml --config /etc/urlwatch/config.yaml > /var/log/urlwatch.log

まとめ

  • 設定ファイルの更新のみで手軽に監視対象の保守できる、Webサイト監視の仕組みを構築できた。
  • 株価の監視のような、Web API をたたいて値を監視するような用途だと、n8n workflow や IFFTT のようなローコード系のワークフローシステムを使った方が、やりやすいと思う。

*1:サーバ、サービス監視には多機能、かつ、使いやすくて重宝している。コロナワクチン1回目がなかなか受けられなかった頃に、元々使っていた Zabbix に相乗りさせたくて、無理矢理作り込んだ経緯がある。