Une API Next.js complète pour l'audit automatique de sites web utilisant Puppeteer et Lighthouse.
- Analyse HTML complète : balises meta, structure des titres, attributs alt
- Métriques de performance : temps de chargement, FCP, LCP, responsive design
- Intégration Lighthouse : scores SEO, performance, accessibilité, bonnes pratiques
- Extraction d'informations : titre de page et premier H1 automatiquement extraits
- Rapport JSON normalisé : issues, recommandations, score global, informations de page
- Gestion d'erreurs robuste : timeout, validation, messages explicites
- TypeScript strict : typage complet, interfaces claires
# Cloner le projet
git clone https://github.com/michel-DC/App-Analyzer.git
cd App-Analyzer
# Installer les dépendances avec pnpm
pnpm install
# Démarrer le serveur de développement
pnpm devL'API sera accessible sur http://localhost:3000
- Next.js 15.5.4
- TypeScript 5
- Puppeteer 24.23.0
- Lighthouse 12.8.2
- Zod 4.1.12
- p-timeout 7.0.1
src/
├── app/
│ └── api/analyze/route.ts # Route API principale
├── lib/
│ ├── analyzeSite.ts # Orchestrateur principal
│ ├── checkHTMLStructure.ts # Analyseur HTML
│ ├── getPerformanceMetrics.ts # Métriques de performance
│ ├── runLighthouse.ts # Exécuteur Lighthouse
│ ├── extractPageInfo.ts # Extracteur titre/H1
│ ├── lighthouseWrapper.ts # Wrapper sécurisé Lighthouse
│ └── utils.ts # Utilitaires communs
├── types/
│ └── report.ts # Interfaces TypeScript
└── config/
└── puppeteer.config.ts # Configuration Puppeteer
POST /api/analyze
Payload (audit unique)
{
"url": "https://exemple.com",
"options": {
"lighthouse": true,
"rowId": "optional-row-identifier",
"company_email": "contact@company.com"
}
}POST /api/analyze/batch
Payload (batch avancé, traitement séquentiel, options individuelles)
{
"sites": [
{
"url": "https://site1.com",
"options": {
"lighthouse": true,
"rowId": "A",
"company_email": "contact1@exemple.com"
}
},
{
"url": "https://site2.com",
"options": {
"lighthouse": false,
"rowId": "B",
"company_email": "contact2@exemple.com"
}
}
]
}Réponse de succès (extrait)
{
"reports": [
{
"status": "success",
"url": "https://site1.com",
"score": 82,
"categories": { ... },
"issues": [ ... ],
"rowId": "A",
"company_email": "contact1@exemple.com"
},
{
"status": "success",
"url": "https://site2.com",
// ...
"rowId": "B",
"company_email": "contact2@exemple.com"
}
]
}sites[]: chaque entrée possède une url unique et ses propres options (lighthouse, rowId, company_email, etc.)- Les sites sont analysés strictement l'un après l'autre (jamais en parallèle même en mode batch)
- L'ordre des rapports respecte l'ordre du tableau envoyé.
{
"status": "error",
"message": "Timeout: analyse trop longue"
}curl -X POST http://localhost:3000/api/analyze/batch \
-H "Content-Type: application/json" \
-d '{
"sites": [
{
"url": "https://google.com",
"options": { "lighthouse": true, "rowId": "A" }
},
{
"url": "https://github.com",
"options": { "lighthouse": false, "rowId": "B" }
}
]
}'const response = await fetch("http://localhost:3000/api/analyze/batch", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
sites: [
{ url: "https://google.com", options: { lighthouse: true, rowId: "A" } },
{ url: "https://github.com", options: { lighthouse: false, rowId: "B" } }
]
}),
});
const report = await response.json();
console.log(report);import requests
response = requests.post('http://localhost:3000/api/analyze/batch', json={
'sites': [
{'url': 'https://google.com', 'options': {'lighthouse': True, 'rowId': 'A'}},
{'url': 'https://github.com', 'options': {'lighthouse': False, 'rowId': 'B'}}
]
})
report = response.json()
print(report)- Timeout global : 2 minutes (120 secondes)
- Timeout navigation : 30 secondes
- Timeout navigateur : 30 secondes
- Mobile : 375x667px
- Desktop : 1920x1080px
- Performance : 0-100
- SEO : 0-100
- Accessibility : 0-100
- Best Practices : 0-100
L'API extrait automatiquement :
- Titre de la page : Contenu de la balise
<title> - Premier H1 : Texte du premier élément
<h1>de la page - Gestion d'erreurs : Valeurs vides en cas d'absence d'éléments
- Titre de page manquant
- Meta description manquante
- Lien canonique manquant
- Structure des titres incorrecte
- Temps de chargement élevé
- First Contentful Paint élevé
- Largest Contentful Paint élevé
- Images non optimisées
- Images sans attribut alt
- Problèmes de contraste
- Navigation au clavier
- Meta viewport manquante
- Site non responsive
- Problèmes de sécurité
L'API gère automatiquement :
- Timeouts : analyse trop longue
- Sites inaccessibles : DNS, connexion refusée
- Erreurs de validation : URL invalide, JSON malformé
- Erreurs Lighthouse : fallback sur scores par défaut
# Lancer en mode développement
pnpm dev
# Build de production
pnpm build
# Lancer en production
pnpm start
# Linter
pnpm lint- Puppeteer : Lancement headless avec optimisations
- Lighthouse : Exécution asynchrone non-bloquante
- TypeScript : Typage strict, aucune utilisation d'
any - Validation : Schémas Zod pour toutes les entrées
- Nettoyage : Fermeture automatique des ressources
- Validation stricte des URLs
- Timeouts pour éviter les blocages
- Nettoyage automatique des ressources
- Gestion d'erreurs centralisée
- Temps de chargement (loadTime)
- DOM Content Loaded (domContentLoaded)
- First Contentful Paint (firstContentfulPaint)
- Largest Contentful Paint (largestContentfulPaint)
- Responsive Design (mobile/desktop)
- Structure HTML (titres, meta, images)
- Informations de page (titre et premier H1)
Développé avec cœur en TypeScript et Next.js
