RaspberryPi起動時にDiscordにIPアドレスを通知する
概要
以前、同じことをLINEでやっていたのですが、LINE Notifyがサービス終了となってしまい使えなくなってしまいました。
そのためDiscordのウェブフック機能に移行しようというのが趣旨です。以前の記事はQiitaに書いていたので、LINEと被る部分も改めて解説します。
実行環境
MCU:Raspberry Pi 4 Model B Rev 1.5
OS:Raspberry Pi OS 12 (bookworm)
手順
ウェブフックURLの取得
通知したいテキストチャンネルの「チャンネルの編集」をクリックします。

「連携サービス」の「ウェブフック」をクリックします。

「新しいウェブフック」をクリックすると新しい項目が追加されるのでクリックします。

「お名前」にわかりやすい名前を入力し、「ウェブフックURLをコピー」をクリックするとURLがコピーされます。
このURLは後ほど使うのでメモ帳等に貼り付けて保存しておいてください。

メッセージ送信プログラムを作成
Discordにメッセージを送るためのプログラムをPythonで作成します。
以下のコマンドでソースファイルを新規作成します。
$ nano startup.py
以下のソースをコピペしてください。webhook_url
には先ほど取得したウェブフックURLを貼り付けます。
※標準ライブラリばかりなので事前準備なしでも動くはずです。
完了したらCtrl+sで保存、Ctrl+xで終了します。
# -*- coding: utf-8 -*- import requests import json import time import socket # DiscordのWebhook URL webhook_url = "**************************************" def sendMessage(message: str): # 送信前の準備 headers = {"Content-Type": "application/json"} payload = {"content": message} # 送信 response = requests.post(webhook_url, data=json.dumps(payload), headers=headers) # 送信の完了確認 if response.status_code == 204: print(f"postが正常に送信されました") else: print(f"送信エラーが発生しました。エラーコード:{response.status_code}") if __name__ == "__main__": # サーバー起動直後に送信すると上手くいかないときがあるため少し待機 time.sleep(10) # ローカルIPアドレスを取得して表示 connect_interface = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) connect_interface.connect(("8.8.8.8", 80)) local_ip = connect_interface.getsockname()[0] connect_interface.close() print(f"ローカルIPアドレス: {local_ip}") # グローバルIPアドレスを取得して表示 response = requests.get("https://api.ipify.org?format=json") global_ip = response.json()["ip"] print(f"グローバルIPアドレス: {global_ip}") # サーバー起動メッセージを送信 sendMessage(f"サーバーが起動しました。\nローカルIPアドレス: {local_ip}\nグローバルIPアドレス: {global_ip}")
プログラムの動作確認
ターミナルで以下のコマンドを打ち込んでプログラムを起動します。
$ python startup.py ローカルIPアドレス: 192.168.***.*** グローバルIPアドレス: ***.***.***.*** postが正常に送信されました
上記のように出力されてDiscordに通知が飛んだら成功です。
「送信エラーが発生しました。」と出力された場合は、エラーコードでググって原因を探ってください。
Raspberry Pi起動時にプログラムを実行する
作成したプログラムをsystemdにサービスとして登録して、起動時に実行されるように設定します。
以下のコマンドでサービスファイルを新規作成します。
$ sudo nano /etc/systemd/system/startup.service
以下のソースを貼り付けて保存します。
※ユーザー名を「pi」以外に設定している場合、7行目のリンクの「pi」の部分をユーザー名に変更してください。
[Unit] Description=Discord Message at StartUp After=multi-user.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /home/pi/startup.py TimeoutStopSec=5 [Install] WantedBy = multi-user.target
作成したサービスファイルを読み込んで、自動起動の設定をします。
2行目のコマンドで通知が飛ばない場合はサービスファイルに不備があるので修正してください。sudo systemctl status startup.service
でエラー情報が確認出来ます。(確認画面からは「q」で抜けられます)
$ sudo systemctl daemon-reload $ sudo systemctl start startup.service (ここで通知が届く) $ sudo systemctl enable startup.service
通知の動作確認
Raspberry Piを再起動してみます。
起動時にDiscordに通知が飛んだら成功です。
ディスカッション
コメント一覧
まだ、コメントがありません