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
xxxxxxxxxximport sysimport datetimeimport requestsimport 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.pyorpython global_ip_checker.py
Result
Mac
Darwin123.123.123.123
Windows
Windows123.123.123.123
出力なし
Command
python3 global_ip_checker.py noPrintorpython 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 pipefailSCRIPT_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
xxxxxxxxxxcrontab -e
でcronを開く.
すると, cronの設定がviで開かれる.
i を押してinsert modeに入った後, 下記のように設定し, esc を押してから :wq を入力し, Enter を押すと保存され, 設定完了
- 1時間ごとに実行
xxxxxxxxxx0 * * * * /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 | 林檎コンピュータ

