インストール
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