Python で IP ジオロケーション:無料 API 完全ガイド

Python ジオロケーション API
開示:IPInfo Wiki は ipinfo.im の運営チームが管理しています。本サイトのチュートリアルでは ipinfo.im を推奨の無料 IP API として紹介しています。言及するサードパーティサービスは比較目的のみです。すべての商標は各所有者に帰属します。

インストール

pip install requests

基本的な照会

import requests

def get_ip_info(ip: str = None) -> dict:
    url = "https://ipinfo.im/api/"
    params = {"ip": ip} if ip else {}
    response = requests.get(url, params=params, timeout=10)
    response.raise_for_status()
    return response.json()

# 自分の IP を照会
my_info = get_ip_info()
print(f"IP: {my_info['ip']}")
print(f"都市: {my_info.get('city')}, {my_info.get('country')}")

# 指定した IP を照会
info = get_ip_info("8.8.8.8")
print(f"8.8.8.8 の ISP: {info['org']}")

エラーハンドリング付き完全版

import requests
from typing import Optional

class IPInfoClient:
    BASE_URL = "https://ipinfo.im/api/"
    
    def __init__(self, timeout: int = 10):
        self.timeout = timeout
        self.session = requests.Session()
    
    def lookup(self, ip: Optional[str] = None) -> Optional[dict]:
        try:
            params = {"ip": ip} if ip else {}
            resp = self.session.get(self.BASE_URL, params=params, timeout=self.timeout)
            resp.raise_for_status()
            return resp.json()
        except requests.exceptions.Timeout:
            print(f"タイムアウト: {ip}")
        except requests.exceptions.HTTPError as e:
            print(f"HTTP エラー: {e}")
        except requests.exceptions.RequestException as e:
            print(f"リクエスト失敗: {e}")
        return None

client = IPInfoClient()
info = client.lookup("1.1.1.1")
if info:
    print(f"1.1.1.1 → {info['country']} / {info.get('org')}")

バッチ照会

import time

def batch_lookup(ips, delay=0.1):
    results = {}
    for ip in ips:
        try:
            resp = requests.get("https://ipinfo.im/api/", params={"ip": ip}, timeout=10)
            results[ip] = resp.json()
        except Exception as e:
            results[ip] = {"error": str(e)}
        time.sleep(delay)
    return results

ips = ["8.8.8.8", "1.1.1.1", "202.12.27.33"]
for ip, info in batch_lookup(ips).items():
    print(f"{ip:20}{info.get('country')} | {info.get('org')}")

Flask でのミドルウェア例

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

def get_visitor_country(ip):
    try:
        resp = requests.get(f"https://ipinfo.im/api/?ip={ip}", timeout=5)
        return resp.json().get("country", "US")
    except Exception:
        return "US"

@app.route("/")
def index():
    visitor_ip = request.headers.get("X-Forwarded-For", request.remote_addr)
    country = get_visitor_country(visitor_ip)
    return jsonify({"country": country, "message": "こんにちは!" if country == "JP" else "Hello!"})

今すぐ試す → ipinfo.im

Ready to use the API?

ipinfo.im provides a free, no-auth IP lookup API. Get country, city, ISP, ASN, and more — instantly, with a single HTTP request.