From c80492315a069fcaa9919c426ef9af0f17cbc05b Mon Sep 17 00:00:00 2001 From: Ruslan Date: Thu, 14 May 2026 10:17:07 +0300 Subject: [PATCH] feat: geo lookup via ip-api.com in contact form, city/region in Telegram --- zkart_app/routes.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/zkart_app/routes.py b/zkart_app/routes.py index 308c0f1..0f39473 100644 --- a/zkart_app/routes.py +++ b/zkart_app/routes.py @@ -821,12 +821,27 @@ def contact(): if not _re.match(r"^[\+\d][\d\s\-\(\)]{6,18}$", phone): return jsonify({"detail": "Некорректный номер телефона"}), 422 + # Geo lookup + ip = request.remote_addr or "" + geo_line = "" + try: + geo_url = f"http://ip-api.com/json/{ip}?lang=ru&fields=status,country,regionName,city,query" + geo_req = Request(geo_url, headers={"User-Agent": "Mozilla/5.0"}) + with urlopen(geo_req, timeout=5) as geo_resp: + geo = json.loads(geo_resp.read()) + if geo.get("status") == "success": + parts = [p for p in [geo.get("country"), geo.get("regionName"), geo.get("city")] if p] + geo_line = f"🌍 *Местоположение:* {', '.join(parts)}\n🖥 *IP:* {geo.get('query', ip)}\n" + except Exception: + geo_line = f"🖥 *IP:* {ip}\n" if ip else "" + divider = "━" * 22 msg = ( f"🔔 *Сообщение через форму*\n{divider}\n\n" f"👤 *Имя:* {name}\n" f"📧 *Email:* {email}\n" - f"📱 *Телефон:* {phone}\n\n" + f"📱 *Телефон:* {phone}\n" + f"{geo_line}\n" f"💬 *Сообщение:*\n{text}" ) payload = json.dumps({