Initial: Mesh-Configs vom 03.09.2026 01:23
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Flask-App: Impressum-Kontaktformular + Honeypot-Spamschutz
|
||||
Nachricht wird als JSON-Datei gespeichert + Telegram-Benachrichtigung via API.
|
||||
"""
|
||||
import os, json, time, re
|
||||
from pathlib import Path
|
||||
from flask import Flask, request
|
||||
import requests
|
||||
|
||||
|
||||
import collections
|
||||
_RATE = collections.defaultdict(list) # ip -> [timestamps]
|
||||
MAX_PER_HOUR = 5
|
||||
|
||||
def _rate_limited(ip):
|
||||
now = time.time()
|
||||
_RATE[ip] = [t for t in _RATE[ip] if now - t < 3600]
|
||||
if len(_RATE[ip]) >= MAX_PER_HOUR:
|
||||
return True
|
||||
_RATE[ip].append(now)
|
||||
return False
|
||||
|
||||
app = Flask(__name__)
|
||||
MSG_DIR = Path("/tmp/impressum-kontakt")
|
||||
ENV_FILE = "/root/.hermes/.env"
|
||||
|
||||
|
||||
def _env(key):
|
||||
try:
|
||||
txt = Path(ENV_FILE).read_text()
|
||||
m = re.search(key + r"\s*=\s*(\S+)", txt)
|
||||
return m.group(1) if m else ""
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
|
||||
@app.route("/senden", methods=["POST"])
|
||||
def senden():
|
||||
name = request.form.get("name", "").strip()
|
||||
email = request.form.get("email", "").strip()
|
||||
msg = request.form.get("nachricht", "").strip()
|
||||
honeypot = request.form.get("website", "").strip() # unsichtbar, Bots füllen es
|
||||
|
||||
# Honeypot: wenn gefüllt → Bot, ignorieren
|
||||
if honeypot:
|
||||
return "Danke für Ihre Nachricht. (Bot erkannt – ignoriert)"
|
||||
|
||||
# Rate-Limit: max 5/Stunde/IP
|
||||
if _rate_limited(request.remote_addr):
|
||||
return "Zu viele Anfragen. Bitte später erneut versuchen.", 429
|
||||
|
||||
if not name or not email or not msg:
|
||||
return "Bitte alle Pflichtfelder ausfüllen.", 400
|
||||
|
||||
# Speichern
|
||||
os.makedirs(MSG_DIR, exist_ok=True)
|
||||
ts = int(time.time())
|
||||
entry = {
|
||||
"ts": ts, "name": name, "email": email, "msg": msg,
|
||||
"ip": request.remote_addr,
|
||||
"user_agent": request.headers.get("User-Agent", "")
|
||||
}
|
||||
safe_name = re.sub(r"[^A-Za-z0-9_-]", "_", name)[:20]
|
||||
path = MSG_DIR / f"{ts}_{safe_name}.json"
|
||||
with open(path, "w") as f:
|
||||
json.dump(entry, f, indent=2, ensure_ascii=False)
|
||||
|
||||
# Telegram-Benachrichtigung
|
||||
t = _env("TELEGRAM_BOT_TOKEN")
|
||||
c = _env("TELEGRAM_HOME_CHANNEL") or "6417835766"
|
||||
if t:
|
||||
text = "📩 *Neue Kontaktanfrage*\nVon: {} ({})\n\n{}".format(name, email, msg[:500])
|
||||
try:
|
||||
requests.post(
|
||||
f"https://api.telegram.org/bot{t}/sendMessage",
|
||||
json={"chat_id": c, "text": text, "parse_mode": "Markdown"},
|
||||
timeout=8,
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return "✅ Nachricht gesendet. Ich melde mich bei Ihnen.", 200
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="127.0.0.1", port=8096, debug=False)
|
||||
Reference in New Issue
Block a user