- IPアドレスから国判定を行う方法についてメモする。
事前準備
-
GeoLite2データベースのダウンロード
- こちらでアカウントを作成し、「GeoLite2 City」データをダウンロードする。
- データを解凍し、「GeoLite2-City.mmdb」を取得する。
-
GeoLiteAPIインストール
pip install geoip2
コードmain.py
-
HTTP X-Forwarded-ForヘッダーにIPアドレスが付与されるケースを想定し、ヘッダーから取得した値から国コードを返却するAPIを作成する。
- API構築用フレームワークとして、FastAPIを使用。
- エラーハンドリング未実施。
- 複数プロキシ経由時の対応は別途必要となる。
import geoip2.database from fastapi import FastAPI, Request app = FastAPI() # API @app.get("/country_code") def search_shop(request: Request): ipaddress = request.headers['X-Forwarded-For'] reader = geoip2.database.Reader('GeoLite2-City.mmdb') country_code = reader.city(ipaddress).country.iso_code response = {"country": country_code} return response
動作確認
-
API起動
uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [18624] using statreload INFO: Started server process [10596] INFO: Waiting for application startup. INFO: Application startup complete.
-
リクエスト
GET /country_code HTTP/1.1 Host: localhost:8000 Content-Type: application/json X-Forwarded-For: xxx.xxx.xxx.xxx
-
レスポンス
{ "country": "JP" }