Python初心者なので許してちょ()
固定IPじゃないけどサーバー立ててる
IPアドレスは固定IPと動的IPがあると言うのは一般常識だとは思いますが、
サーバーとかそういうのは基本的に固定IPを使うのがいいんでしょう。
ホントは固定IPがいい!!
ですがガキンチョな私におうちのネットに口を出す権限がないので…
力技でなんとかやってみました。
本編
実装した機能
- ドメインからIPを
- IPにpingを
- 疎通しなかったらLINEで通知を
って感じ。一番最後のLINEによる通知はLINENotifyAPIを使用するので適宜アクセストークンを取得しておいてください。
コード
import socket
import subprocess
import requests
import time
domain_name = "your.domain.com"
token = "LINENotifyのトークン"
notify_url = "https://notify-api.line.me/api/notify"
header = {"Authorization": "Bearer " + token,} #ヘッダーの設定
interval = 1800 #チェック間隔(秒)
while True:
ip_address = socket.gethostbyname(domain_name) #ドメインからIPを
print(f"{domain_name} のIPアドレス: {ip_address}") #適当に表示させてみた
response = subprocess.call(['ping','-c','4',ip_address]) #pingを実行
if response == 0:
print(f"{ip_address}は疎通しています") #レスポンス帰ってきたらこれ
else:
print(f"{ip_address}は疎通していません")
ng = f"{domain_name}({ip_address})は疎通していません"
ng_post = requests.post(notify_url, headers=header, data={"message":ng}) #疎通してなかったら通知を送信
time.sleep(interval)
偉そうにコードの解説
まず使用するライブラリはIP取得用のsocket
,ping実行用のsubprocess
,LINEにpostする用のrequests
,インターバル用のtime
になります。
必要であればpip install
してください。
次はもろもろの設定です。
ドメインやトークン、post時のheaderなどですね。interval
の値は単位が秒になっています。今回の例では30分になっています。
あとはIPアドレスを取得、socket.gethostbyname(domain_name)
のところですね。
ここで取得したIPに対してpingコマンドを実行。
レスポンスが帰ってきたらただ疎通しましたよ〜とprintするだけ、
帰ってこなかったらLINENotifyで通知を送信。
これを指定した間隔で実行しているだけです。
以上
私はまじでpython初心者なので必要最低限な機能だけ。
なんでこんな回りくどいことしてるんだとか言わないでくださいね!!
screenで起動するためのshファイル
screenで永遠にping pongしてもらいます。
screen -Sdm check python3 check.py