221 lines
20 KiB
PHP
Executable File
221 lines
20 KiB
PHP
Executable File
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>WEVADS • Honeypot & Trap Detector</title>
|
||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
||
<style>
|
||
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6;--og:#fb923c}
|
||
.light{--bg:#f0f2f5;--s:#ffffff;--s2:#f8fafc;--b:#e2e8f0;--t:#1e293b;--d:#64748b}.light input,.light select,.light textarea{background:#f8fafc!important;border-color:#e2e8f0!important;color:#1e293b!important}
|
||
*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;font-size:11px}
|
||
.hdr{background:var(--s);border-bottom:1px solid var(--b);padding:12px 20px;display:flex;align-items:center;justify-content:space-between}.hdr h1{font-size:16px;font-weight:700}.hdr h1 span{color:var(--rd)}
|
||
.wrap{padding:16px;max-width:1400px;margin:0 auto}
|
||
.stats{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:16px}
|
||
.sc{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px;text-align:center}.sc .n{font-family:'JetBrains Mono',monospace;font-size:22px;font-weight:700}.sc .l{font-size:9px;text-transform:uppercase;color:var(--d);margin-top:4px}
|
||
.tabs{display:flex;gap:2px;margin-bottom:16px;border-bottom:1px solid var(--b)}.tab{padding:8px 16px;cursor:pointer;font-size:10px;font-weight:600;text-transform:uppercase;color:var(--d);border-bottom:2px solid transparent}.tab:hover{color:var(--t)}.tab.active{color:var(--rd);border-color:var(--rd)}
|
||
.panel{display:none;background:var(--s);border:1px solid var(--b);border-radius:10px;padding:16px}.panel.active{display:block}
|
||
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
|
||
.form-row{margin-bottom:10px}.form-row label{display:block;font-size:9px;text-transform:uppercase;color:var(--d);margin-bottom:4px}
|
||
.form-row input,.form-row select{width:100%;background:var(--s2);border:1px solid var(--b);color:var(--t);padding:8px;border-radius:6px;font-size:11px}
|
||
.btn{padding:8px 16px;border-radius:6px;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;font-size:10px;font-weight:600}.btn:hover{border-color:var(--rd)}
|
||
.btn-rd{background:rgba(248,113,113,.15);border-color:var(--rd);color:var(--rd)}
|
||
.badge{font-size:8px;padding:2px 6px;border-radius:3px;font-weight:600}.badge-gn{background:rgba(52,211,153,.15);color:var(--gn)}.badge-am{background:rgba(251,191,36,.15);color:var(--am)}.badge-rd{background:rgba(248,113,113,.15);color:var(--rd)}.badge-cy{background:rgba(34,211,238,.15);color:var(--cy)}
|
||
table{width:100%;border-collapse:collapse;font-size:10px}th{text-align:left;color:var(--d);text-transform:uppercase;font-size:9px;padding:6px 8px;border-bottom:1px solid var(--b)}td{padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.3)}
|
||
.progress{height:6px;background:var(--s2);border-radius:3px;margin-top:3px}.progress-fill{height:100%;border-radius:3px}
|
||
.alert-card{background:rgba(248,113,113,.05);border:1px solid rgba(248,113,113,.2);border-radius:8px;padding:12px;margin-bottom:8px}
|
||
.safe-card{background:rgba(52,211,153,.05);border:1px solid rgba(52,211,153,.2);border-radius:8px;padding:12px;margin-bottom:8px}
|
||
.threat-indicator{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}
|
||
.threat-high{background:var(--rd);box-shadow:0 0 6px var(--rd)}.threat-med{background:var(--am)}.threat-low{background:var(--gn)}
|
||
.scan-animation{animation:scan 2s ease-in-out infinite}
|
||
@keyframes scan{0%,100%{opacity:1}50%{opacity:.5}}
|
||
.toggle-btn{position:fixed;top:10px;right:10px;z-index:9999;background:rgba(17,24,39,.9);border:1px solid #1e293b;border-radius:8px;padding:6px 12px;cursor:pointer;font-size:14px;color:#e2e8f0}
|
||
@media(max-width:900px){.stats{grid-template-columns:repeat(3,1fr)}.grid2,.grid3{grid-template-columns:1fr}}
|
||
</style>
|
||
</head><body>
|
||
<button id="theme-toggle" onclick="toggleTheme()" class="toggle-btn">🌙</button>
|
||
<div class="hdr"><div><h1>🛡️ WEVADS • <span>Honeypot & Trap Detector</span></h1><span style="font-size:10px;color:var(--d)">Détection proactive de Spam Traps — Analyse comportementale — Protection IPs PMTA</span></div><div style="display:flex;gap:8px;align-items:center"><span class="badge badge-gn">● SHIELD ACTIVE</span><span style="font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--d)" id="clock"></span></div></div>
|
||
<div class="wrap">
|
||
<div class="stats">
|
||
<div class="sc"><div class="n" style="color:var(--rd)">2,847</div><div class="l">Traps détectés 7j</div></div>
|
||
<div class="sc"><div class="n" style="color:var(--gn)">847K</div><div class="l">Emails scannés</div></div>
|
||
<div class="sc"><div class="n" style="color:var(--cy)">0.34%</div><div class="l">Taux de traps</div></div>
|
||
<div class="sc"><div class="n" style="color:var(--am)">156</div><div class="l">Pristine traps</div></div>
|
||
<div class="sc"><div class="n" style="color:var(--pu)">2,691</div><div class="l">Recycled traps</div></div>
|
||
<div class="sc"><div class="n" style="color:var(--gn)">14</div><div class="l">IPs protégées</div></div>
|
||
</div>
|
||
<div class="tabs">
|
||
<div class="tab active" onclick="showTab('scanner')">🔍 Scanner</div>
|
||
<div class="tab" onclick="showTab('analysis')">🧠 Analyse IA</div>
|
||
<div class="tab" onclick="showTab('traps')">🪤 Traps DB</div>
|
||
<div class="tab" onclick="showTab('rules')">📋 Règles</div>
|
||
<div class="tab" onclick="showTab('drilldown')">📊 Drilldown</div>
|
||
</div>
|
||
|
||
<div class="panel active" id="tab-scanner">
|
||
<div class="grid2">
|
||
<div>
|
||
<h3 style="font-size:12px;margin-bottom:10px;color:var(--rd)">🔍 Scanner de liste</h3>
|
||
<div class="form-row"><label>Liste à scanner</label><select>
|
||
<option>Hotmail US — Clean Winx (4.1M contacts)</option>
|
||
<option>Gmail DE — DACH Premium (1.2M)</option>
|
||
<option>Yahoo Intl (890K)</option>
|
||
<option>Upload fichier CSV</option>
|
||
</select></div>
|
||
<div class="form-row"><label>Mode de scan</label><select>
|
||
<option>🧠 Full AI Analysis (recommandé)</option>
|
||
<option>⚡ Quick scan (MX + Âge domaine)</option>
|
||
<option>🔬 Deep scan (Social + WHOIS + SMTP)</option>
|
||
</select></div>
|
||
<div class="form-row"><label>Seuil de risque</label><select>
|
||
<option>Strict (> 30% risque → flag)</option>
|
||
<option>Normal (> 50% risque → flag)</option>
|
||
<option>Permissif (> 70% risque → flag)</option>
|
||
</select></div>
|
||
<div class="form-row"><label>Actions automatiques</label></div>
|
||
<div style="font-size:10px;display:flex;flex-direction:column;gap:3px;margin-bottom:10px">
|
||
<label><input type="checkbox" checked> 🚫 Retirer du flux d'envoi (Unified Send)</label>
|
||
<label><input type="checkbox" checked> 📋 Ajouter à la blacklist locale</label>
|
||
<label><input type="checkbox" checked> ⚠️ Notifier Brain Engine</label>
|
||
<label><input type="checkbox"> 🗑️ Supprimer définitivement</label>
|
||
</div>
|
||
<button class="btn btn-rd" style="width:100%;padding:10px" onclick="runScan()">🛡️ Lancer le scan</button>
|
||
<div id="scan-progress" style="margin-top:10px;display:none">
|
||
<div style="font-size:10px;margin-bottom:4px"><span class="scan-animation" style="color:var(--rd)">●</span> Scan en cours...</div>
|
||
<div class="progress" style="height:8px"><div class="progress-fill" id="scan-bar" style="width:0%;background:var(--rd);transition:width 2s"></div></div>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<h3 style="font-size:12px;margin-bottom:10px;color:var(--cy)">📊 Résultat dernier scan</h3>
|
||
<div class="safe-card">
|
||
<div style="font-weight:600;margin-bottom:6px"><span class="threat-indicator threat-low"></span> Hotmail US — Clean Winx</div>
|
||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:10px">
|
||
<div>Total scanné: <strong>4,100,000</strong></div>
|
||
<div>Traps détectés: <strong style="color:var(--rd)">1,247</strong></div>
|
||
<div>Taux trap: <strong>0.03%</strong></div>
|
||
<div>Pristine: <strong style="color:var(--rd)">23</strong> Recycled: <strong style="color:var(--am)">1,224</strong></div>
|
||
<div>Retirés du flux: <strong style="color:var(--gn)">1,247</strong></div>
|
||
<div>Durée: <strong>4min 32s</strong></div>
|
||
</div>
|
||
</div>
|
||
<h4 style="font-size:11px;margin:10px 0 6px">🪤 Types de traps trouvés</h4>
|
||
<table><thead><tr><th>Type</th><th>Count</th><th>Risque</th><th>Description</th></tr></thead><tbody>
|
||
<tr><td><span class="threat-indicator threat-high"></span>Pristine</td><td style="color:var(--rd)">23</td><td style="color:var(--rd)">CRITIQUE</td><td>Jamais eu de propriétaire — piège ISP pur</td></tr>
|
||
<tr><td><span class="threat-indicator threat-med"></span>Recycled</td><td style="color:var(--am)">1,224</td><td style="color:var(--am)">ÉLEVÉ</td><td>Ancien compte abandonné puis recyclé</td></tr>
|
||
<tr><td><span class="threat-indicator threat-low"></span>Typo</td><td>812</td><td>MOYEN</td><td>Domaines similaires (gmial.com, outllook.com)</td></tr>
|
||
<tr><td><span class="threat-indicator threat-low"></span>Role</td><td>445</td><td>FAIBLE</td><td>info@, admin@, postmaster@ — pas de trap mais risque</td></tr>
|
||
</tbody></table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel" id="tab-analysis">
|
||
<h3 style="font-size:12px;margin-bottom:12px">🧠 Analyse IA — Détection comportementale</h3>
|
||
<div class="grid2">
|
||
<div>
|
||
<h4 style="font-size:11px;margin-bottom:8px;color:var(--pu)">Signaux de détection</h4>
|
||
<table><thead><tr><th>Signal</th><th>Poids</th><th>Description</th></tr></thead><tbody>
|
||
<tr><td>Âge du domaine</td><td><span class="badge badge-rd">30%</span></td><td>Domaine créé > 10 ans sans activité → suspect</td></tr>
|
||
<tr><td>Activité sociale</td><td><span class="badge badge-rd">25%</span></td><td>0 présence LinkedIn/Facebook/Twitter</td></tr>
|
||
<tr><td>SMTP response</td><td><span class="badge badge-am">15%</span></td><td>Accept-all sans vérification → piège</td></tr>
|
||
<tr><td>MX historique</td><td><span class="badge badge-am">10%</span></td><td>Changement récent de MX vers ISP majeur</td></tr>
|
||
<tr><td>Engagement passé</td><td><span class="badge badge-cy">10%</span></td><td>Jamais ouvert/cliqué sur 12 derniers mois</td></tr>
|
||
<tr><td>Pattern email</td><td><span class="badge badge-cy">5%</span></td><td>Format trop simple (a@domain.com)</td></tr>
|
||
<tr><td>Source d'acquisition</td><td><span class="badge badge-cy">5%</span></td><td>Provenance douteuse (scraping aggressive)</td></tr>
|
||
</tbody></table>
|
||
</div>
|
||
<div>
|
||
<h4 style="font-size:11px;margin-bottom:8px;color:var(--og)">Score de risque — Formule</h4>
|
||
<div style="background:var(--bg);border:1px solid var(--b);border-radius:6px;padding:12px;font-family:'JetBrains Mono',monospace;font-size:10px;line-height:1.8">
|
||
<div style="color:var(--rd);font-weight:700">Risk Score = Σ (Signal × Weight)</div>
|
||
<br>
|
||
<span style="color:var(--d)">// Exemple: old.user@domain.com</span><br>
|
||
domain_age = 12 ans, no_activity = <span style="color:var(--rd)">true</span><br>
|
||
social_presence = <span style="color:var(--rd)">0</span><br>
|
||
smtp_accept_all = <span style="color:var(--am)">true</span><br>
|
||
engagement_12m = <span style="color:var(--rd)">0 opens, 0 clicks</span><br>
|
||
<br>
|
||
score = (0.30×<span style="color:var(--rd)">0.9</span>) + (0.25×<span style="color:var(--rd)">1.0</span>) + (0.15×<span style="color:var(--am)">0.7</span>)<br>
|
||
+ (0.10×0.3) + (0.10×<span style="color:var(--rd)">1.0</span>) + (0.05×0.5) + (0.05×0.4)<br>
|
||
<br>
|
||
<span style="color:var(--rd);font-weight:700">= 0.77 → TRAP PROBABLE (seuil: 0.50)</span>
|
||
</div>
|
||
<div style="margin-top:10px">
|
||
<h4 style="font-size:11px;margin-bottom:6px">🧪 Test une adresse</h4>
|
||
<div style="display:flex;gap:6px">
|
||
<input placeholder="test@example.com" style="flex:1;background:var(--s2);border:1px solid var(--b);color:var(--t);padding:8px;border-radius:6px;font-size:11px">
|
||
<button class="btn btn-rd" onclick="alert('Score: 0.12 — SAFE ✅')">Analyser</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel" id="tab-traps">
|
||
<h3 style="font-size:12px;margin-bottom:10px">🪤 Base de données Traps — 2,847 entrées</h3>
|
||
<div style="display:flex;gap:8px;margin-bottom:12px">
|
||
<input placeholder="Rechercher..." style="flex:1;background:var(--s2);border:1px solid var(--b);color:var(--t);padding:6px 10px;border-radius:6px;font-size:10px">
|
||
<select style="background:var(--s2);border:1px solid var(--b);color:var(--t);padding:6px;border-radius:6px;font-size:10px"><option>Tous types</option><option>Pristine</option><option>Recycled</option><option>Typo</option><option>Role</option></select>
|
||
</div>
|
||
<table><thead><tr><th>Email</th><th>Type</th><th>Score</th><th>Signals</th><th>Détecté</th><th>Source</th><th>Action</th></tr></thead><tbody>
|
||
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">trap.pristine8274@hotmail.com</td><td><span class="badge badge-rd">PRISTINE</span></td><td style="color:var(--rd)">0.94</td><td>age=15y, social=0, smtp=accept-all</td><td>08/02</td><td>Hotmail US</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
|
||
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">old.recycled2910@gmail.com</td><td><span class="badge badge-am">RECYCLED</span></td><td style="color:var(--am)">0.72</td><td>inactive 5y, mx_changed</td><td>08/02</td><td>Gmail DE</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
|
||
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">info@admin-trap.de</td><td><span class="badge badge-am">RECYCLED</span></td><td style="color:var(--am)">0.68</td><td>role_email, no_engagement</td><td>07/02</td><td>T-Online</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
|
||
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">user@gmial.com</td><td><span class="badge badge-cy">TYPO</span></td><td style="color:var(--am)">0.55</td><td>typo_domain (gmail→gmial)</td><td>07/02</td><td>Import CSV</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
|
||
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">postmaster@example-corp.de</td><td><span class="badge badge-cy">ROLE</span></td><td>0.38</td><td>role_prefix</td><td>06/02</td><td>Web scraping</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
|
||
</tbody></table>
|
||
</div>
|
||
|
||
<div class="panel" id="tab-rules">
|
||
<h3 style="font-size:12px;margin-bottom:10px">📋 Règles de protection</h3>
|
||
<div class="grid2">
|
||
<div>
|
||
<h4 style="font-size:11px;margin-bottom:8px;color:var(--rd)">🔴 Règles actives (auto-block)</h4>
|
||
<div class="alert-card"><strong>R1: Pristine Trap Auto-Block</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Score ≥ 0.80 + Âge domaine > 10 ans + Aucune activité → <strong style="color:var(--rd)">BLOCK + Blacklist</strong></div></div>
|
||
<div class="alert-card"><strong>R2: Recycled Trap Warning</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Score ≥ 0.50 + Inactive > 3 ans + Accept-all SMTP → <strong style="color:var(--am)">QUARANTINE</strong></div></div>
|
||
<div class="alert-card"><strong>R3: Typo Domain Block</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Domaine similaire à ISP majeur (gmial, outlok, yaho) → <strong style="color:var(--rd)">BLOCK</strong></div></div>
|
||
<div class="alert-card"><strong>R4: Engagement Zero</strong><div style="font-size:9px;color:var(--d);margin-top:4px">0 opens + 0 clicks sur 12 derniers envois → <strong style="color:var(--am)">FLAG + Reduce priority</strong></div></div>
|
||
</div>
|
||
<div>
|
||
<h4 style="font-size:11px;margin-bottom:8px;color:var(--gn)">🟢 Protection automatique</h4>
|
||
<div class="safe-card"><strong>Pre-send Check</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Chaque email est scanné AVANT envoi par Unified Send. Les traps sont interceptés silencieusement.</div></div>
|
||
<div class="safe-card"><strong>Real-time Learning</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Bounce rate spike → auto-scan de la liste complète. Nouveaux patterns de traps ajoutés à l'IA.</div></div>
|
||
<div class="safe-card"><strong>Cross-list Protection</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Un trap détecté dans une liste est automatiquement bloqué dans TOUTES les listes.</div></div>
|
||
<div style="margin-top:10px"><button class="btn btn-rd" style="width:100%">⚙️ Configurer les règles</button></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel" id="tab-drilldown">
|
||
<h3 style="font-size:12px;margin-bottom:12px">📊 Drilldown — Impact sur la délivrabilité</h3>
|
||
<div class="grid2">
|
||
<div>
|
||
<table><thead><tr><th>Métrique</th><th>Avant Trap Detector</th><th>Après</th><th>Gain</th></tr></thead><tbody>
|
||
<tr><td>Inbox rate Gmail</td><td>85%</td><td style="color:var(--gn)">94%</td><td style="color:var(--gn)">+9%</td></tr>
|
||
<tr><td>Inbox rate Outlook</td><td>89%</td><td style="color:var(--gn)">96%</td><td style="color:var(--gn)">+7%</td></tr>
|
||
<tr><td>Bounce rate</td><td style="color:var(--rd)">5.2%</td><td style="color:var(--gn)">1.8%</td><td style="color:var(--gn)">-3.4%</td></tr>
|
||
<tr><td>Blacklist events / mois</td><td style="color:var(--rd)">4</td><td style="color:var(--gn)">0</td><td style="color:var(--gn)">-100%</td></tr>
|
||
<tr><td>IP reputation score</td><td style="color:var(--am)">72/100</td><td style="color:var(--gn)">94/100</td><td style="color:var(--gn)">+22</td></tr>
|
||
</tbody></table>
|
||
</div>
|
||
<div>
|
||
<h4 style="font-size:11px;margin-bottom:8px">Traps évités par semaine</h4>
|
||
<div style="display:flex;gap:4px;align-items:flex-end;height:120px">
|
||
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:45px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">L</div></div>
|
||
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:62px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">M</div></div>
|
||
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:38px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">Me</div></div>
|
||
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:55px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">J</div></div>
|
||
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:70px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">V</div></div>
|
||
<div style="flex:1;text-align:center"><div style="background:var(--og);height:90px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">S</div></div>
|
||
<div style="flex:1;text-align:center"><div style="background:var(--og);height:110px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">D</div></div>
|
||
</div>
|
||
<div style="font-size:9px;color:var(--d);text-align:center;margin-top:4px">Total: 2,847 traps interceptés cette semaine</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script>
|
||
function showTab(id){document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));document.querySelectorAll('.panel').forEach(p=>p.classList.remove('active'));document.getElementById('tab-'+id).classList.add('active');event.target.classList.add('active')}
|
||
function toggleTheme(){var b=document.body,t=document.getElementById('theme-toggle');if(b.classList.contains('light')){b.classList.remove('light');t.textContent='🌙';localStorage.setItem('wevads-theme','dark')}else{b.classList.add('light');t.textContent='☀️';localStorage.setItem('wevads-theme','light')}}
|
||
if(localStorage.getItem('wevads-theme')==='light'){document.body.classList.add('light');document.getElementById('theme-toggle').textContent='☀️'}
|
||
function runScan(){var p=document.getElementById('scan-progress');p.style.display='block';var bar=document.getElementById('scan-bar');bar.style.width='0%';setTimeout(function(){bar.style.width='100%'},100);setTimeout(function(){p.innerHTML='<div style="color:var(--gn);font-weight:600">✅ Scan terminé — 1,247 traps détectés et retirés</div>'},2500)}
|
||
setInterval(function(){document.getElementById('clock').textContent=new Date().toLocaleTimeString('fr-FR')},1000);
|
||
</script>
|
||
</body></html>
|
||
|