Microservice Node.js/Fastify qui extrait l'image représentative d'une page web via une cascade de stratégies.
Body
{ "source_page": "https://example.com/article" }Réponses
| Status | Body |
|---|---|
200 |
{ "url": "https://cdn.example.com/image.jpg" } |
400 |
{ "error": "source_page is required" | "invalid_url" | "forbidden_url" } |
404 |
{ "error": "not_found" } |
Les stratégies sont appliquées dans l'ordre — la première qui réussit arrête la cascade.
- og:image — balise
<meta property="og:image">(+twitter:image) - largest-img — plus grande
<img width height>selonwidth × height - data-src — premier
<img data-src> - __NEXT__DATA__ — blob JSON injecté par Next.js (recherche récursive)
- Playwright — rendu headless (fallback lourd, désactivable)
pnpm install
cp .env.example .env# développement (rechargement auto)
pnpm dev
# production
pnpm start| Variable | Défaut | Description |
|---|---|---|
PORT |
3000 |
Port d'écoute |
HOST |
0.0.0.0 |
Adresse d'écoute |
ALLOWED_ORIGINS |
http://localhost:5173 |
Origines CORS autorisées (CSV) |
ENABLE_PLAYWRIGHT |
false |
Active le fallback Playwright |
NODE_ENV |
development |
Environnement |
Exemple multi-origines :
ALLOWED_ORIGINS=https://myapp.com,https://staging.myapp.com
- Validation
http/httpsuniquement - Protection SSRF :
localhost,10.x,192.168.x,172.16-31.x, link-local bloqués - Résolution DNS des noms d'hôte avant autorisation
- Timeout global de 8s sur le fetch HTML
- Pas de proxy d'image (retourne l'URL, pas le contenu)
- Pas de cache (ajouter Redis/LRU en prod si besoin)
- Pas d'authentification (mettre un reverse proxy si exposé publiquement)