This repository has been archived on 2024-06-12. You can view files and clone it, but cannot push or open issues or pull requests.
ipserv/ipserv.py

59 lines
1.9 KiB
Python
Raw Normal View History

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-19 10:38:32 +01:00
import time
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-19 10:38:32 +01:00
cache = {}
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-19 10:38:32 +01:00
if ip in cache:
data, timestamp = cache[ip]
if time.time() - timestamp < 3600:
logging.info("cache hit for %s", ip)
return data, 200
logging.info("cache expired for %s", ip)
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(
2024-04-18 11:38:38 +01:00
"https://ip.shronk.tech/lookup?ip=" + ip,
2024-04-18 11:45:48 +01:00
headers={
2024-04-19 10:32:11 +01:00
"User-Agent": request.headers.get("User-Agent", "Mozilla/5.0"),
2024-04-19 10:33:27 +01:00
"Accept": request.headers.get("Accept", "text/plain"),
2024-04-19 10:32:11 +01:00
"Accept-Language": request.headers.get("Accept-Language", "en-US"),
2024-04-18 11:51:52 +01:00
"Dnt": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Sec-Gpc": "1",
"Upgrade-Insecure-Requests": "1"
2024-04-18 11:45:48 +01:00
}
2024-04-18 11:26:09 +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)
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)
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-19 10:38:32 +01:00
cache[ip] = [data, time.time()]
2024-04-17 16:27:58 +01:00
return data, response.status_code