2024-04-17 16:27:58 +01:00
|
|
|
import requests
|
2024-04-18 10:18:38 +01:00
|
|
|
import json
|
2024-04-18 11:26:09 +01:00
|
|
|
import logging
|
2024-04-18 11:31:10 +01:00
|
|
|
from flask import Flask, request
|
2024-04-17 16:27:58 +01:00
|
|
|
|
|
|
|
app = Flask(__name__)
|
2024-04-18 11:26:09 +01:00
|
|
|
logging.basicConfig(level=logging.INFO)
|
2024-04-17 16:27:58 +01:00
|
|
|
|
|
|
|
|
|
|
|
@app.get("/")
|
|
|
|
def ip():
|
2024-04-18 10:18:38 +01:00
|
|
|
if "X-Forwarded-For" in request.headers:
|
2024-04-17 16:44:55 +01:00
|
|
|
ip = request.headers["X-Forwarded-For"]
|
2024-04-17 16:27:58 +01:00
|
|
|
else:
|
|
|
|
ip = request.remote_addr
|
2024-04-18 11:26:09 +01:00
|
|
|
logging.info("looking up IP info for %s", ip)
|
2024-04-18 10:18:38 +01:00
|
|
|
try:
|
2024-04-18 11:26:09 +01:00
|
|
|
response = requests.get(
|
|
|
|
"https://ip.shronk.net/lookup?ip=" + ip,
|
|
|
|
headers=request.headers
|
|
|
|
)
|
2024-04-18 11:31:10 +01:00
|
|
|
response.raise_for_status()
|
2024-04-18 10:18:38 +01:00
|
|
|
except Exception as e:
|
2024-04-18 11:26:09 +01:00
|
|
|
logging.error("Failed to get data for %s: %s", ip, e, exc_info=True)
|
2024-04-18 11:31:10 +01:00
|
|
|
return {"error": str(e), "error-type": "request-failure"}, 500
|
2024-04-18 10:18:38 +01:00
|
|
|
try:
|
|
|
|
data = response.json()
|
|
|
|
except json.JSONDecodeError as e:
|
2024-04-18 11:26:09 +01:00
|
|
|
logging.error("Failed to parse data for %s: %s", ip, e, exc_info=True)
|
2024-04-18 11:31:10 +01:00
|
|
|
return {"error": str(e), "error.type": "json-decode"}, 500
|
2024-04-18 11:26:09 +01:00
|
|
|
logging.info("%s -> %r", ip, data)
|
|
|
|
data["ip"] = ip
|
2024-04-18 10:18:38 +01:00
|
|
|
data.pop("legalese", None)
|
|
|
|
data.pop("source", None)
|
|
|
|
data.pop("brexitRequired", None)
|
2024-04-17 16:27:58 +01:00
|
|
|
return data, response.status_code
|