WEBページ監視プログラム作った

WEBページ監視プログラム作った

WEB予約が取れないときや、人気があってすぐに埋まってしまうとき用に、WEBページ監視プログラムを作りました。

概要を軽く説明すると、数分毎(アタックにならない程度)にHEADリクエストを送り、対象ページのLast-Modified(更新時間)を確認して記録、前回の記録と比較します。
もし変化していれば、ページが更新されたということなので、アラートを飛ばすという流れです。

ただ、対象ページのHTTPレスポンスヘッダにLast-Modifiedを出力していないWEBサーバー上にある場合は少々異なります。
その場合はまず、GETリクエストで1ページ丸ごと取得し、hash(MD5やsha256など)値を記録します。

以降、この取得したHTMLを使ってハッシュ値(MD5やSHA-256)を計算した上で、前回と比較。
この値が変化していたらページが更新されたということなので、同じようにアラートメールを発信する。
あとはこれをcrontabなどで数分ごとに自動実行するって感じです。

アラートが届いたら後は手作業で予約(や注文等)をする必要があり、完全自動ではありませんが、夜中ずっと起きてF5アタック笑 する必要はありません。

あと、ファイルの改ざん検出の手法を応用したものなので(改ざんでなく更新と見なす)
対象ページが1文字でも書き換わるといちいち通知してきます笑
自分が望んでいる更新かどうかを区別する機能はありません。
※動的に挿入される広告などがあると常にページの内容が変わり続けるため使えません。

と、一通り説明しつつ自分自身あまり使う場面が思い浮かばない笑
一応これを応用すればAmazonの在庫監視プログラムは作れる(作った)

下記、Pythonでの記述例です。

import hashlib
import requests
import smtplib
from email.message
import EmailMessage
from datetime import datetime
import os

# 設定
URL = "http://example.com"  
# 監視対象ページ
EMAIL = "xxx@email.com"      
# 通知先メールアドレス
APP_PASSWORD = "password"  
# メールパスワード
HASH_FILE = "/Users/name/xxx.txt"  
# ハッシュ値保存先(絶対パス)

# ページ取得とハッシュ算出
res = requests.get(
  URL, timeout=10)
page_hash = 
hashlib.sha256(
res.text.encode("utf-8")).
hexdigest()

# 前回のハッシュ読み込み
if os.path.exists(HASH_FILE):
    with open(
    HASH_FILE, "r") as f:
      previous_hash = 
      f.read().strip()
else:
    previous_hash = None

# ハッシュ差分検知 → 通知
if page_hash != previous_hash:
    now = datetime.now().strftime
    ("%Y年%m月%d日(%a)%H:%M:%S")
    body = f"ページが更新されたよ!
    \n{now}\n{URL}"

    msg = EmailMessage()
    msg["Subject"] =
    "【ページ更新通知】"
    msg["From"] = EMAIL
    msg["To"] = EMAIL
    msg.set_content(body)

    with smtplib.SMTP(
     "smtp.gmail.com", 587)
        as server:
        server.starttls()
        server.login(
        EMAIL, APP_PASSWORD)
        server.send_message(msg)

    with open(HASH_FILE, "w") 
    as f:
      f.write(page_hash)


これをcrontabなどで定時に実行します。
下記は5分ごとに実行する記述例。
※ファイルパスは環境に合わせてください。

$ crontab -e
*/5 * * * * /usr/bin/python3 
/Users/xxx/xxx.py



Githubリポジトリ
https://github.com/haruharu9000/monitor

公開日: 2025/7/20