このブログ記事では、UbuntuなどのLinuxシステム上でネットワークインターフェースのIPアドレスを取得し、LINE Notifyを通じてそのIPアドレスを通知するPythonスクリプトの作成方法を解説します。
このスクリプトは、システムの起動時に自動的にIPアドレスを取得し、ネットワーク接続が確立されていることを確認するのに便利です。
Pythonの基本的な知識があれば簡単に実装できるため、ぜひ試してみてください。
環境
OS:Ubuntu 22.04 Desktop
ハードウェア:Intel NUC(x86)
LINE Notifyとは
LINE Notifyは、LINEユーザーが簡単にLINEメッセージを送信するためのサービスです。
通知メッセージをLINEアカウントやグループに送ることができ、様々な用途に利用されています。特に、サーバー監視やIoTデバイスからの通知、個人のタスク管理やリマインダーなど、リアルタイムでの通知が必要なシーンで役立ちます。
LINE Notifyの主な特徴と機能
- 簡単なAPIインターフェース LINE NotifyはシンプルなREST APIを提供しており、少ないコードでメッセージを送信できます。HTTPリクエストを使用してメッセージを送るため、どのプログラミング言語からも簡単に利用できます。
- 個人・グループへの通知 個人のLINEアカウントやグループチャットにメッセージを送信することが可能です。グループに通知を送る場合は、通知を受け取りたいグループに対して事前にLINE Notifyを連携させておく必要があります。
- カスタマイズ可能なメッセージ テキストメッセージの他に、スタンプや画像、リンクを含むリッチなメッセージを送ることができます。これにより、通知内容を視覚的にわかりやすくすることができます。
LINE Notifyの登録とトークンの取得方法
LINE Notifyの登録方法は以下の記事で解説していますので、事前に済ませておいてください。
ライブラリのインストール
requests
ライブラリとは
requests
ライブラリは、PythonでHTTPリクエストを簡単に送信するための強力で使いやすいライブラリです。ウェブサービスとの通信やAPIの利用、ウェブページの取得など、さまざまなネットワークリクエストを容易に実装することができます。以下に、requests
ライブラリの主な機能と特徴を紹介します。
特徴と利点
- 簡単なインターフェース
requests
はシンプルで直感的なインターフェースを提供しており、初心者でもすぐに使い始めることができます。HTTPリクエストを送信するための関数(get
,post
,put
,delete
, など)が用意されており、各関数は直感的な方法で使用できます。 - 豊富な機能
- HTTPメソッドのサポート: GET、POST、PUT、DELETEなどの一般的なHTTPメソッドをサポートしています。
- URLパラメータの簡単な追加: パラメータを簡単に追加するためのオプションが用意されています。
- ヘッダーのカスタマイズ: カスタムヘッダーを追加することができ、認証や特定のヘッダーが必要なリクエストも簡単に行えます。
- タイムアウト設定: リクエストのタイムアウトを設定することで、レスポンス待ち時間を制御できます。
- レスポンスの扱いやすさ
requests
は、レスポンスオブジェクトを通じてHTTPレスポンスの内容を簡単に扱うことができます。レスポンスのステータスコード、ヘッダー、テキストやJSON形式のボディなどにアクセスできます。
requests
ライブラリのインストール手順
requests
ライブラリはPythonの標準ライブラリには含まれていないため、別途インストールが必要です。以下のコマンドを使用してインストールできます。
pip install requests
作成したPythonコード
コード解説
インポートモジュールの説明
requests
: HTTPリクエストを送信するためのライブラリ。LINE Notify APIにメッセージを送信するのに使用します。socket
: ネットワーク接続を操作するためのライブラリ。IPアドレスを取得するために使用します。fcntl
: ファイル操作を行うためのライブラリ。ネットワークインターフェースの情報を取得するのに使用します。struct
: バイナリデータの処理を行うためのライブラリ。ネットワークインターフェースの情報をフォーマットするのに使用します。time
: 時間関連の操作を行うためのライブラリ。スクリプトの実行を遅延させるのに使用します。
APIのURLとトークンの設定
url
: LINE Notify APIのエンドポイントURL。access_token
: LINE Notifyのアクセストークン。事前に取得したものを設定します。
送信するメッセージの初期設定
message
: 通知メッセージの初期設定。ここでは「Raspberry Piからの通知:\n」を設定しています。
IPアドレスを取得する関数 get_ip_address(ifname)
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
: IPv4アドレスを使用するソケットを作成します。fcntl.ioctl()
: 指定されたインターフェース名(例: “wlp2s0″)に対して操作を行い、IPアドレスを取得します。socket.inet_ntoa()
: バイナリ形式のIPアドレスを文字列形式に変換します。try-except
ブロックで、インターフェースが見つからない場合のエラーハンドリングを行います。
メイン関数 main()
get_ip_address("wlp2s0")
: 指定されたインターフェース名のIPアドレスを取得します。- メッセージにIPアドレスを追加します。
requests.post()
: LINE Notify APIにメッセージをPOSTリクエストとして送信します。
スクリプトの実行部分
time.sleep(30)
: スクリプトの実行を30秒間遅延させます。ネットワークが確立されるまでの待機時間として使用します。main()
: メイン関数を呼び出して、IPアドレスの取得とLINEへの通知を実行します。
作成した全体のソースコード
作成した全体のソースコードは以下の通りです。
import requests
import socket
import fcntl
import struct
import time
# APIのURLとトークン
url = "https://notify-api.line.me/api/notify" # URL
access_token = "(ここに取得したトークンを設定)" # 取得したトークン
# 送信するメッセージを設定
message = "Ubuntuからの通知:\n"
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
ip_address = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15].encode('utf-8')))[20:24])
except IOError:
ip_address = "Error: ネットワークインターフェースが見つかりません。"
return ip_address
def main():
# IPアドレスの取得
ip_address = get_ip_address("wlp2s0") # Ethernet接続の場合は "enp0s25"、無線LANの場合は "wlp2s0" を指定
global message
message += "IPアドレス: " + ip_address
headers = {"Authorization": "Bearer " + access_token}
send_data = {"message": message}
# メッセージを送信
result = requests.post(url, headers=headers, data=send_data)
print("Send Message")
print(result)
if __name__ == "__main__":
time.sleep(30) # 30秒間待機
main()
実行結果
Ubuntuのマシンを起動すると以下のようにLINEに通知が届きました。
LINE NotifyをRaspberry Piと共用しているので送信元はRaspberry Piになってしまっていますが、メッセージが「Ubuntuからの通知」となっていることが確認できます。
まとめ
この記事では、Pythonを使用してLinuxシステム上のネットワークインターフェースからIPアドレスを取得し、それをLINE Notifyを通じて通知する方法について解説しました。
必要なライブラリのインストール手順やコードの詳細な説明を通じて、このスクリプトがどのように動作するかを理解していただけたと思います。
ネットワークの状況を確認するための便利なツールとして、このスクリプトを活用してみてください。
コメント