urlwatch でサイト更新を検知|Slack 通知と監視設定のポイント

  • URLをコピーしました!
目次

はじめに

Web サイトの更新を自動で検知し、変更があった際に通知を受け取りたいケースがあります。本記事では、オープンソースの監視ツール 「urlwatch」 を用いて、特定の Web ページを監視し、更新の差分を Slack やメールに通知する仕組みの構築手順を整理します。

執筆時点での最新版は urlwatch 2.29(2024 年 10 月 28 日リリース) です。記事内のコマンドや設定例はこのバージョンで動作確認しています。

参考: urlwatch monitors webpages for you(公式サイト)
“urlwatch-2.29.tar.gz (2024-10-28)”
https://thp.io/2008/urlwatch/

この記事でわかること
  • urlwatch の基本機能とインストール手順
  • 監視対象の URL とフィルタを定義する設定ファイル(urls.yaml)の書き方
  • Slack と Gmail(アプリ パスワード)への通知先設定(urlwatch.yaml)の手順
  • cron やタスクスケジューラを使った定期実行の基本
  • 導入時にハマりやすい制約事項と回避策
  • urlwatch の後継ツール webchanges との違いと選び分けの考え方

urlwatch とは?

urlwatch は、指定した Web ページや任意のシェルコマンドの出力を定期的に取得し、前回実行時との差分を抽出して通知するコマンドラインツールです。Python で開発されたオープンソースソフトウェアで、BSD-3-Clause ライセンスのもと公開されています。

参考: urlwatch Handbook(公式ドキュメント)
“urlwatch is intended to help you watch changes in webpages and get notified (via e-mail, in your terminal or through various third party services) of any changes.”
(urlwatch は Web ページの変更を監視し、メール・ターミナル・サードパーティサービスを通じて通知することを目的としています)
https://urlwatch.readthedocs.io/en/stable/

Web ページやコマンド出力の差分を検知するツールの概要

主な特徴として、以下の点が挙げられます。

特定要素の監視(フィルタリング)

ページ全体だけでなく、CSS セレクタや XPath を指定して監視範囲を絞り込めます。これにより、広告など動的に変わる要素による不要な通知を抑えられます。

多様な通知先

検知した差分は、メール(SMTP)のほか、Slack、Discord、Telegram、Matrix、Pushover などのメッセージングサービスへ自動送信できます。

コマンド出力の監視

URL だけでなく、サーバー内で実行したシェルコマンドの標準出力も監視対象にできます。

インストール手順

urlwatch は Python パッケージとして提供されているため、pip を使ってインストールします。Linux、macOS、Windows のいずれの OS でも導入可能です。

Python と pip の準備

事前に Python 3 と pip が必要になります。Python がインストールされていない場合は、以下の記事を参照して環境を構築してください。

記事内のバージョン情報は適宜最新のものに読み替えてください。

urlwatch のインストール

Windows 版 Python のインストーラー実行時に「Add Python to PATH」にチェックを入れていれば、コマンドプロンプトまたは PowerShell から以下を実行します。

pip install urlwatch

💡「’pip’ は、内部コマンドまたは外部コマンド…」のエラーが出る場合
PATH が通っていない状態です。以下のコマンドに置き換えて実行してください。

py -m pip install urlwatch

インストール後、以下のコマンドでバージョンが表示されれば導入は完了です。

urlwatch --version

執筆時点での最新版は 2.29 です。 出力されるバージョンが古い場合は以下のコマンドで更新できます。

pip install --upgrade urlwatch

通知先の設定(urlwatch.yaml)

urlwatch には、役割の異なる 2 つの設定ファイルがあります。

ファイル役割編集コマンド
urlwatch.yaml通知先(Slack・メール等)や全体設定urlwatch --edit-config
urls.yaml監視対象の URL とフィルタを定義urlwatch --edit

このセクションでは前者の通知先設定を扱い、監視対象の URL 設定(urls.yaml)は次のセクションで解説します。

参考: urlwatch Introduction(公式ドキュメント)
“Use urlwatch --edit to customize jobs and filters (urls.yaml) / Use urlwatch --edit-config to customize settings and reporters (urlwatch.yaml)”
https://urlwatch.readthedocs.io/en/stable/introduction.html

以下のコマンドを実行すると、通知設定ファイル(urlwatch.yaml)がデフォルトのエディタで開きます。

urlwatch --edit-config

エディタが起動しない場合は、環境変数 EDITOR(または VISUAL)に使用したいエディタを指定します。

# Linux / macOS の例
export EDITOR=/usr/bin/nano

Slack へ通知する場合(Webhook の取得と設定)

Slack の特定チャンネルへ通知する場合、事前に Slack のワークスペースで「Incoming Webhooks」アプリを追加し、Webhook URL を取得しておきます。

設定ファイル内の slack: セクションを以下のように編集します。

slack:
  enabled: true
  webhook_url: 'https://hooks.slack.com/services/XXXX/YYYY/ZZZZ'

Gmail で通知する場合(アプリ パスワードの取得と設定)

Gmail の SMTP サーバーを利用してメール通知を送る設定です。Google のセキュリティポリシー強化により、通常のアカウントパスワードや「安全性の低いアプリのアクセス」は利用できません。Google アカウントの 2 段階認証プロセスを有効にしたうえで、「アプリ パスワード」を発行します。

なお、Google Workspace では 2026 年 6 月 1 日以降、2 段階認証プロセスが必須化される動きが進んでいます。アプリ パスワードは 2 段階認証が有効なアカウントでのみ発行できる 16 桁のコードです。

参考: アプリ パスワードでログインする(Google アカウント ヘルプ)
“アプリ パスワードとは、安全性の低いアプリやデバイスに Google アカウントへのアクセスを許可する 16 桁のパスコードです。アプリ パスワードは 2 段階認証プロセスを有効にしているアカウントでのみ使用できます。”
https://support.google.com/accounts/answer/185833?hl=ja

セキュリティの観点から、通知送信用の専用 Google アカウントを新規作成する運用を推奨します

設定ファイル内の report: セクションを以下のように編集します。

report:
  email:
    enabled: true
    method: smtp
    smtp:
      host: smtp.gmail.com
      port: 587
      starttls: true
      auth: true
      user: 'your_account@gmail.com'
    from: 'your_account@gmail.com'
    to: '通知を受け取るメールアドレス'
    subject: 'Webサイトの更新がありました: {jobs}'

アプリ パスワードは設定ファイルに直接書き込むのではなく、以下のコマンドで OS のキーチェーンに登録する方法が安全です。

urlwatch --smtp-login

実行すると 16 桁のアプリ パスワードの入力を求められます。入力後、urlwatch から Gmail の SMTP サーバーへ認証できるようになります。

監視対象の設定(urls.yaml)

通知先の設定が終わったら、次に どのページのどの部分を監視するかurls.yaml に定義します。以下のコマンドで編集モードに入ります。

urlwatch --edit

urls.yaml には複数のジョブを定義でき、ジョブの区切りは --- の行で表現します。urlwatch のジョブには 3 種類あり、urlnavigatecommand のいずれか 1 つのキーで種類が決まります。

参考: urlwatch Jobs(公式ドキュメント)
“Each job must have exactly one of the following keys, which also defines the kind of job: url retrieves what is served by the web server (HTTP GET by default), navigate uses a headless browser to load web pages requiring JavaScript, and command runs a shell command.”
(各ジョブには url、navigate、command のいずれか 1 つのキーが必要で、これによってジョブの種類が決まります)
https://urlwatch.readthedocs.io/en/stable/jobs.html

例 1: シンプルな URL 監視

最も基本的な書き方です。ページ全体を監視対象とします。

name: "Example サイトのトップページ"
url: "https://example.com/"

name--list で表示される人間向けのラベルで、必須ではありませんが付けておくと管理しやすくなります。

例 2: CSS セレクタで特定要素のみ監視

ページ全体ではなく、変化を追いたい要素だけに範囲を絞り込む方法です。広告やタイムスタンプなど、頻繁に書き換わるが本質的に重要ではない要素を除外できるため、不要な通知を抑える目的でよく使われます。

name: "ニュース見出しのみ監視"
url: "https://example.com/news"
filter:
  - css: "ul.news-list > li.headline"
  - html2text

filter は配列で複数指定でき、上から順にパイプラインのように適用されます。上記の例では「ul.news-list 直下の li.headline だけを CSS セレクタで抽出」→「HTML をプレーンテキストへ変換」という 2 段階の処理が走ります。

XPath で書きたい場合は以下の形式になります。

name: "本文セクションのみ監視"
url: "https://example.com/article"
filter:
  - xpath: '//section[@role="main"]'
  - html2text

フィルタが意図通り効いているかは、urlwatch --test-filter <番号> で事前に確認できます。<番号>urlwatch --list で表示されるジョブ番号です。

例 3: JavaScript で描画されるページの監視(navigate ジョブ)

通常の url ジョブは HTTP GET で取得した HTML をそのまま解析するため、JavaScript で動的に描画される要素は取得できません。このようなページには navigate ジョブを使い、ヘッドレスブラウザでレンダリング後の DOM を取得します。

参考: urlwatch Jobs(公式ドキュメント)
“The optional playwright package must be installed in order to run Browser jobs. You will also need to install the browsers using playwright install”
(Browser ジョブを実行するには、別途 playwright パッケージのインストールと、playwright install によるブラウザ本体のインストールが必要です)
https://urlwatch.readthedocs.io/en/stable/jobs.html

事前に Playwright を導入します。

pip install playwright
playwright install chromium

導入後、urls.yaml に以下のように記述します。

name: "JavaScript レンダリングが必要なページ"
navigate: "https://example.com/spa-page"

ただし、navigate ジョブは内部でヘッドレス Chromium を起動するため、通常の url ジョブと比べてメモリと CPU を大幅に消費します。API エンドポイントを直接 url ジョブで取得できないか、まず確認することを推奨します。多くの SPA はページロード時に JSON API を呼び出しており、その API を直接監視するほうが軽量で安定します。

設定確認

ジョブを書き終えたら、登録状況を確認します。

urlwatch --list

出力例

1: Example サイトのトップページ ( https://example.com/ )
2: ニュース見出しのみ監視 ( https://example.com/news )
3: 本文セクションのみ監視 ( https://example.com/article )
3 jobs

動作確認と定期実行

設定が完了したら、実際にツールを動かして挙動を確認します。

設定内容の確認とテスト

ジョブの登録状況や、フィルタが意図通りに効いているかを事前に確認できる便利なコマンドが用意されています。

# 登録されているジョブの一覧を表示
urlwatch --list

# 特定ジョブのフィルタ適用後の出力をプレビュー(番号は --list の結果)
urlwatch --test-filter 1

# 通知先(reporter)の動作テスト
urlwatch --test-reporter slack
urlwatch --test-reporter email

--test-reporter を使うと、実際にサイトを取得することなく Slack や Gmail へのテスト通知を送って通知経路を検証できます。設定ミスの切り分けに役立ちます。

手動実行で差分を確認

以下のコマンドを実行すると、登録したサイトの情報を取得します。

urlwatch

初回実行時は現在のページ状態を「基準」として保存するだけで通知は行われません。 Web ページに変更が発生した状態(またはテスト用に別の URL に差し替えた状態)で 2 回目以降を実行すると、差分が検知され、設定した Slack や Gmail へ通知が届きます。

定期実行(自動化)

OS の標準機能で urlwatch コマンドを定期実行させることで監視を自動化します。なお、公式では 30 分以上の実行間隔を推奨しています。

参考: urlwatch Introduction(公式ドキュメント)
“we recommend not more often than 30 minutes (this would be */30 * * * *)”
https://urlwatch.readthedocs.io/en/stable/introduction.html

Windows の場合

「タスクスケジューラ」を使用し、urlwatch コマンドを一定間隔で実行するタスクを作成します。

Linux の場合

cron に登録して自動化します。crontab -e で以下を追加すると、30 分ごとに実行されます。

*/30 * * * * /usr/local/bin/urlwatch

cron から実行する場合、PATHHOME 環境変数が対話シェルと異なる点に注意します。urlwatch のフルパスを指定するか、シェルスクリプト経由で環境変数を整えてから実行する方法が確実です。

導入前に押さえておきたい制約事項

urlwatch は柔軟性の高いツールですが、運用前に知っておくと回避しやすい制約や注意点がいくつかあります。

初回実行では通知されない

初回の urlwatch 実行時は、現在のページ内容を「基準スナップショット」として保存するだけで、差分通知は行われません。通知が動くのは 2 回目以降の実行で、前回保存内容との差分が検出されたタイミングです。テスト時にすぐ通知を出したい場合は、テスト用の URL を一度登録して基準を作り、別の URL に書き換えて再実行する、といった工夫が必要になります。

JavaScript で動的描画されるページは別扱い

前述の通り、url ジョブは HTTP レスポンスの生 HTML を扱うため、ブラウザ上で JavaScript により後から描画される要素は取得できません。このケースでは navigate ジョブと Playwright のセットアップが必要になります。

監視間隔は 30 分以上が公式推奨

公式ドキュメントでは、cron での実行間隔を 30 分より短くしないことが推奨されています。短時間での連続アクセスは監視先サイトへの負荷になるだけでなく、レート制限による IP ブロックにつながる場合があります。

Slack Incoming Webhook のレート制限

Slack の Incoming Webhook は仕様上、1 秒あたり 1 メッセージ程度のレート制限があります。多数のジョブを並列で監視している場合、変更がまとめて発生したタイミングで通知が抜け落ちる可能性があるため、差分を 1 メッセージにまとめて送信する設定を活用することが現実解になります。

Windows での文字コード問題

Windows 環境では、UTF-8 を含む urls.yaml を読み込む際に UnicodeDecodeError が発生することがあります。これは Windows のデフォルトコードページが影響しているためで、環境変数 PYTHONUTF8=1 を設定して回避できます。

参考: urlwatch Advanced Topics(公式ドキュメント)
“To work around this issue, Python 3.7 and newer have a new UTF-8 Mode that can be enabled by setting the environment variable PYTHONUTF8 to 1”
https://urlwatch.readthedocs.io/en/stable/advanced.html

PowerShell で恒久的に設定する場合は以下のように環境変数に登録します。

[System.Environment]::SetEnvironmentVariable('PYTHONUTF8', '1', 'User')

認証が必要なページの監視

ログイン後にしか見えないページを監視する場合、url ジョブの cookies キーや headers キーで Cookie や Authorization ヘッダを付与する形が一般的です。ただし、トークンの期限切れや 2 段階認証ページの介在によって監視が止まることがあるため、可能な範囲で 認証不要の RSS フィードや公開 API を優先する設計をおすすめします。

設定ファイルのパーミッション

urlwatch は、shellpipe フィルタや command ジョブを含む urls.yaml について、他ユーザーから書き込み可能(world-writable)になっているとそのジョブを無視する仕様があります。共用サーバーでは設定ファイルのパーミッションを 600(所有者のみ読み書き可)にしておくと安全です。

chmod 600 ~/.config/urlwatch/urls.yaml ~/.config/urlwatch/urlwatch.yaml

urlwatch と webchanges の違い

urlwatch を調べていると、よく似た名前の webchanges というツールに行き当たることがあります。webchanges は urlwatch 2.21(2020 年 7 月時点)のコードをベースに fork され、その後独自に機能拡張を続けているプロジェクトです。

参考: webchanges Documentation(公式)
“This project is based on code from urlwatch 2.21 dated 30 July 2020.”
https://webchanges.readthedocs.io/en/stable/

両者の主な違いを整理すると次のようになります。

比較軸urlwatchwebchanges
元プロジェクトオリジナル(Thomas Perl 氏)urlwatch 2.21 から fork
必要 Python バージョン3.x 系3.9 以上
ヘッドレスブラウザPlaywrightPlaywright
AI による変更要約なしあり(生成 AI を用いた差分の要約機能)
画像変更検知なしあり(差分箇所をハイライトした画像通知)
構造化データ監視テキスト diff 中心JSON / XML を要素単位で比較
HTML レポートテキスト中心クリック可能なリンク・書式保持・色分け強化
設定ファイルの互換性urlwatch 2.28 の設定をほぼそのまま流用可

どちらを選ぶべきか

urlwatch が向いているケース

  • 監視ジョブ数が少なく、シンプルな差分検知だけで十分な場合
  • 軽量・最小限の依存パッケージで運用したい場合

webchanges が向いているケース

  • 法務文書・規約ページ・脆弱性情報など、長文の差分を要約して読みたい場合
  • 画像(バナー・ステータスページの図示)の変化を追いたい場合
  • 監視対象が API(JSON / XML)の場合
  • HTML レポートを Slack や社内ポータルへ転載する運用で、読みやすさを重視する場合

移行の容易さ

webchanges への移行は比較的スムーズで、urlwatch 2.28 と互換のある設定ファイルをそのまま読み込ませて使い始められます。現時点で urlwatch を使っている場合でも、後から webchanges に切り替えるコストはそれほど高くありません。

参考: Upgrading from urlwatch(webchanges 公式)
“If you are using urlwatch 2.28, simply install webchanges and run it. It will find the existing urlwatch job and configuration files … it should run just fine as is.”
https://webchanges.readthedocs.io/en/stable/upgrading.html

まとめ

本記事では、urlwatch を使って Web サイトの更新を検知し、Slack や Gmail へ通知する仕組みを整理しました。

  • urlwatch 2.29 は Python 環境があれば OS を問わず導入可能
  • 設定ファイルは「監視対象(urls.yaml)」と「通知先(urlwatch.yaml)」の 2 系統に分かれている
  • フィルタを活用すれば、CSS セレクタや XPath で監視対象要素を絞り込める
  • Gmail の SMTP 通知では 2 段階認証とアプリ パスワードの利用が前提で、urlwatch --smtp-login でキーチェーン登録する方法が安全
  • JavaScript 描画ページは navigate ジョブと Playwright が必要で、リソース消費が増える点に注意
  • 長文要約・画像変更検知・JSON 監視などが必要なら、後継ツール webchanges の選択肢も検討できる

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次