
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