日本に割り当てられているIPアドレスを表示するpythonスクリプトを作った
日本に割り当てられているIPアドレスを表示するpythonスクリプトを作りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# -*- coding: utf-8 -*- import sys import urllib2 from math import log try: response = urllib2.urlopen("http://ftp.apnic.net/stats/apnic/delegated-apnic-latest") except urllib2.HTTPError, e: sys.stderr.write("IPアドレスの一覧を取得できませんでした。") sys.stderr.write(e.reason) exit(e.code) text = response.read() for line in text.split("\n"): if line.count("JP") and line.count("ipv4"): try: print u"%s/%d" % (line.split("|")[3], 32 - log(int(line.split("|")[4]), 2)) except IndexError: pass |
http://ftp.apnic.net/stats/apnic/delegated-apnic-latestにどの国にどんなIPアドレスが割り当てられているかがあるので、そこから取得します。
urllib2
pythonでhttpでファイルをダウンロードするのにはurllib2を使いました。
ダウンロードするなら↓のように書くだけで出来てしまいます。
1 2 3 4 5 6 7 8 |
import urllib2 try: response = urllib2.urlopen("http://khws4v1.myhome.cx/") except urllib2.HTTPError, e: print e.reason else: print response.read |
HTTPのエラーが発生すると例外(urllib2.HTTPError
)が発生するのでexcept
しておきましょう。
reason
でエラーの原因が文字列で、code
でHTTPステータスコードが取得できます。
レスポンスの中身はread
で取得できます。
string
split
string.split()
は文字列を分割する関数です。
↓のようにすることで複数行の文字列を1行づつ処理できます。
1 2 3 4 5 6 7 8 |
text = """ あいうえお かきくけこ さしすせそ """ for line in text.split("n"): print line |
count
string.count()
は文字列の中に指定の文字(列)がいくつ含まれているかを調べる関数です。
1つも含まれていなければ0を返します。
pythonでは0はfalseを表すので、そのままif文の論理式に使えます。
ネットマスクの計算
ネットマスクの計算は面倒くさそうですが、実はそんなに難しくありません。
ダウンロードしてくるデータは↓のようになっています。
1 |
apnic|JP|ipv4|43.230.52.0|1024|20150203|allocated |
1024
は43.230.52.0
から1024個のIPアドレスが割り振られていることを示しており、ネットマスクは↓の計算式で出せます。
pythonではmathライブラリのlog関数で求められます。
1 2 3 |
from math import log netmask = 32 - log(1024, 2) |