Global IPを定期確認する
目次
Requirement
OS: Mac, Windows
python3
- datetime
- requests
- platform
- os (Mac)
- plyer (Windows)
Tested Environment
Mac
- macOS Big Sur 11.5.2 on M1 MacBook Air 2020
Windows
- Windows 10 pro (Insider program, 21354.1) on Parallels on M1 MacBook Air 2020
- Windows 10 pro on Desktop PC
Code
global_ip_checker.py
xxxxxxxxxx
import sys
import datetime
import requests
import platform
def getGlobalIP():
response = requests.get('http://inet-ip.info/ip')
_globalIP = ''.join(response.text.splitlines())
return _globalIP
def readPreviousGlobalIP(_fileName):
try:
f = open(_fileName, 'r', encoding='UTF-8')
_previousGlobalIP = f.read()
f.close()
except:
_previousGlobalIP = "123.123.123.123"
return _previousGlobalIP
def showNotificationOnMac(_message, _title="", _subtitle="", _sound=""):
# _sound: Blow,Bottle,Frog,Funk,Glass,Hero,Morse,Ping,Pop,Purr,Sosumi,Tink
os.system("osascript -e 'display notification \"" + _message + "\" with title \"" + _title + "\" subtitle \"" + _subtitle + "\" sound name \"" + _sound + "\"'")
def showNotificationOnWindows(_message, _title="", _app_name="", _app_icon="", _timeout=5):
notification.notify(
title=_title,
message=_message,
app_name=_app_name,
app_icon=_app_icon,
timeout=5
)
def checkGlobalIPChangingAndNotification(_globalIP, _previousGlobalIP):
if _globalIP != _previousGlobalIP:
_platformSystem = platform.system()
# print(_platformSystem)
_title = "Global IP was changed"
_message = "New Global IP: " + _globalIP
if _platformSystem == "Darwin":
showNotificationOnMac(_message, _title=_title)
elif _platformSystem == "Windows":
showNotificationOnWindows(_message, _title=_title)
_changedFlag = ", changed"
else:
_changedFlag = ""
return _changedFlag
def writeGlobalIPIntoLog(_logFileName, _globalIP, _changedFlagStr):
dtNow = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
f = open(_logFileName, 'a', encoding='UTF-8')
f.write(dtNow + ', ' + _globalIP + _changedFlagStr + '\n')
f.close()
def writeGlobalIPIntoTxt(_checkFileName, _globalIP):
f = open(_checkFileName, 'w', encoding='UTF-8')
f.write(_globalIP)
f.close()
def mainProcess():
checkFileName = 'global-ip.txt'
logFileName = 'global-ip-log.txt'
# importOSRelatedLibraries()
globalIP = getGlobalIP()
if IsPrint: print(globalIP)
previousGlobalIP = readPreviousGlobalIP(checkFileName)
changedFlagStr = checkGlobalIPChangingAndNotification(globalIP, previousGlobalIP)
writeGlobalIPIntoLog(logFileName, globalIP, changedFlagStr)
writeGlobalIPIntoTxt(checkFileName, globalIP)
# ==============================================================================================================
if __name__ == "__main__":
IsPrint = True
if len(sys.argv) == 2:
if sys.argv[1] == "noPrint":
IsPrint = False
platformSystem = platform.system()
if IsPrint: print(platformSystem)
if platformSystem == "Darwin":
import os
elif platformSystem == "Windows":
from plyer import notification
mainProcess()
2021/10/16 追記
某場所からアクセスした際に, グローバルIPの値が謎の文字列になってしまうことがあったため, グローバルIPの取得先を変更した
Usage
CUIウィンドウ内の出力
出力あり
Command
python3 global_ip_checker.py
or
python global_ip_checker.py
Result
Mac
Darwin
123.123.123.123
Windows
Windows
123.123.123.123
出力なし
Command
python3 global_ip_checker.py noPrint
or
python global_ip_checker.py noPrint
Result
出力なし
共通の結果
global-ip-log.txt
: Global IPの履歴global-ip.txt
: Global IPの1回分の記録. 変更があったかの判断材料
Global IPが変わると下図のようなnotificationが出る
Mac | Windows |
---|---|
定期実行化
Mac
Automatorの方法もあるが, 毎日1回が最小間隔なのでやめた. cronでの実装にした.
Shell
global_ip_checker.sh
set -CEuo pipefail
SCRIPT_DIR=$(cd $(dirname $0) && pwd)
cd ${SCRIPT_DIR}
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 global_ip_checker.py noPrint
python3の記述を絶対パスつきにしないとpython2系で実行されてしまうので注意
例:
python3 global_ip_checker.py
だとcronからの実行時にはpython global_ip_checker.py
として処理されてしまう
ファイル配置
実行前
├── global_ip_checker.py
└── global_ip_checker.sh
実行後
├── global-ip-log.txt
├── global-ip.txt
├── global_ip_checker.py
└── global_ip_checker.sh
cron
xxxxxxxxxx
crontab -e
でcronを開く.
すると, cronの設定がviで開かれる.
i を押してinsert modeに入った後, 下記のように設定し, esc を押してから :wq
を入力し, Enter を押すと保存され, 設定完了
- 1時間ごとに実行
xxxxxxxxxx
0 * * * * /Users/ks/pythonTest/global_ip_checker/global_ip_checker.sh
- 2分ごとに実行
xxxxxxxxxx
*/2 * * * * /Users/ks/pythonTest/global_ip_checker/global_ip_checker.sh
以上で定期実行されるはず.
場合によっては...
ポップアップ
crontabを:wq
で閉じた際に, 下図のポップアップが出たときはOK
を押す.
通常, crontabの設定を変更した際に出てくる.
terminalにYou have new mail.
というメッセージが出る
Macターミナル - You have mail と表示された場合の対処法 | PC設定のカルマ
xxxxxxxxxx
と打って, mail閲覧のモードに入ったら,
1
,2
等を入力して Enterを押せば, mailの中身が見れる.q
を入力して Enterを押せば, mail閲覧モードから通常のterminalに戻る
cronが実行されない
cronにアクセス権がないことが原因かも.
crontabでシェルスクリプトが実行できないときの対処法。macのシステム環境設定が必要です。 が参考になる.
System Preferences
のSecurity & Privacy
を開くFull Disk Access
で+
を押し/usr/sbin/cron
を追加- その
cron
にチェックが入れる
主な参照
- Macでスクリプトを自動実行する【cronとAutomator】
- crontabでシェルスクリプトが実行できないときの対処法。macのシステム環境設定が必要です。
- Macターミナル - You have mail と表示された場合の対処法 | PC設定のカルマ
参照
- macでIPアドレスをコマンドで確認する方法 - Qiita
- Macでスクリプトを自動実行する【cronとAutomator】 - Selfs Ryo Com
- ターミナルからmacの通知センターに投稿する - Qiita
- julienXX/terminal-notifier: Send User Notifications on macOS from the command-line.
- mac OSの通知が来ないときの切り分け - Qiita
- Pythonを使ったデスクトップ通知の実装 - Qiita
- 【Plyer】Pythonで通知バナー(トースト通知)を簡単に実現する | ジコログ
- mac python plyer 通知 でない - Google 検索
- Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ | DevelopersIO
- Python | テキストファイルを読み込む
- Pythonで改行を含む文字列の出力、連結、分割、削除、置換 | note.nkmk.me
- python 文字 変数 改行 - Google 検索
- Python | テキストファイルへ書き込む
- Pythonで現在時刻・日付・日時を取得 | note.nkmk.me
- Pythonの例外処理(try, except, else, finally) | note.nkmk.me
- 【Mac】Pythonスクリプトを自動実行する | masablog
- 「ルーター配下のクライアントPCでルーターのグローバルIPを取得」(1) Linux Square - @IT
- tracert - Google 検索
- Windows 10でLinuxコマンドを実行する方法 (1) | TECH+
- WSLをインストールする - Qiita
- Global IPの確認方法 - Qiita
- Linux コマンドでグローバルIPを調べる方法 - weblog of key_amb
- ifconfig.io
- Convert curl command syntax to Python requests, Ansible URI, browser fetch, MATLAB, Node.js, R, PHP, Strest, Go, Dart, Java, JSON, Elixir, and Rust code
- Python, Requestsの使い方 | note.nkmk.me
- 【Plyer】Pythonで通知バナー(トースト通知)を簡単に実現する | ジコログ
- Macの通知センターにPythonから通知する - Qiita
- Plyerを使用しPythonでデスクトップ通知する(Windows10) | Men of Letters(メン・オブ・レターズ) – 論理的思考/業務改善/プログラミング
- windows notification api - Google 検索
- pip: Python環境構築ガイド - python.jp
- JPEG/PNG/GIFからアイコンを作成する「アイコン コンバータ」
- Pythonが実行されている環境のOSやバージョン情報などを取得 | note.nkmk.me
- ImageMagickでfaviconを作成する | mintsu's blog
- Python Requestsをインストールする方法 | 鎖プログラム
- applescript python notification title - Google 検索
- OSAX/標準機能追加/display notification
- Pythonの関数でのデフォルト引数の使い方と注意点 | note.nkmk.me
- mac applescript notification 音 消す - Google 検索
- windowsでanaconda環境をコマンドプロンプトからでも使用可能にする - Qiita
- python - Requests (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.") Error in PyCharm requesting website - Stack Overflow
- windows10でPythonスクリプトを定期的に自動実行する方法 タスクスケジューラ - なろう分析記録
- Linuxコマンド【 history 】コマンド履歴をリスト表示 - Linux入門 - Webkaru
- Macターミナル - You have mail と表示された場合の対処法 | PC設定のカルマ
- 【Mac】定期的にスクリプトを実行する crontab | 林檎コンピュータ