RaspberryPi起動時にDiscordにIPアドレスを通知する

2025年9月9日技術開発Discord,Raspberry Pi

概要

以前、同じことを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に通知が飛んだら成功です。