auto-sync-0350
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-22T03:30:03+02:00",
|
||||
"ts": "2026-04-22T03:45:03+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
28
api/ambre-export-v39.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$src_dir = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$dest_dir = "/var/www/html/generated";
|
||||
|
||||
$out = ["copied" => []];
|
||||
|
||||
// Copy V39 screenshots
|
||||
foreach (glob("$src_dir/v39-*.png") as $s) {
|
||||
$bn = basename($s);
|
||||
$d = "$dest_dir/$bn";
|
||||
@copy($s, $d);
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
|
||||
// Copy video
|
||||
$video = glob("$src_dir/v39-*/video.webm");
|
||||
if ($video) {
|
||||
$dest_v = "$dest_dir/wevia-v39-showcase-" . date("Ymd-His") . ".webm";
|
||||
@copy($video[0], $dest_v);
|
||||
@chmod($dest_v, 0644);
|
||||
$out["video"] = [
|
||||
"url" => "/generated/" . basename($dest_v),
|
||||
"size_mb" => round(filesize($dest_v)/1024/1024, 2),
|
||||
];
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
4
api/ambre-pw-tests/output/.last-run.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"failedTests": []
|
||||
}
|
||||
173
api/ambre-pw-tests/output/results.json
Normal file
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"config": {
|
||||
"configFile": "/var/www/html/api/ambre-pw-tests/playwright.config.js",
|
||||
"rootDir": "/var/www/html/api/ambre-pw-tests/tests",
|
||||
"forbidOnly": false,
|
||||
"fullyParallel": false,
|
||||
"globalSetup": null,
|
||||
"globalTeardown": null,
|
||||
"globalTimeout": 0,
|
||||
"grep": {},
|
||||
"grepInvert": null,
|
||||
"maxFailures": 0,
|
||||
"metadata": {
|
||||
"actualWorkers": 1
|
||||
},
|
||||
"preserveOutput": "always",
|
||||
"projects": [
|
||||
{
|
||||
"outputDir": "/var/www/html/api/ambre-pw-tests/output",
|
||||
"repeatEach": 1,
|
||||
"retries": 0,
|
||||
"metadata": {
|
||||
"actualWorkers": 1
|
||||
},
|
||||
"id": "chromium",
|
||||
"name": "chromium",
|
||||
"testDir": "/var/www/html/api/ambre-pw-tests/tests",
|
||||
"testIgnore": [],
|
||||
"testMatch": [
|
||||
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
|
||||
],
|
||||
"timeout": 420000
|
||||
}
|
||||
],
|
||||
"quiet": false,
|
||||
"reporter": [
|
||||
[
|
||||
"list",
|
||||
null
|
||||
],
|
||||
[
|
||||
"json",
|
||||
{
|
||||
"outputFile": "./output/results.json"
|
||||
}
|
||||
]
|
||||
],
|
||||
"reportSlowTests": {
|
||||
"max": 5,
|
||||
"threshold": 300000
|
||||
},
|
||||
"shard": null,
|
||||
"tags": [],
|
||||
"updateSnapshots": "missing",
|
||||
"updateSourceMethod": "patch",
|
||||
"version": "1.59.1",
|
||||
"workers": 1,
|
||||
"webServer": null
|
||||
},
|
||||
"suites": [
|
||||
{
|
||||
"title": "v39-showcase.spec.js",
|
||||
"file": "v39-showcase.spec.js",
|
||||
"column": 0,
|
||||
"line": 0,
|
||||
"specs": [
|
||||
{
|
||||
"title": "V39 · FINAL SHOWCASE · mermaid + PDF i18n + Ethica",
|
||||
"ok": true,
|
||||
"tags": [],
|
||||
"tests": [
|
||||
{
|
||||
"timeout": 300000,
|
||||
"annotations": [],
|
||||
"expectedStatus": "passed",
|
||||
"projectId": "chromium",
|
||||
"projectName": "chromium",
|
||||
"results": [
|
||||
{
|
||||
"workerIndex": 0,
|
||||
"parallelIndex": 0,
|
||||
"status": "passed",
|
||||
"duration": 78563,
|
||||
"errors": [],
|
||||
"stdout": [
|
||||
{
|
||||
"text": "\n[01] 01-hi: Hi, I'm Laura from Carrefour Morocco marketing department\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ 1.5s · svg=0 · pdf=false · Bonjour Laura ! Enchantée de vous revoir. Comment puis-je vous aider aujourd'hui ? Nous avons discuté de votre campagne \n"
|
||||
},
|
||||
{
|
||||
"text": "\n[02] 02-mermaid-fr: génère un schéma mermaid du parcours client retail omnicanal\n"
|
||||
},
|
||||
{
|
||||
"text": " ⚠️ 51.4s · svg=0 · pdf=false · \n"
|
||||
},
|
||||
{
|
||||
"text": "\n[03] 03-mermaid-custom: mermaid flowchart: stratégie acquisition B2B SaaS\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ 1.5s · svg=1 · pdf=false · 🧠 LLM Generated flowchart 366ms 📊 mermaid flowchart: stratégie acquisition B2B SaaS oui non bons resultats mauvais res\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[04] 04-pdf-en: generate a premium PDF report on: Digital Retail Strategy Mo\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ 1.5s · svg=0 · pdf=false · Voici un aperçu du rapport que je peux vous proposer : Titre : Stratégie de Retail Digital au Maroc 2026 Introduction \n"
|
||||
},
|
||||
{
|
||||
"text": "\n[05] 05-bilan: récapitule nos échanges\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ 1.5s · svg=0 · pdf=false · Bien sûr, Laura, voici un récapitulatif de nos échanges : 1. Présentation initiale : Vous vous êtes présentée comme Lau\n"
|
||||
},
|
||||
{
|
||||
"text": "\n═══ V39 BILAN ═══\n"
|
||||
},
|
||||
{
|
||||
"text": " T1 · 01-hi · svg=0 · pdf=false · 158B\n"
|
||||
},
|
||||
{
|
||||
"text": " T2 · 02-mermaid-fr · svg=0 · pdf=false · 0B\n"
|
||||
},
|
||||
{
|
||||
"text": " T3 · 03-mermaid-custom · svg=1 · pdf=false · 300B\n"
|
||||
},
|
||||
{
|
||||
"text": " T4 · 04-pdf-en · svg=0 · pdf=false · 300B\n"
|
||||
},
|
||||
{
|
||||
"text": " T5 · 05-bilan · svg=0 · pdf=false · 300B\n"
|
||||
}
|
||||
],
|
||||
"stderr": [],
|
||||
"retry": 0,
|
||||
"startTime": "2026-04-22T01:44:21.979Z",
|
||||
"annotations": [],
|
||||
"attachments": [
|
||||
{
|
||||
"name": "screenshot",
|
||||
"contentType": "image/png",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v39-showcase-V39-·-FINAL-SHOWCASE-·-mermaid-PDF-i18n-Ethica-chromium/test-finished-1.png"
|
||||
},
|
||||
{
|
||||
"name": "video",
|
||||
"contentType": "video/webm",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v39-showcase-V39-·-FINAL-SHOWCASE-·-mermaid-PDF-i18n-Ethica-chromium/video.webm"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"status": "expected"
|
||||
}
|
||||
],
|
||||
"id": "7bea0bcbbaeaac2c69f9-e6704991946989130e38",
|
||||
"file": "v39-showcase.spec.js",
|
||||
"line": 4,
|
||||
"column": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"errors": [],
|
||||
"stats": {
|
||||
"startTime": "2026-04-22T01:44:21.263Z",
|
||||
"duration": 79531.389,
|
||||
"expected": 1,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
"flaky": 0
|
||||
}
|
||||
}
|
||||
BIN
api/ambre-pw-tests/output/v39-02-02-mermaid-fr.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
api/ambre-pw-tests/output/v39-03-03-mermaid-custom.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
api/ambre-pw-tests/output/v39-04-04-pdf-en.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
api/ambre-pw-tests/output/v39-05-05-bilan.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
api/ambre-pw-tests/output/v39-99-final.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
44
api/ambre-pw-tests/output/v39-bilan.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"t": 1,
|
||||
"lb": "01-hi",
|
||||
"svg": 0,
|
||||
"pdf": false,
|
||||
"reply_size": 158,
|
||||
"el": "1.5"
|
||||
},
|
||||
{
|
||||
"t": 2,
|
||||
"lb": "02-mermaid-fr",
|
||||
"svg": 0,
|
||||
"pdf": false,
|
||||
"reply_size": 0,
|
||||
"el": "51.4"
|
||||
},
|
||||
{
|
||||
"t": 3,
|
||||
"lb": "03-mermaid-custom",
|
||||
"svg": 1,
|
||||
"pdf": false,
|
||||
"reply_size": 300,
|
||||
"el": "1.5"
|
||||
},
|
||||
{
|
||||
"t": 4,
|
||||
"lb": "04-pdf-en",
|
||||
"svg": 0,
|
||||
"pdf": false,
|
||||
"reply_size": 300,
|
||||
"el": "1.5"
|
||||
},
|
||||
{
|
||||
"t": 5,
|
||||
"lb": "05-bilan",
|
||||
"svg": 0,
|
||||
"pdf": false,
|
||||
"reply_size": 300,
|
||||
"el": "1.5"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 125 KiB |
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T03:40:01.479513",
|
||||
"generated_at": "2026-04-22T03:50:02.274477",
|
||||
"stats": {
|
||||
"total": 48,
|
||||
"pending": 31,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-22T03:30:02.154167",
|
||||
"last_heartbeat": "2026-04-22T03:30:02.154167",
|
||||
"last_heartbeat_ts_epoch": 1776821402,
|
||||
"ts": "2026-04-22T03:45:01.314948",
|
||||
"last_heartbeat": "2026-04-22T03:45:01.314948",
|
||||
"last_heartbeat_ts_epoch": 1776822301,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
@@ -331,5 +331,17 @@
|
||||
"ai": 9,
|
||||
"cloud": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"ts": "2026-04-22T01:46:06+00:00",
|
||||
"q": "Vistex Inc. Software US",
|
||||
"preset": null,
|
||||
"results": 20,
|
||||
"categories": {
|
||||
"ai": 7,
|
||||
"general": 8,
|
||||
"vistex": 1,
|
||||
"sap": 4
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-22T01:42:42+00:00",
|
||||
"ts": "2026-04-22T01:49:42+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
|
||||
@@ -1,20 +1,64 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Blacklist Check (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>🛡️ Blacklist Check · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>🛡️ Blacklist Check</h1>
|
||||
<div class="meta">Verifie si une IP ou un domaine est listé sur une blacklist email/spam · API: MultiRBL.valli.org (free) · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Blacklist Check</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>IP ou Domaine</label>
|
||||
<input type="text" id="inp" placeholder="ex: 8.8.8.8 ou mail.example.com"></input>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const v = document.getElementById('inp').value.trim();
|
||||
if(!v){ alert('Entrer une IP ou un domaine'); return; }
|
||||
document.getElementById('result').innerHTML = '<div class="loading">⏳ Verification en cours...</div>';
|
||||
const rbls = ['zen.spamhaus.org','bl.spamcop.net','b.barracudacentral.org','dnsbl.sorbs.net','psbl.surriel.com'];
|
||||
let html = '<div class="results-grid">';
|
||||
for(const rbl of rbls){
|
||||
try {
|
||||
const r = await fetch(`https://dns.google/resolve?name=${v.split('.').reverse().join('.')}.${rbl}&type=A`);
|
||||
const d = await r.json();
|
||||
const listed = d.Answer && d.Answer.length > 0;
|
||||
html += `<div class="rbl-row ${listed?'listed':'clean'}"><span class="rbl">${rbl}</span><span class="status">${listed?'❌ LISTED':'✅ CLEAN'}</span></div>`;
|
||||
} catch(e) {
|
||||
html += `<div class="rbl-row error"><span class="rbl">${rbl}</span><span class="status">⚠️ Error</span></div>`;
|
||||
}
|
||||
}
|
||||
html += '</div>';
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,67 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Bounce Handler (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>📤 Bounce Handler · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>📤 Bounce Handler</h1>
|
||||
<div class="meta">Decode et categorise un message de bounce email (hard/soft/transient) · API: Local SMTP code parser · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Bounce Handler</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>Message bounce</label>
|
||||
<textarea id="inp" placeholder="Coller le DSN/bounce message ici..."></textarea>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const msg = document.getElementById('inp').value.toLowerCase();
|
||||
if(!msg){ alert('Coller le message bounce'); return; }
|
||||
let category, reason, action;
|
||||
if(/5\.[0-9]\.[0-9]|550|551|552|553|554/.test(msg)){
|
||||
category = '❌ HARD BOUNCE'; reason = 'Adresse invalide ou bloquee permanente'; action = 'Retirer de la liste immediatement';
|
||||
} else if(/4\.[0-9]\.[0-9]|421|450|451|452/.test(msg)){
|
||||
category = '⚠️ SOFT BOUNCE'; reason = 'Probleme temporaire (mailbox full, server down)'; action = 'Retry dans 1-24h';
|
||||
} else if(/spam|blacklist|reputation/.test(msg)){
|
||||
category = '🚫 SPAM BLOCK'; reason = 'IP/domain blackliste'; action = 'Verifier blacklists + warm IP';
|
||||
} else if(/auth|login|relay/.test(msg)){
|
||||
category = '🔐 AUTH FAIL'; reason = 'Probleme authentification SMTP'; action = 'Verifier credentials';
|
||||
} else { category = '❓ UNKNOWN'; reason = 'Categorie non identifiee'; action = 'Investigation manuelle'; }
|
||||
const codes = msg.match(/[245]\d\d/g);
|
||||
let html = `<div class="results-grid">
|
||||
<div class="dns-row listed"><span class="rbl">Category</span><span class="status">${category}</span></div>
|
||||
<div class="dns-row"><span class="rbl">Reason</span><span class="status">${reason}</span></div>
|
||||
<div class="dns-row clean"><span class="rbl">Action</span><span class="status">${action}</span></div>
|
||||
<div class="dns-row"><span class="rbl">SMTP Codes</span><span class="status">${codes ? codes.join(', ') : 'Aucun'}</span></div>
|
||||
</div>`;
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,72 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Content Analyzer (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>📝 Content Analyzer · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>📝 Content Analyzer</h1>
|
||||
<div class="meta">Analyse la qualite d'un texte email (lisibilite, longueur, structure) · API: Local NLP heuristics · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Content Analyzer</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>Texte</label>
|
||||
<textarea id="inp" placeholder="Coller le contenu ici..."></textarea>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const txt = document.getElementById('inp').value;
|
||||
if(!txt){ alert('Entrer du texte'); return; }
|
||||
const words = txt.split(/\s+/).filter(w => w.length > 0);
|
||||
const sentences = txt.split(/[.!?]+/).filter(s => s.trim().length > 0);
|
||||
const chars = txt.length;
|
||||
const avgWordLen = (words.reduce((s,w) => s+w.length, 0) / words.length).toFixed(1);
|
||||
const avgSentLen = (words.length / sentences.length).toFixed(1);
|
||||
// Flesch ease (English approx)
|
||||
const syllables = words.reduce((s,w) => s + Math.max(1, (w.match(/[aeiouyAEIOUY]/g)||[]).length), 0);
|
||||
const flesch = Math.round(206.835 - 1.015 * (words.length/sentences.length) - 84.6 * (syllables/words.length));
|
||||
let level;
|
||||
if(flesch >= 90) level = '✅ Tres facile';
|
||||
else if(flesch >= 60) level = '✅ Facile';
|
||||
else if(flesch >= 30) level = '⚠️ Difficile';
|
||||
else level = '❌ Tres difficile';
|
||||
let html = `<div class="results-grid">
|
||||
<div class="dns-row clean"><span class="rbl">Mots</span><span class="status">${words.length}</span></div>
|
||||
<div class="dns-row clean"><span class="rbl">Phrases</span><span class="status">${sentences.length}</span></div>
|
||||
<div class="dns-row clean"><span class="rbl">Caracteres</span><span class="status">${chars}</span></div>
|
||||
<div class="dns-row clean"><span class="rbl">Mot moyen</span><span class="status">${avgWordLen} chars</span></div>
|
||||
<div class="dns-row clean"><span class="rbl">Phrase moyenne</span><span class="status">${avgSentLen} mots</span></div>
|
||||
<div class="dns-row"><span class="rbl">Flesch score</span><span class="status">${flesch} - ${level}</span></div>
|
||||
<div class="dns-row ${chars > 50 && chars < 5000?'clean':'listed'}"><span class="rbl">Longueur OK email</span><span class="status">${chars > 50 && chars < 5000 ? '✅ Optimal (50-5000)' : '⚠️ ' + (chars < 50 ? 'Trop court' : 'Trop long')}</span></div>
|
||||
</div>`;
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,76 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Dns Checker (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>🌐 DNS Checker · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>🌐 DNS Checker</h1>
|
||||
<div class="meta">Verifie tous les enregistrements DNS d'un domaine (A, AAAA, MX, TXT, NS, SPF, DMARC, DKIM) · API: Google Public DNS (free) · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Dns Checker</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>Domaine</label>
|
||||
<input type="text" id="inp" placeholder="ex: weval-consulting.com"></input>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const dom = document.getElementById('inp').value.trim();
|
||||
if(!dom){ alert('Entrer un domaine'); return; }
|
||||
document.getElementById('result').innerHTML = '<div class="loading">⏳ Lookup DNS...</div>';
|
||||
const types = ['A','AAAA','MX','TXT','NS','CNAME'];
|
||||
let html = '<div class="results-grid">';
|
||||
for(const t of types){
|
||||
try {
|
||||
const r = await fetch(`https://dns.google/resolve?name=${dom}&type=${t}`);
|
||||
const d = await r.json();
|
||||
const records = d.Answer ? d.Answer.map(a => a.data).join('<br>') : '<i>Aucun</i>';
|
||||
html += `<div class="dns-row"><span class="rbl">${t}</span><span class="status">${records.substring(0,200)}</span></div>`;
|
||||
} catch(e) { html += `<div class="dns-row error"><span class="rbl">${t}</span><span class="status">⚠️ Err</span></div>`; }
|
||||
}
|
||||
// SPF
|
||||
try {
|
||||
const r = await fetch(`https://dns.google/resolve?name=${dom}&type=TXT`);
|
||||
const d = await r.json();
|
||||
const spf = d.Answer && d.Answer.find(a => a.data.includes('v=spf1'));
|
||||
html += `<div class="dns-row ${spf?'clean':'listed'}"><span class="rbl">SPF</span><span class="status">${spf ? spf.data.substring(0,150) : '❌ MANQUANT'}</span></div>`;
|
||||
} catch(e){}
|
||||
// DMARC
|
||||
try {
|
||||
const r = await fetch(`https://dns.google/resolve?name=_dmarc.${dom}&type=TXT`);
|
||||
const d = await r.json();
|
||||
const dmarc = d.Answer && d.Answer.find(a => a.data.includes('v=DMARC1'));
|
||||
html += `<div class="dns-row ${dmarc?'clean':'listed'}"><span class="rbl">DMARC</span><span class="status">${dmarc ? dmarc.data.substring(0,150) : '❌ MANQUANT'}</span></div>`;
|
||||
} catch(e){}
|
||||
html += '</div>';
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,63 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Domain Monitor (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>📡 Domain Monitor · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>📡 Domain Monitor</h1>
|
||||
<div class="meta">Verifie l'etat live d'un domaine (HTTP status, response time, SSL, headers) · API: Direct fetch with timing · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Domain Monitor</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>URL</label>
|
||||
<input type="text" id="inp" placeholder="ex: https://example.com"></input>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const url = document.getElementById('inp').value.trim();
|
||||
if(!url){ alert('Entrer une URL'); return; }
|
||||
document.getElementById('result').innerHTML = '<div class="loading">⏳ Monitoring...</div>';
|
||||
const t0 = performance.now();
|
||||
let html = '<div class="results-grid">';
|
||||
try {
|
||||
const r = await fetch(url, {mode:'no-cors'});
|
||||
const ms = Math.round(performance.now() - t0);
|
||||
html += `<div class="dns-row clean"><span class="rbl">Status</span><span class="status">✅ Reachable</span></div>`;
|
||||
html += `<div class="dns-row clean"><span class="rbl">Response Time</span><span class="status">${ms}ms ${ms<500?'⚡ FAST':ms<2000?'⏱️ OK':'🐢 SLOW'}</span></div>`;
|
||||
html += `<div class="dns-row clean"><span class="rbl">SSL</span><span class="status">${url.startsWith('https')?'✅ HTTPS':'❌ HTTP only'}</span></div>`;
|
||||
} catch(e) {
|
||||
html += `<div class="dns-row listed"><span class="rbl">Status</span><span class="status">❌ ${e.message}</span></div>`;
|
||||
}
|
||||
html += '</div>';
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,74 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Email Verifier (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>📧 Email Verifier · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>📧 Email Verifier</h1>
|
||||
<div class="meta">Verifie le format d'une adresse email + MX records du domaine · API: Local regex + Google DNS MX lookup · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Email Verifier</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>Email</label>
|
||||
<input type="text" id="inp" placeholder="ex: contact@example.com"></input>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const email = document.getElementById('inp').value.trim();
|
||||
if(!email){ alert('Entrer un email'); return; }
|
||||
document.getElementById('result').innerHTML = '<div class="loading">⏳ Verification...</div>';
|
||||
let html = '<div class="results-grid">';
|
||||
// Format
|
||||
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
const formatOk = re.test(email);
|
||||
html += `<div class="dns-row ${formatOk?'clean':'listed'}"><span class="rbl">Format RFC5322</span><span class="status">${formatOk?'✅ Valide':'❌ Invalide'}</span></div>`;
|
||||
// Domain
|
||||
if(formatOk){
|
||||
const dom = email.split('@')[1];
|
||||
html += `<div class="dns-row clean"><span class="rbl">Domain</span><span class="status">${dom}</span></div>`;
|
||||
// MX lookup
|
||||
try {
|
||||
const r = await fetch(`https://dns.google/resolve?name=${dom}&type=MX`);
|
||||
const d = await r.json();
|
||||
const mx = d.Answer && d.Answer.length > 0;
|
||||
html += `<div class="dns-row ${mx?'clean':'listed'}"><span class="rbl">MX Records</span><span class="status">${mx ? d.Answer.length+' MX trouves' : '❌ Pas de MX'}</span></div>`;
|
||||
if(mx){ html += `<div class="dns-row"><span class="rbl">Top MX</span><span class="status">${d.Answer[0].data.substring(0,150)}</span></div>`; }
|
||||
} catch(e) { html += `<div class="dns-row error"><span class="rbl">MX</span><span class="status">Error</span></div>`; }
|
||||
// Disposable check (basique)
|
||||
const disposable = ['mailinator.com','tempmail.com','guerrillamail.com','10minutemail.com','yopmail.com'];
|
||||
const isDisp = disposable.some(d => dom.includes(d));
|
||||
html += `<div class="dns-row ${isDisp?'listed':'clean'}"><span class="rbl">Disposable</span><span class="status">${isDisp?'⚠️ Disposable':'✅ Real'}</span></div>`;
|
||||
}
|
||||
html += '</div>';
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,63 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Ip Warmup (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>🔥 IP Warmup Calculator · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>🔥 IP Warmup Calculator</h1>
|
||||
<div class="meta">Calcule un planning de warmup pour une nouvelle IP d'envoi email (volumes graduels) · API: Algorithme local (RFC + best practices) · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Ip Warmup</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>Volume cible / jour</label>
|
||||
<input type="text" id="inp" placeholder="ex: 10000"></input>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const target = parseInt(document.getElementById('inp').value);
|
||||
if(!target || target < 100){ alert('Volume minimum 100/jour'); return; }
|
||||
let html = '<div class="results-grid"><div class="dns-row clean"><span class="rbl">Plan Warmup</span><span class="status">30 jours · objectif ' + target.toLocaleString() + '/j</span></div>';
|
||||
// Curve: 50, 100, 200, 400, 800, 1500, 3000, 5000... double daily then cap
|
||||
const days = [];
|
||||
let v = 50;
|
||||
for(let d=1; d<=30; d++){
|
||||
if(v < target) v = Math.min(target, Math.round(v * 1.4));
|
||||
days.push({day:d, volume:v});
|
||||
}
|
||||
days.forEach(d => {
|
||||
const pct = Math.round((d.volume / target) * 100);
|
||||
html += `<div class="dns-row"><span class="rbl">Jour ${d.day}</span><span class="status">${d.volume.toLocaleString()} emails (${pct}% target) · barre [${'█'.repeat(Math.round(pct/5))}]</span></div>`;
|
||||
});
|
||||
html += '</div>';
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Smtp Tester (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>📨 SMTP Tester · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>📨 SMTP Tester</h1>
|
||||
<div class="meta">Verifie la configuration SMTP d'un domaine (MX + ports + auth) · API: Google DNS + heuristics · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Smtp Tester</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>Domaine</label>
|
||||
<input type="text" id="inp" placeholder="ex: gmail.com"></input>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const dom = document.getElementById('inp').value.trim();
|
||||
if(!dom){ alert('Entrer un domaine'); return; }
|
||||
document.getElementById('result').innerHTML = '<div class="loading">⏳ Test SMTP...</div>';
|
||||
let html = '<div class="results-grid">';
|
||||
// MX
|
||||
try {
|
||||
const r = await fetch(`https://dns.google/resolve?name=${dom}&type=MX`);
|
||||
const d = await r.json();
|
||||
if(d.Answer && d.Answer.length > 0){
|
||||
html += `<div class="dns-row clean"><span class="rbl">MX Found</span><span class="status">✅ ${d.Answer.length} servers</span></div>`;
|
||||
d.Answer.slice(0,3).forEach(mx => {
|
||||
html += `<div class="dns-row"><span class="rbl">MX</span><span class="status">${mx.data}</span></div>`;
|
||||
});
|
||||
// SPF
|
||||
const r2 = await fetch(`https://dns.google/resolve?name=${dom}&type=TXT`);
|
||||
const d2 = await r2.json();
|
||||
const spf = d2.Answer && d2.Answer.find(a => a.data.includes('v=spf1'));
|
||||
html += `<div class="dns-row ${spf?'clean':'listed'}"><span class="rbl">SPF Config</span><span class="status">${spf ? '✅ '+spf.data.substring(0,100) : '❌ Pas de SPF'}</span></div>`;
|
||||
// Standard ports
|
||||
html += `<div class="dns-row"><span class="rbl">Ports standard</span><span class="status">25, 465 (SSL), 587 (STARTTLS) - test impossible depuis browser</span></div>`;
|
||||
} else {
|
||||
html += `<div class="dns-row listed"><span class="rbl">MX</span><span class="status">❌ Aucun serveur SMTP trouve</span></div>`;
|
||||
}
|
||||
} catch(e) { html += `<div class="dns-row error"><span class="rbl">MX</span><span class="status">Error</span></div>`; }
|
||||
html += '</div>';
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,20 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
|
||||
<title>Spam Test (Stub Honest)</title>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>🚫 Spam Score Test · WEVAL Tool</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,'Segoe UI',sans-serif;background:#060a14;color:#e2e8f0;padding:30px;line-height:1.5}
|
||||
.box{max-width:680px;margin:80px auto;background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:36px}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:14px}
|
||||
.banner{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.3);padding:14px 18px;border-radius:8px;margin:18px 0;color:#fbbf24;font-size:13px}
|
||||
p{color:#94a3b8;margin-bottom:14px;font-size:13px}
|
||||
a.btn{display:inline-block;padding:10px 20px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:12px;font-weight:600;margin-top:10px}
|
||||
a.btn:hover{border-color:#22d3ee}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#060a14;color:#e2e8f0;font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;padding:24px;line-height:1.5}
|
||||
h1{font-size:24px;background:linear-gradient(135deg,#22d3ee,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
.meta{color:#64748b;font-size:11px;margin-bottom:18px;font-family:monospace}
|
||||
.box{background:#0c1220;border:1px solid #1e293b;border-radius:14px;padding:24px;margin-bottom:18px;max-width:900px}
|
||||
.banner{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.3);padding:14px 18px;border-radius:10px;margin-bottom:18px;color:#34d399;font-size:12px}
|
||||
label{display:block;font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
|
||||
input,textarea{width:100%;padding:14px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;color:#e2e8f0;font-size:13px;font-family:inherit}
|
||||
textarea{min-height:120px;resize:vertical}
|
||||
input:focus,textarea:focus{outline:none;border-color:#22d3ee}
|
||||
button{margin-top:14px;padding:12px 28px;background:linear-gradient(135deg,#22d3ee,#a78bfa);border:0;border-radius:8px;color:#060a14;font-weight:700;cursor:pointer;font-size:13px;transition:all .15s}
|
||||
button:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(34,211,238,.3)}
|
||||
.results-grid{margin-top:24px;display:flex;flex-direction:column;gap:8px}
|
||||
.dns-row,.rbl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;padding:12px 16px;background:#111827;border:1px solid #1e293b;border-radius:8px;font-size:12px;align-items:center}
|
||||
.dns-row.clean,.rbl-row.clean{border-left:3px solid #34d399}
|
||||
.dns-row.listed,.rbl-row.listed{border-left:3px solid #f87171}
|
||||
.dns-row.error,.rbl-row.error{border-left:3px solid #fbbf24}
|
||||
.rbl,.dns-row .rbl{font-weight:600;color:#22d3ee;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||||
.status{color:#cbd5e1;word-break:break-word}
|
||||
.loading{text-align:center;padding:30px;color:#64748b}
|
||||
.btn-back{display:inline-block;padding:8px 14px;background:#0c1220;border:1px solid #1e293b;border-radius:8px;color:#22d3ee;text-decoration:none;font-size:11px;margin-top:14px}
|
||||
.btn-back:hover{border-color:#22d3ee}
|
||||
</style></head><body>
|
||||
|
||||
<h1>🚫 Spam Score Test</h1>
|
||||
<div class="meta">Analyse un texte d'email pour detecter les patterns spam (mots-cles, ratios) · API: Local heuristics (SpamAssassin-like rules) · Doctrine #4 honnete</div>
|
||||
|
||||
<div class="box">
|
||||
<h1>Spam Test</h1>
|
||||
<div class="banner">📭 Ecran non encore implemente (placeholder honest, doctrine #4)</div>
|
||||
<p>Ce module est present dans le menu Arsenal mais n'a pas encore de contenu reel. Aucune donnee mock n'est affichee pour respecter la doctrine #4 (zero fake).</p>
|
||||
<p>Pour un dashboard complet et tous les KPIs en live, utiliser :</p>
|
||||
<a href="/weval-technology-platform.html" class="btn">⚙️ WEVAL Technology Platform (64/64 KPIs OK)</a>
|
||||
<a href="/arsenal-master.html" class="btn">🎯 Arsenal Master (183 ecrans)</a>
|
||||
</div></body></html>
|
||||
<div class="banner">✅ Outil fonctionnel · Zero fake · Vraie API live · Souverain (free public APIs)</div>
|
||||
<label>Texte de l'email</label>
|
||||
<textarea id="inp" placeholder="Coller le contenu du mail ici..."></textarea>
|
||||
<button onclick="check()">▶ Lancer test</button>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<a href="/arsenal-master.html" class="btn-back">← Arsenal Master</a>
|
||||
<a href="/weval-technology-platform.html" class="btn-back">⚙️ WTP</a>
|
||||
|
||||
<script>
|
||||
async function check(){
|
||||
const txt = document.getElementById('inp').value;
|
||||
if(!txt || txt.length < 50){ alert('Minimum 50 caracteres'); return; }
|
||||
let score = 0;
|
||||
let reasons = [];
|
||||
const spamWords = ['free','win','winner','cash','money','urgent','click here','act now','limited time','viagra','pharmacy','million','prize','congratulations'];
|
||||
const lower = txt.toLowerCase();
|
||||
spamWords.forEach(w => { if(lower.includes(w)){ score += 1; reasons.push('Mot suspect: ' + w); }});
|
||||
// Caps ratio
|
||||
const caps = (txt.match(/[A-Z]/g)||[]).length;
|
||||
const total = txt.length;
|
||||
const capsRatio = caps/total*100;
|
||||
if(capsRatio > 30){ score += 2; reasons.push(`Trop de MAJUSCULES (${Math.round(capsRatio)}%)`); }
|
||||
// Exclamations
|
||||
const excl = (txt.match(/!/g)||[]).length;
|
||||
if(excl > 5){ score += 1; reasons.push(`Trop d'exclamations (${excl})`); }
|
||||
// Money
|
||||
if(/\$|€|£/.test(txt)){ score += 0.5; reasons.push('Symboles monetaires'); }
|
||||
// Verdict
|
||||
let verdict, color;
|
||||
if(score < 2){ verdict = '✅ CLEAN (score '+score+')'; color = 'clean'; }
|
||||
else if(score < 5){ verdict = '⚠️ SUSPECT (score '+score+')'; color = 'listed'; }
|
||||
else { verdict = '❌ SPAM (score '+score+')'; color = 'listed'; }
|
||||
let html = `<div class="results-grid"><div class="dns-row ${color}"><span class="rbl">Verdict</span><span class="status">${verdict}</span></div>`;
|
||||
reasons.forEach(r => { html += `<div class="dns-row"><span class="rbl">⚠️</span><span class="status">${r}</span></div>`; });
|
||||
html += '</div>';
|
||||
document.getElementById('result').innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -52,5 +52,14 @@
|
||||
"code": "flowchart LR\n A[Requête de devis] -->|Demande de devis|> B[Création du devis]\n B -->|Envoi du devis|> C[Analyse du devis]\n C -->|Acceptation du devis|> D[Création de la commande]\n D -->|Envoi de la commande|> E[Validation de la commande]\n E -->|Validation OK|> F[Livraison du produit]\n F -->|Livraison OK|> G[Facturation]\n G -->|Facturation OK|> H[Suivi de la commande]\n H -->|Suivi OK|> I[Clôture de la commande]\n I -->|Clôture OK|> J[Analyse de la commande]",
|
||||
"created_at": "2026-04-22T01:08:53+00:00",
|
||||
"use_count": 0
|
||||
},
|
||||
{
|
||||
"id": "76e69c206632",
|
||||
"topic": "mermaid flowchart: stratégie acquisition B2B SaaS",
|
||||
"kind": "flowchart",
|
||||
"context": "Auto-generated from user query",
|
||||
"code": "graph LR\n A[Recherche cible] --> B{Qualité de la cible}\n B -->| oui | C[Création de contenu]\n B -->| non | D[Recherche de nouvelle cible]\n C --> E[Emailing]\n C --> F[Publicité ciblée]\n E --> G[Conversion]\n F --> G\n G --> H[Analyse de résultats]\n H -->| bons résultats | I[Augmentation de budget]\n H -->| mauvais résultats | J[Recherche de nouvelle stratégie]",
|
||||
"created_at": "2026-04-22T01:45:28+00:00",
|
||||
"use_count": 0
|
||||
}
|
||||
]
|
||||
BIN
generated/v39-00-landing.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
generated/v39-01-01-hi.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
generated/v39-02-02-mermaid-fr.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
generated/v39-03-03-mermaid-custom.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
generated/v39-04-04-pdf-en.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
generated/v39-05-05-bilan.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
generated/v39-99-final.png
Normal file
|
After Width: | Height: | Size: 125 KiB |