IPアドレスから位置情報を取得してみたい


IPアドレスは完全に公開された値ですが、このIPアドレスから緯度経度などの位置情報を取得することができます。

これらの情報を取得するためのAPIがいくつか用意されています。
今回はPythonからそれらを利用してみたいと思います。


api.hostip.info


このapiを利用してIPアドレスから緯度経度を含めた諸々の情報を取得できます。

Pythonをではrequestを使い以下のように利用します。

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))


実行結果はこうなります。
緯度経度の他都市名なども取得できました。

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が提供されているみたいです。
おそらくこれです。

pip install maxminddb-geolite2


Pythonからはこのように利用します。
IPアドレスは適当に指定しています。

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))


実行するとこうなりました。

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から利用することが可能です。

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