これは、気象庁(JMA)から気象警報・注意報を取得し、東京23区に関する情報を指定されたDiscordチャンネルに通知するPythonベースのDiscordボットです。
- 定期的に最新の気象庁XMLフィードを取得します。
- XMLデータを解析し、警報情報を抽出します。
- 東京23区に関連する警報のみをフィルタリングします。
- 整形された警報メッセージをDiscordチャンネルにWebhook経由で送信します。
- 送信済みメッセージのIDを保存することで、重複した警報の送信を防ぎます。
- 解除電文(取消/解除)を検知し、解除用のDiscord埋め込みメッセージを送信します。
- Python 3.10以上
- パッケージ管理のための
uv(またはpip)
-
リポジトリをクローンします:
git clone https://github.com/tsukuba-denden/keihou-bot.git cd keihou-bot -
uvを使用して依存関係をインストールします:uv pip install -r requirements.txt
または、
uvがインストールされている場合は、仮想環境の作成と依存関係のインストールを一度に行うことができます:uv venv uv sync
ボットを実行するには、uv run を使用して main.py スクリプトを実行します。
uv run python -m src.mainこのコマンドは、uv が管理する仮想環境内で python -m src.main を実行するため、仮想環境を事前に有効化する必要がありません。
ボットが起動し、デフォルトで5分ごとに気象庁のフィードからデータを取得し、新しい警報をDiscordに投稿します。
実際に警報が出ていない時でも、以下の方法でパイプライン全体を検証できます。
- サンプルXMLでシミュレート
PowerShell (Windows):
uv run python -m src.main --once --simulate "samples/tokyo-warning-sample.xml" --dry-runポイント:
- 解除シナリオの簡易検証は、
--simulateを2回変えて実行(1回目: 発表、2回目: 解除(Head/InfoType=取消 または Kind/Status=解除 を含むXML))。 --force-sendを付けると、保存済みでも送信ロジックを通すことができます(テスト・検証用)。
- 既存のフィードURLを使いつつドライラン
$env:JMA_FEED_URL = "https://www.data.jma.go.jp/developer/xml/feed/extra.xml"
uv run python -m src.main --once --dry-run- 送信の抑止(環境変数)
--dry-run の代わりに、環境変数でも指定できます。
$env:DRY_RUN = "true"
uv run python -m src.main --once --simulate "samples/tokyo-warning-sample.xml"- 重複送信の確認
送信済みIDは data/sent_ids.json に保存されます。クリーンな状態で試すときはファイルを削除してください。
Remove-Item -Force .\data\sent_ids.jsonもしくは、保存済みでも送る/保存しないオプションが使えます。
uv run python -m src.main --once --simulate "samples/tokyo-warning-sample.xml" --force-senduv run python -m src.main --once --simulate "samples/tokyo-warning-sample.xml" --no-storedata/sent_ids.json は、これまで「送信済みIDの配列」でしたが、解除状態の管理のため「{"<id>": "active|cancelled"} のマップ」に拡張されました。既存ファイルは自動で後方互換的に読み込まれます(配列はすべて active とみなされます)。
解除を受け取った場合は、既存IDの状態が cancelled に更新され、解除専用の埋め込み(タイトル「【解除】気象警報・注意報」)が送信されます。
設定は環境変数で管理されます(.env 自動読み込み対応)。
| 変数名 | 説明 | デフォルト値 |
|---|---|---|
DISCORD_WEBHOOK_URL |
必須。 警報を送信するDiscordのWebhook URL。 | None |
JMA_FEED_URL |
監視対象の気象庁XMLフィードのURL。 | https://www.data.jma.go.jp/developer/xml/feed/extra.xml |
FETCH_INTERVAL_MIN |
ボットが新しい警報をチェックする間隔(分)。 | 5 |
DATA_DIR |
送信済み警報IDのリストなど、永続的なデータを保存するディレクトリ。 | data/ |
ROLE_ID |
学校ガイダンスの「登校時間が通常と異なる日」に、サーバーの特定ロールへメンションするためのロールID。 | None(未設定ならメンションしません) |
SCHOOL_NORMAL_TIME |
平常授業時の登校時刻(ロールメンションの基準値)。例: 08:10 |
08:10 |
ルートディレクトリに.envファイルを置くと、起動時に自動で読み込まれます(既にシェルで設定済みの環境変数があれば、そちらが優先されます)。
DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/your/webhook_url"
FETCH_INTERVAL_MIN=10
# 学校ガイダンスのメンション設定(任意)
ROLE_ID=123456789012345678
SCHOOL_NORMAL_TIME=08:10
PowerShell セッションで一時的に上書きしたい場合は、従来どおり $env:VAR=value で設定できます。
このプロジェクトはMITライセンスの下でライセンスされています。詳細はLICENSEファイルを参照してください。