IPアドレスから位置情報を取得してみたい
IPアドレスは完全に公開された値ですが、このIPアドレスから緯度経度などの位置情報を取得することができます。
これらの情報を取得するためのAPIがいくつか用意されています。
今回はPythonからそれらを利用してみたいと思います。
api.hostip.info
このapiを利用してIPアドレスから緯度経度を含めた諸々の情報を取得できます。
Pythonをではrequestを使い以下のように利用します。
1 2 3 4 5 6 7 8 9 |
import requests #適当に指定 ip = "2.2.2.2" api = "http://api.hostip.info/get_json.php?ip={}&position=true".format(ip) j_req = requests.get(api).json() for key, val in j_req.items(): print("{}: {}".format(key,val)) |
実行結果はこうなります。
緯度経度の他都市名なども取得できました。
1 2 3 4 5 6 |
city: Prague ip: 2.2.2.2 lat: 50.0833 country_code: CZ country_name: CZECH REPUBLIC lng: 14.4333 |
MaxMind database
MaxMindはIPアドレスの位置情報を提供している会社です。
MaxMindから彼らのデータベースにアクセスするAPIが提供されているみたいです。
おそらくこれです。
1 |
pip install maxminddb-geolite2 |
Pythonからはこのように利用します。
IPアドレスは適当に指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
from geolite2 import geolite2 geo_r= geolite2.reader() res = geo_r.get("2.2.2.2") for key,value in res.items(): print(key) for key2,value2 in value.items(): if key2 == "names": for n_key,n_value in value2.items(): print(" - {}: {}".format(n_key,n_value.encode('utf-8'))) else: print(" - {}: {}".format(key2,value2)) |
実行するとこうなりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
country - geoname_id: 3017382 - iso_code: FR - is_in_european_union: True - ru: Франция - fr: France - en: France - de: Frankreich - zh-CN: 法国 - pt-BR: França - ja: フランス共和国 - es: Francia registered_country - geoname_id: 3017382 - iso_code: FR - is_in_european_union: True - ru: Франция - fr: France - en: France - de: Frankreich - zh-CN: 法国 - pt-BR: França - ja: フランス共和国 - es: Francia continent - geoname_id: 6255148 - code: EU - ru: Европа - fr: Europe - en: Europe - de: Europa - zh-CN: 欧洲 - pt-BR: Europa - ja: ヨーロッパ - es: Europa location - latitude: 48.8582 - accuracy_radius: 500 - time_zone: Europe/Paris - longitude: 2.3387 |
api.hostip.infoよりも詳細な情報が取得できました。
Shodan
これについては以前記事を書きましたが、Shodanという検索エンジンを使って位置情報を取得することもできます。
位置情報の他にも脆弱性やOSの種類なども取得できます。
アカウントを作成する必要がありますが、Pythonから利用することが可能です。
1 2 3 4 5 6 |
import shodan api = shodan.Shodan("APIKEY") result = api.host("2.2.2.2") for key in result.keys(): print("{}: {}".format(key,result[key])) |
MaxMindとShodanについては他のプログラミング言語にも提供されているようです。
https://dev.maxmind.com/geoip/geoip2/downloadable/#MaxMind_APIs
https://developer.shodan.io/api/clients