from flask import Flask, request, render_template_string
import requests
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1)
HTML_TEMPLATE = """
{% if show_logo %}

{% endif %}
IP & RIPE Lookup
Il tuo IP pubblico è:
{{ ip }}
{% if ripe %}
Informazioni RIPE
{% if ripe.holder %}
Provider: {{ ripe.holder }}
{% endif %}
{% if ripe.prefix %}
Prefisso: {{ ripe.prefix }}
{% endif %}
{% if ripe.asns %}
ASN: {{ ripe.asns | join(', ') }}
{% endif %}
Dati ottenuti tramite RIPEstat Data API.
{% else %}
Informazioni RIPE
Non è stato possibile recuperare i dettagli RIPE per questo indirizzo.
{% endif %}
"""
RIPESTAT_BASE = "https://stat.ripe.net/data"
def get_client_ip():
xff = request.headers.get("X-Forwarded-For", "")
if xff:
parts = [p.strip() for p in xff.split(",") if p.strip()]
if parts:
return parts[0]
xri = request.headers.get("X-Real-IP")
if xri:
return xri.strip()
return request.remote_addr or "Sconosciuto"
def fetch_ripe_info(ip: str):
try:
ni_resp = requests.get(f"{RIPESTAT_BASE}/network-info/data.json", params={"resource": ip}, timeout=2)
ni_resp.raise_for_status()
ni_data = ni_resp.json().get("data", {})
prefix = ni_data.get("prefix")
asns = ni_data.get("asns") or []
holder = None
if asns:
first_asn = asns[0]
ao_resp = requests.get(f"{RIPESTAT_BASE}/as-overview/data.json", params={"resource": first_asn}, timeout=2)
ao_resp.raise_for_status()
holder = ao_resp.json().get("data", {}).get("holder")
class R: pass
r = R()
r.prefix = prefix
r.asns = [f"AS{x}" for x in asns] if asns else []
r.holder = holder
return r if any([r.prefix, r.asns, r.holder]) else None
except:
return None
@app.route("/")
def index():
ip = get_client_ip()
ripe = fetch_ripe_info(ip) if ip != "Sconosciuto" else None
return render_template_string(HTML_TEMPLATE, ip=ip, ripe=ripe, show_logo=True)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)