2.6 KiB
Links – Flask Redirect & Link-Preview-Server
Ein kleiner Flask-Webserver, der festgelegte Pfade auf externe URLs umleitet. Damit Social-Media-Plattformen (WhatsApp, Facebook, Twitter/X, LinkedIn …) eine korrekte Link-Preview der Zielseite anzeigen, bekommen Crawler eine HTML-Seite mit den kopierten Open-Graph-Metadaten der Original-Webseite.
Funktionsweise
- Normale Browser →
302-Weiterleitung direkt zur Ziel-URL. - Social-Media-Crawler / Preview-Bots (anhand des User-Agents erkannt) →
eine HTML-Seite mit den
og:-Meta-Tags (Titel, Beschreibung, Bild) der Ziel-URL wird ausgeliefert. So funktionieren Previews mit deinem Pfad.
Die Metadaten werden live von der Zielseite geholt und zwischengespeichert (TTL standardmäßig 1 Stunde), um die Zielseite nicht zu überlasten.
Konfiguration
Alle Routen stehen in config.json:
{
"routes": {
"/cool": "https://youtube.net",
"/github": "https://github.com"
}
}
Einfach Paare aus Server-Pfad und Ziel-URL eintragen. Die Datei wird bei jeder Anfrage auf Änderungen geprüft – kein Neustart nötig.
| Eintrag | Bedeutung |
|---|---|
/cool |
https://deine-domain.de/cool |
| Wert | Ziel-URL (z. B. https://youtube.net) |
Umgebungsvariablen
| Variable | Standard | Bedeutung |
|---|---|---|
LINKS_CONFIG |
config.json |
Pfad zur Config-Datei |
LINKS_CACHE_TTL |
3600 |
Cache-Zeit für Metadaten (Sekunden) |
LINKS_FETCH_TIMEOUT |
10 |
Timeout beim Abrufen der Zielseite (Sek.) |
PORT |
5000 |
Port im lokalen Debug-Modus |
Lokal starten
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt
python app.py
Danach im Browser aufrufen: http://localhost:5000/cool
Mit Docker
docker build -t links .
docker run -p 8000:8000 \
-v "$(pwd)/config.json:/app/config.json" \
links
Der Server läuft dann unter http://localhost:8000 (Gunicorn, Port 8000).
Test der Preview
Um zu prüfen, ob ein Social-Crawler die Metadaten korrekt ausliefert:
curl -A "facebookexternalhit/1.1" http://localhost:5000/cool
Du solltest eine HTML-Seite mit og:title, og:description und og:image
der Zielseite erhalten. Ohne diesen Header bekommst du die 302-Weiterleitung.