new file: README.md
new file: app.py new file: config.json new file: requirements.txt
This commit is contained in:
79
README.md
Normal file
79
README.md
Normal file
@@ -0,0 +1,79 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user