毎日15分を自動化!PythonとGitHub Actionsで作る『自分専用・更新通知エージェント』
なぜ、私たちは「情報収集」というルーチンに時間を奪われるのか
毎日、決まったサイトの更新を確認していませんか?
「あの技術ブログ、新しい記事が出ていないか確認しなきゃ」「このツールのドキュメント、バージョンアップされていないかな」
これ、私もかつては毎朝30分かけてやっていました。しかし、40代になって体力と集中力が限られてくると、この「単純な確認作業」がいかに生産性を下げているかに気づかされました。エンジニアとしてコードを書くべき時間に、ただブラウザの更新ボタンを叩くだけの作業。これが毎日積み重なれば、年間で何十時間という損失になります。
今回は、そんな「見逃せないが、確認は面倒」という情報を、PythonとGitHub Actionsを使って完全に自動化する仕組みをご紹介します。これさえ設定すれば、朝起きた時にあなたのスマホには「必要な情報」だけが届いている状態を作れます。
自動化システムの全体像を理解する
今回構築するのは、サーバーを用意せずに無料で運用できる「クラウド型クローラー」です。構成は非常にシンプル。GitHub上のリポジトリに置いたPythonスクリプトが、GitHub Actionsのスケジュール機能(Cron)によって自動実行される仕組みです。
graph TD
A["GitHub Actions (定期実行)"] --> B["Pythonスクリプト実行"]
B --> C["対象サイトへアクセス"]
C --> D{"データに変更があるか?"}
D -- "YES" --> E["通知を送信 (Discord/Slack/Email等)"]
D -- "NO" --> F["何もしない"]
ポイントは「環境構築コストゼロ」であること。Pythonが動くPCが手元になくても、GitHubさえあれば24時間365日、あなたの代わりに巡回してくれます。
実践:更新監視スクリプトの実装
まずは、Webサイトの更新を検知するPythonコードの基本形です。特定の要素を取得し、前回の結果とハッシュ値を比較することで更新を判断します。
import requests
from bs4 import BeautifulSoup
import hashlib
def check_site_update(url, target_selector):
# サイトにアクセスしてコンテンツを取得
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
content = str(soup.select(target_selector))
# コンテンツのハッシュ値を計算
current_hash = hashlib.md5(content.encode()).hexdigest()
# 比較用ハッシュをファイルに保存
try:
with open("last_hash.txt", "r") as f:
last_hash = f.read()
except FileNotFoundError:
last_hash = ""
if current_hash != last_hash:
with open("last_hash.txt", "w") as f:
f.write(current_hash)
return True
return False
経験から学ぶ「通知の最適化」
実は、最初の実装で失敗したことがあります。それは「更新があるたびに毎回通知を送る」という設定にしたこと。対象サイトが細かく修正を入れるタイプだったため、スマホが通知の嵐になり、結局「通知を見ない」という本末転倒な事態に陥りました。
この経験から、「重要な変化だけを検知する」ことの重要性を学びました。ハッシュ値を比較するだけでなく、特定のキーワードが含まれる場合のみ通知するなど、フィルタリングを一段挟むのが運用のコツです。
GitHub Actionsによる定期実行設定
このスクリプトをGitHubにプッシュし、以下のYAMLファイルを .github/workflows/monitor.yml として保存するだけで、毎日自動で実行されます。
name: "Site Monitor"
on:
schedule:
- cron: "0 8 * * *" # 毎日朝8時に実行
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Set up Python"
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: "Install dependencies"
run: pip install requests beautifulsoup4
- name: "Run script"
run: python monitor.py
env:
WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}
- name: "Commit result"
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add last_hash.txt
git commit -m "Update hash" || echo "No changes"
git push
この設定の最大の肝は、git commit と git push を自動化している点です。これにより、前回のハッシュ値をリポジトリ自体に永続化できるため、別途データベースサーバーなどを立てる必要がありません。
導入時の注意点とエンジニアとしての視点
この自動化を導入するにあたって、2点だけ注意してください。
- スクレイピングのマナー: 相手のサーバーに過度な負荷をかけないこと。
requestsを送る際はtime.sleepを挟むなど、常識的な間隔を開けるようにしてください。 - セキュリティ: 通知用のWebhook URLなどは、GitHubのSecrets機能を使って環境変数として管理してください。決してコード内に直接記述(ハードコーディング)してはいけません。
エンジニアとしてこのツールを運用し始めてから、私の朝の時間は「情報の取捨選択」から「情報の咀嚼(そしゃく)」へと変わりました。自動化は単なる怠慢ではなく、「自分の頭で考える時間を守るための防衛策」です。
まとめ:まずは「1サイト」から始めよう
今回ご紹介した仕組みは、最初は少し手間だと感じるかもしれません。しかし、一度動いてしまえば、あなたの代わりに毎日働いてくれる頼もしい相棒になります。
- ステップ1: 毎日確認しているWebサイトを1つ選ぶ。
- ステップ2: 上記のPythonコードで、そのサイトの特定のHTML要素を抽出するスクリプトを書く。
- ステップ3: GitHub Actionsで1日1回動かしてみる。
まずはこの小さな成功体験を積み重ねてみてください。自動化の快感を知ると、日常のあらゆる面倒なルーチンが「自動化のチャンス」に見えてくるはずです。
もしコードの書き方や、特定の通知サービス(LINE Notifyなど)との連携で詰まったら、公式ドキュメントや関連コミュニティを参考にしてください。皆さんの生活が、少しでも効率的で創造的なものになることを願っています。