80 lines
2.6 KiB
Markdown
80 lines
2.6 KiB
Markdown
# 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`**:
|
||
|
||
```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
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
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.
|