Pythonで定期的にグローバルIPアドレスを記録する方法
こんにちは。先日ふと気になることがありました。とあるサービスでLinuxのインスタンスを作成した時に、「接続元のIPアドレスを制御しますか?」のような問題に遭遇しました。
会社で仕事をしていれば、(会社にもよりますが)1つないしは複数の特定のグローバルIPアドレスが使われていたりしますが、自宅は分かりません。マンションに敷いてあるものを使っているので、詳しい仕様もあまり調べていませんでした。
と、言うことで、定期的に自分が使っているグローバルIPアドレスを記録する方法をPythonで実現しようと思います。
概要
簡単な概要を書いておきます。シンプルです
- Pythonでコードを書く(スクリプトの作成)
- タスクスケジューラでNo.1のスクリプトを定期実行させる
- スクリプト実行の結果、CSVファイルが出力される。
CSVの出力イメージ
こんな感じでCSVに記録していきます。
どうやってグローバルIPアドレスを調べるか
世の中には便利なWebサイトがありまして、アクセスするとアクセス元のIPアドレス、すなわち自分が使ってくれるIPアドレスを教えてくれるサイトがあります。
セキュリティの都合上、上にメモ帳をおいてグローバルIPアドレスを隠していますが、ちゃんと表示されます。
Pythonでコードを書く
ここからがコーディングです。上記のサイトで表示されるIPアドレスを、簡単なWebスクレイピングで取得し、その結果を日時とともにCSVファイルに記録します。
### Import Python Standard Modules
import urllib
import urllib.request
import os
import csv
import datetime
### Import Python External Modules
from bs4 import BeautifulSoup
### Basic Parameters
url = "http://www.myglobalip.com/"
script_path = os.getcwd()
record_path = os.path.join(script_path, "result.csv")
### Execution Time
now_time = datetime.datetime.now()
execution_date = now_time.strftime('%Y/%m/%d')
execution_time = now_time.strftime('%H:%M:%S')
### Breaking through the Proxy
os.environ["http_proxy"] = "http://username:password@127.0.0.1:8080"
os.environ["https_proxy"] = "https://username:password@127.0.0.1:8080"
def get_via_bs4():
response = urllib.request.urlopen(url)
soup = BeautifulSoup(response, "lxml")
response.close()
div_ip = soup.find("div", id="ip")
h3 = div_ip.find("h3")
result = h3.select("span")[0].string
return result
def record_in_csv(arg_text):
if os.path.exists(record_path) == False:
with open(record_path, "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["Date", "Time", "Global_IP"])
with open(record_path, "a", newline="") as f:
writer = csv.writer(f)
writer.writerow([execution_date, execution_time, arg_text])
### Execution!!
global_ip = get_via_bs4()
record_in_csv(global_ip)
私もまだまだ初心者なので、コードが汚いのはお許しください。
タスクスケジューラに設定する
タスクスケジューラの使い方はインターネットで調べれば沢山でてきますし、そんなに難しくないので割愛しますが、私がハマった部分だけ書いておこうと思います。
上図はタスクスケジューラの「操作」を設定する画面ですが、入力ボックス3つに記載すべき事項についてです。なお、私のやり方であり、別にも解はあるので、一例として捉えてください。
プログラム/スクリプト(P) | python.exeのフルパスを記載する。 ※この時、Python仮想環境を使っている場合は、仮想環境内のpython.exeへのパスを記載する。 例:”C:\python_venv_name\Scripts\python.exe” |
引数の追加(オプション)(A) | スクリプトのファイル名(拡張子付き)を記載する。 例:”Get_Global_IP.py” |
開始(オプション)(T) | スクリプトが保存されているディレクトリを記載する。 例:”C:\python_venv_name” |
補足:プロキシについて
私はたまたま認証プロキシのある環境で開発したので、そのコードも記載しています。プロキシなんてないよという方は以下の部分をコメントアウトまたは削除してください。
### Breaking through the Proxy
os.environ["http_proxy"] = "http://username:password@127.0.0.1:8080"
os.environ["https_proxy"] = "https://username:password@127.0.0.1:8080"