Tor 出口 IPv4 アドレスリスト取得(Pythonスクリプト)
Tor の出口アドレス(IPv4)のリストを取得する Python スクリプトを作成しました。
ライブラリとしてもインポート出来ますので、よろしければご利用下さい。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import re
from socket import inet_aton
import struct
import urllib.request
def tor_address_ipv4(file=sys.stdout, url='https://check.torproject.org/exit-addresses'):
"""ファイルに Tor 出口 IPv4 アドレスを出力する。"""
# 正規表現パターンを 正規表現オブジェクト にコンパイル
# IPv4 アドレス抽出用
prog = re.compile(r'ExitAddress\s+(\d+\.\d+\.\d+\.\d+)\s+.*$', re.IGNORECASE)
address_list = []
# Tor の出口リストの取得
req = urllib.request.Request(url=url, method='GET')
with urllib.request.urlopen(req) as f:
if f.status not in [200, 301]:
print(f'サーバーの接続に失敗しました。({f.status})', file=sys.stderr)
return False
elif f.status == 301:
print(f'警告:サーバーが移転したようです。({f.status})', file=sys.stderr)
for line in re.split(r'\r?\n', f.read().decode('utf-8').strip()):
result = prog.search(line)
if result is None:
continue
if result.group(1) in address_list:
continue
address_list.append(result.group(1))
if len(address_list) < 1:
print('アドレスの取得に失敗しました。', file=sys.stderr)
# アドレスをソートして出力
address_list = sorted(address_list, key=lambda ip: struct.unpack("!L", inet_aton(ip))[0])
for address in address_list:
print(address, file=file)
return True
if __name__ == '__main__':
if tor_address_ipv4():
exit(0)
else:
exit(1)