Files
wevia-brain/s89-arsenal-screens/scrapping-factory.html
2026-04-12 23:01:36 +02:00

363 lines
25 KiB
HTML
Executable File

<!DOCTYPE html><html lang="fr" data-theme="dark"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>WEVADS - Scraping Factory</title>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=DM+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--m:#475569;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa}
body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;padding:20px}
.mono{font-family:'JetBrains Mono',monospace}
.hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;flex-wrap:wrap;gap:12px}
h1{font-size:24px;font-weight:700}
.back{color:var(--d);text-decoration:none;font-size:12px;padding:6px 14px;border:1px solid var(--b);border-radius:8px}
.back:hover{border-color:var(--cy);color:var(--cy)}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:20px}
.stat-card{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:16px;position:relative;overflow:hidden}
.stat-card::after{content:'';position:absolute;top:0;right:0;width:60px;height:60px;border-radius:0 12px 0 60px;opacity:.08}
.stat-card.cy::after{background:var(--cy)}.stat-card.gn::after{background:var(--gn)}.stat-card.am::after{background:var(--am)}.stat-card.rd::after{background:var(--rd)}.stat-card.pu::after{background:var(--pu)}
.stat-val{font-size:28px;font-weight:700;font-family:'JetBrains Mono',monospace}
.stat-val.cy{color:var(--cy)}.stat-val.gn{color:var(--gn)}.stat-val.am{color:var(--am)}.stat-val.rd{color:var(--rd)}.stat-val.pu{color:var(--pu)}
.stat-lbl{font-size:11px;color:var(--d);text-transform:uppercase;letter-spacing:.5px;margin-top:4px}
.stat-delta{font-size:10px;margin-top:6px;font-family:'JetBrains Mono',monospace}
.stat-delta.up{color:var(--gn)}.stat-delta.dn{color:var(--rd)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:900px){.grid2{grid-template-columns:1fr}}
.panel{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:16px;margin-bottom:16px}
.panel h2{font-size:16px;font-weight:700;margin-bottom:12px;display:flex;align-items:center;gap:8px}
.panel h3{font-size:12px;color:var(--d);margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}
table{width:100%;border-collapse:collapse;font-size:12px}
th{text-align:left;color:var(--d);font-size:10px;text-transform:uppercase;letter-spacing:.5px;padding:8px 10px;border-bottom:1px solid var(--b)}
td{padding:8px 10px;border-bottom:1px solid rgba(30,41,59,.5);vertical-align:middle}
tr:hover{background:rgba(34,211,238,.03)}
.badge{padding:2px 8px;border-radius:6px;font-size:9px;font-weight:700;text-transform:uppercase}
.badge-on{background:rgba(52,211,153,.15);color:var(--gn)}.badge-off{background:rgba(248,113,113,.15);color:var(--rd)}.badge-wait{background:rgba(251,191,36,.15);color:var(--am)}
.btn{padding:6px 14px;border-radius:8px;font-size:11px;font-weight:600;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;transition:all .2s}
.btn:hover{border-color:var(--cy);color:var(--cy)}
.btn-primary{background:rgba(34,211,238,.15);border-color:var(--cy);color:var(--cy)}
.btn-danger{background:rgba(248,113,113,.1);border-color:var(--rd);color:var(--rd)}
.btn-sm{padding:4px 10px;font-size:10px}
.progress{height:6px;background:var(--b);border-radius:3px;overflow:hidden;margin-top:6px}
.progress-fill{height:100%;border-radius:3px;transition:width 1s}
input,select,textarea{background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:8px 12px;color:var(--t);font-size:12px;font-family:'DM Sans',sans-serif;width:100%}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--cy)}
.form-row{display:flex;gap:10px;margin-bottom:10px;align-items:end}
.form-row>div{flex:1}
.form-row label{display:block;font-size:10px;color:var(--d);text-transform:uppercase;margin-bottom:4px;letter-spacing:.5px}
.tabs{display:flex;gap:4px;margin-bottom:16px;border-bottom:1px solid var(--b);padding-bottom:8px}
.tab{padding:6px 16px;border-radius:8px 8px 0 0;font-size:12px;font-weight:600;cursor:pointer;color:var(--d);transition:all .2s}
.tab:hover{color:var(--t)}.tab.active{color:var(--cy);background:rgba(34,211,238,.08);border-bottom:2px solid var(--cy)}
.source-card{background:var(--s2);border:1px solid var(--b);border-radius:10px;padding:14px;margin-bottom:10px;display:flex;justify-content:space-between;align-items:center}
.source-card:hover{border-color:var(--cy)}
.source-info{flex:1}
.source-name{font-size:14px;font-weight:600;margin-bottom:2px}
.source-url{font-size:11px;color:var(--d);font-family:'JetBrains Mono',monospace}
.source-stats{display:flex;gap:16px;font-size:11px;margin-top:6px;color:var(--m)}
.source-stats span{font-family:'JetBrains Mono',monospace}
.log-line{padding:4px 8px;font-size:11px;font-family:'JetBrains Mono',monospace;color:var(--d);border-bottom:1px solid rgba(30,41,59,.3)}
.log-line .ts{color:var(--m);margin-right:8px}
.log-line .ok{color:var(--gn)}.log-line .err{color:var(--rd)}.log-line .wrn{color:var(--am)}
.tag{display:inline-block;padding:2px 6px;border-radius:4px;font-size:9px;font-weight:600;margin-right:4px}
.tag-email{background:rgba(34,211,238,.1);color:var(--cy)}
.tag-phone{background:rgba(167,139,250,.1);color:var(--pu)}
.tag-name{background:rgba(52,211,153,.1);color:var(--gn)}
</style><style>.light{--bg:#f0f2f5;--s:#ffffff;--s2:#f8fafc;--b:#e2e8f0;--t:#1e293b;--d:#64748b}.light input,.light select,.light textarea{background:#f8fafc;border-color:#e2e8f0;color:#1e293b}</style>
<style id="weval-theme-system">
/* Day/Night Theme Toggle */
[data-theme="light"] { --bg:#f0f2f5!important; --s:#ffffff!important; --s2:#f8fafc!important; --b:#e2e8f0!important; --t:#1e293b!important; --d:#64748b!important; }
[data-theme="light"] input, [data-theme="light"] select, [data-theme="light"] textarea {
background:#f8fafc!important; border-color:#e2e8f0!important; color:#1e293b!important;
}
[data-theme="light"] .hdr, [data-theme="light"] header, [data-theme="light"] nav {
background:#ffffff!important; border-color:#e2e8f0!important;
}
[data-theme="light"] table, [data-theme="light"] th, [data-theme="light"] td {
border-color:#e2e8f0!important;
}
[data-theme="light"] th { background:#f8fafc!important; }
[data-theme="light"] .sc, [data-theme="light"] .card, [data-theme="light"] [class*="card"] {
background:#ffffff!important; border-color:#e2e8f0!important;
}
.weval-theme-btn {
position:fixed; bottom:16px; right:16px; z-index:9999;
width:40px; height:40px; border-radius:50%;
border:1px solid var(--b, #1e293b);
background:var(--s, #0c1220);
color:var(--t, #e2e8f0);
cursor:pointer; font-size:18px;
display:flex; align-items:center; justify-content:center;
box-shadow:0 2px 8px rgba(0,0,0,0.3);
transition:all 0.2s;
}
.weval-theme-btn:hover { transform:scale(1.1); }
</style>
</head><body>
<div class="hdr">
<div><h1>Scraping Factory</h1><div style="color:var(--d);font-size:12px;margin-top:2px">FLUX 1 &rarr; Lead Acquisition &rarr; Scraping &rarr; Data Cleaning &rarr; Send Data</div></div>
<div style="display:flex;gap:8px"><a class="back" href="operations-overview.html">&larr; Overview</a><a class="back" href="menu.html">Menu</a></div>
</div>
<!-- STATS -->
<div class="stats">
<div class="stat-card cy"><div class="stat-val cy" id="total-scraped">247,831</div><div class="stat-lbl">Total Scraped</div><div class="stat-delta up">+12,340 today</div></div>
<div class="stat-card gn"><div class="stat-val gn" id="valid-leads">198,265</div><div class="stat-lbl">Valid Leads</div><div class="stat-delta up">79.8% valid rate</div></div>
<div class="stat-card am"><div class="stat-val am">6</div><div class="stat-lbl">Sources Actives</div><div class="stat-delta up">2 running now</div></div>
<div class="stat-card pu"><div class="stat-val pu">49,566</div><div class="stat-lbl">Rejected / Dupes</div><div class="stat-delta dn">20.2% reject rate</div></div>
<div class="stat-card rd"><div class="stat-val rd">3</div><div class="stat-lbl">Erreurs 24h</div><div class="stat-delta dn">Timeout x2, DNS x1</div></div>
</div>
<!-- TABS -->
<div class="tabs">
<div class="tab active" onclick="showTab('sources')">Sources</div>
<div class="tab" onclick="showTab('newjob')">+ Nouveau Job</div>
<div class="tab" onclick="showTab('cleaning')">Data Cleaning</div>
<div class="tab" onclick="showTab('export')">Export &rarr; Send Data</div>
<div class="tab" onclick="showTab('logs')">Logs Live</div>
</div>
<!-- TAB: SOURCES -->
<div id="tab-sources">
<div class="grid2">
<div class="panel">
<h2>Sources de Scraping</h2>
<div class="source-card">
<div class="source-info">
<div class="source-name">LinkedIn Sales Navigator <span class="badge badge-on">RUNNING</span></div>
<div class="source-url">linkedin.com/sales/search</div>
<div class="source-stats"><span>Scraped: <b style="color:var(--cy)">45,230</b></span><span>Valid: <b style="color:var(--gn)">38,445</b></span><span>Speed: <b>120/min</b></span></div>
<div class="progress"><div class="progress-fill" style="width:68%;background:var(--cy)"></div></div>
</div>
<div style="display:flex;gap:6px;flex-direction:column"><button class="btn btn-sm btn-danger" onclick="alert('Pause LinkedIn')">Pause</button><button class="btn btn-sm" onclick="alert('Config LinkedIn')">Config</button></div>
</div>
<div class="source-card">
<div class="source-info">
<div class="source-name">Google Maps Extractor <span class="badge badge-on">RUNNING</span></div>
<div class="source-url">google.com/maps - FR, DE, IT, UK</div>
<div class="source-stats"><span>Scraped: <b style="color:var(--cy)">89,120</b></span><span>Valid: <b style="color:var(--gn)">71,296</b></span><span>Speed: <b>200/min</b></span></div>
<div class="progress"><div class="progress-fill" style="width:82%;background:var(--gn)"></div></div>
</div>
<div style="display:flex;gap:6px;flex-direction:column"><button class="btn btn-sm btn-danger">Pause</button><button class="btn btn-sm">Config</button></div>
</div>
<div class="source-card">
<div class="source-info">
<div class="source-name">Yellow Pages FR <span class="badge badge-wait">IDLE</span></div>
<div class="source-url">pagesjaunes.fr - Toutes categories</div>
<div class="source-stats"><span>Scraped: <b>32,100</b></span><span>Valid: <b>28,890</b></span><span>Last: <b>2h ago</b></span></div>
</div>
<div style="display:flex;gap:6px;flex-direction:column"><button class="btn btn-sm btn-primary">Start</button><button class="btn btn-sm">Config</button></div>
</div>
<div class="source-card">
<div class="source-info">
<div class="source-name">Kompass B2B <span class="badge badge-wait">IDLE</span></div>
<div class="source-url">kompass.com - EU companies</div>
<div class="source-stats"><span>Scraped: <b>18,200</b></span><span>Valid: <b>15,470</b></span><span>Last: <b>5h ago</b></span></div>
</div>
<div style="display:flex;gap:6px;flex-direction:column"><button class="btn btn-sm btn-primary">Start</button><button class="btn btn-sm">Config</button></div>
</div>
<div class="source-card">
<div class="source-info">
<div class="source-name">Newsletter Extractor <span class="badge badge-on">AUTO</span></div>
<div class="source-url">Inboxes monitored: 24 seeds</div>
<div class="source-stats"><span>Extracted: <b style="color:var(--pu)">41,200</b></span><span>Unique: <b>33,640</b></span><span>Auto-feed</span></div>
</div>
<div><a class="btn btn-sm" href="newsletter-extractor.html">Open</a></div>
</div>
<div class="source-card">
<div class="source-info">
<div class="source-name">Dark Scraper <span class="badge badge-off">OFF</span></div>
<div class="source-url">Paste sites + leaked DBs</div>
<div class="source-stats"><span>Scraped: <b>21,981</b></span><span>Valid: <b>10,524</b></span><span>Risk: <b style="color:var(--am)">Medium</b></span></div>
</div>
<div><a class="btn btn-sm" href="dark-scraper.html">Open</a></div>
</div>
</div>
<!-- RIGHT: ISP Breakdown -->
<div>
<div class="panel">
<h2>Segmentation ISP</h2>
<h3>Repartition des leads scraped par ISP</h3>
<table>
<tr><th>ISP</th><th>Count</th><th>%</th><th>Quality</th></tr>
<tr><td><b>Gmail</b></td><td class="mono">67,420</td><td class="mono">34.0%</td><td><span class="badge badge-on">HIGH</span></td></tr>
<tr><td><b>Outlook/Hotmail</b></td><td class="mono">42,180</td><td class="mono">21.3%</td><td><span class="badge badge-on">HIGH</span></td></tr>
<tr><td><b>Yahoo</b></td><td class="mono">18,340</td><td class="mono">9.3%</td><td><span class="badge badge-wait">MED</span></td></tr>
<tr><td><b>Orange FR</b></td><td class="mono">14,870</td><td class="mono">7.5%</td><td><span class="badge badge-on">HIGH</span></td></tr>
<tr><td><b>Free FR</b></td><td class="mono">11,200</td><td class="mono">5.7%</td><td><span class="badge badge-on">HIGH</span></td></tr>
<tr><td><b>T-Online DE</b></td><td class="mono">9,840</td><td class="mono">5.0%</td><td><span class="badge badge-on">HIGH</span></td></tr>
<tr><td><b>GMX DE</b></td><td class="mono">8,120</td><td class="mono">4.1%</td><td><span class="badge badge-on">HIGH</span></td></tr>
<tr><td><b>SFR FR</b></td><td class="mono">6,450</td><td class="mono">3.3%</td><td><span class="badge badge-on">HIGH</span></td></tr>
<tr><td><b>Libero IT</b></td><td class="mono">5,200</td><td class="mono">2.6%</td><td><span class="badge badge-wait">MED</span></td></tr>
<tr><td><b>Other</b></td><td class="mono">14,645</td><td class="mono">7.4%</td><td><span class="badge badge-wait">MIX</span></td></tr>
</table>
</div>
<div class="panel">
<h2>Data Fields Captured</h2>
<div style="display:flex;flex-wrap:wrap;gap:6px;margin-top:8px">
<span class="tag tag-email">email</span><span class="tag tag-name">first_name</span><span class="tag tag-name">last_name</span><span class="tag tag-phone">phone</span>
<span class="tag" style="background:rgba(251,191,36,.1);color:var(--am)">company</span>
<span class="tag" style="background:rgba(96,165,250,.1);color:var(--bl)">job_title</span>
<span class="tag" style="background:rgba(244,114,182,.1);color:#f472b6">city</span>
<span class="tag" style="background:rgba(52,211,153,.1);color:var(--gn)">country</span>
<span class="tag" style="background:rgba(167,139,250,.1);color:var(--pu)">industry</span>
<span class="tag" style="background:rgba(34,211,238,.1);color:var(--cy)">website</span>
<span class="tag" style="background:rgba(251,191,36,.1);color:var(--am)">linkedin_url</span>
</div>
</div>
<div class="panel">
<h2>Quick Actions</h2>
<div style="display:flex;flex-wrap:wrap;gap:8px;margin-top:8px">
<button class="btn btn-primary" onclick="alert('Starting all idle sources...')">Start All Idle</button>
<button class="btn btn-danger" onclick="alert('Pausing all running...')">Pause All</button>
<button class="btn" onclick="alert('Exporting to Send Data Factory...')">Export &rarr; Send Data</button>
<button class="btn" onclick="alert('Running dedup...')">Run Dedup</button>
<a class="btn" href="data-manager.php">Data Manager</a>
<a class="btn" href="send-data-factory.php">Send Data Factory</a>
</div>
</div>
</div>
</div>
</div>
<!-- TAB: NEW JOB -->
<div id="tab-newjob" style="display:none">
<div class="panel">
<h2>Nouveau Job de Scraping</h2>
<div class="form-row">
<div><label>Nom du Job</label><input type="text" placeholder="ex: B2B France Q1 2026"></div>
<div><label>Source</label><select><option>LinkedIn Sales Nav</option><option>Google Maps</option><option>Yellow Pages</option><option>Kompass</option><option>Custom URL</option><option>CSV Import</option></select></div>
<div><label>Pays</label><select multiple><option selected>France</option><option>Germany</option><option>Italy</option><option>UK</option><option>Spain</option><option>Belgium</option><option>Switzerland</option><option>Netherlands</option></select></div>
</div>
<div class="form-row">
<div><label>Keywords / Secteur</label><input type="text" placeholder="ex: marketing agency, consultant, SaaS"></div>
<div><label>Limite Leads</label><input type="number" value="10000" placeholder="Max leads"></div>
<div><label>Vitesse</label><select><option>Slow (50/min)</option><option selected>Normal (150/min)</option><option>Fast (300/min)</option><option>Turbo (500/min)</option></select></div>
</div>
<div class="form-row">
<div><label>Proxy</label><select><option selected>Rotating Residential</option><option>Datacenter</option><option>Mobile</option></select></div>
<div><label>Anti-Captcha</label><select><option selected>Auto (2Captcha)</option><option>Manual</option><option>Off</option></select></div>
<div><label>Dedup Against</label><select><option selected>All existing leads</option><option>Last 30 days</option><option>None</option></select></div>
</div>
<div class="form-row">
<div style="flex:3"><label>Custom URL (si Custom)</label><input type="text" placeholder="https://example.com/directory"></div>
<div style="flex:1"><label>CSS Selector</label><input type="text" placeholder=".contact-email"></div>
</div>
<div style="margin-top:12px;display:flex;gap:8px">
<button class="btn btn-primary" onclick="alert('Job created and queued!')">Lancer le Job</button>
<button class="btn" onclick="alert('Saved as draft')">Sauvegarder Draft</button>
<button class="btn" onclick="alert('Test with 10 results first')">Test (10 results)</button>
</div>
</div>
</div>
<!-- TAB: CLEANING -->
<div id="tab-cleaning" style="display:none">
<div class="grid2">
<div class="panel">
<h2>Pipeline de Nettoyage</h2>
<table>
<tr><th>Etape</th><th>Action</th><th>Removed</th><th>Status</th></tr>
<tr><td><b>1. Email Syntax</b></td><td>Regex validation</td><td class="mono" style="color:var(--rd)">-2,340</td><td><span class="badge badge-on">AUTO</span></td></tr>
<tr><td><b>2. MX Check</b></td><td>DNS MX lookup</td><td class="mono" style="color:var(--rd)">-5,120</td><td><span class="badge badge-on">AUTO</span></td></tr>
<tr><td><b>3. Disposable</b></td><td>Temp email detect</td><td class="mono" style="color:var(--rd)">-1,890</td><td><span class="badge badge-on">AUTO</span></td></tr>
<tr><td><b>4. Dedup</b></td><td>Exact + fuzzy match</td><td class="mono" style="color:var(--rd)">-18,450</td><td><span class="badge badge-on">AUTO</span></td></tr>
<tr><td><b>5. Blacklist</b></td><td>Known spam traps</td><td class="mono" style="color:var(--rd)">-890</td><td><span class="badge badge-on">AUTO</span></td></tr>
<tr><td><b>6. Role-based</b></td><td>info@, admin@, etc</td><td class="mono" style="color:var(--am)">-3,200</td><td><span class="badge badge-wait">OPT</span></td></tr>
<tr><td><b>7. Catch-all</b></td><td>Accept-all detection</td><td class="mono" style="color:var(--am)">-8,120</td><td><span class="badge badge-wait">OPT</span></td></tr>
<tr><td><b>8. SMTP Verify</b></td><td>RCPT TO check</td><td class="mono" style="color:var(--rd)">-9,556</td><td><span class="badge badge-on">AUTO</span></td></tr>
</table>
<div style="margin-top:12px;padding:12px;background:var(--s2);border-radius:8px;font-size:12px">
<b style="color:var(--gn)">Result:</b> 247,831 scraped &rarr; <b style="color:var(--gn)">198,265 valid</b> (79.8% retention)
</div>
</div>
<div class="panel">
<h2>Cleaning Config</h2>
<div style="margin-top:8px">
<div style="display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--b);font-size:13px"><span>Email Syntax Check</span><label style="width:auto"><input type="checkbox" checked> On</label></div>
<div style="display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--b);font-size:13px"><span>MX Record Verify</span><label style="width:auto"><input type="checkbox" checked> On</label></div>
<div style="display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--b);font-size:13px"><span>Disposable Email Filter</span><label style="width:auto"><input type="checkbox" checked> On</label></div>
<div style="display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--b);font-size:13px"><span>Dedup (exact + fuzzy)</span><label style="width:auto"><input type="checkbox" checked> On</label></div>
<div style="display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--b);font-size:13px"><span>Blacklist / Spam Traps</span><label style="width:auto"><input type="checkbox" checked> On</label></div>
<div style="display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--b);font-size:13px"><span>Remove Role-based</span><label style="width:auto"><input type="checkbox"> Off</label></div>
<div style="display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--b);font-size:13px"><span>Remove Catch-all</span><label style="width:auto"><input type="checkbox"> Off</label></div>
<div style="display:flex;justify-content:space-between;padding:8px 0;font-size:13px"><span>SMTP RCPT Verify</span><label style="width:auto"><input type="checkbox" checked> On</label></div>
</div>
<button class="btn btn-primary" style="margin-top:12px" onclick="alert('Running cleaning pipeline...')">Run Cleaning Now</button>
</div>
</div>
</div>
<!-- TAB: EXPORT -->
<div id="tab-export" style="display:none">
<div class="panel">
<h2>Export vers Send Data Factory</h2>
<h3>Segmente et pousse les leads valides vers le pipeline d envoi</h3>
<div class="form-row">
<div><label>Dataset</label><select><option>All Valid Leads (198,265)</option><option>Today's Scrape (12,340)</option><option>Gmail Only (67,420)</option><option>Europe Only (142,800)</option></select></div>
<div><label>Segmentation</label><select><option selected>Par ISP automatique</option><option>Par pays</option><option>Par source</option><option>Custom</option></select></div>
<div><label>Destination</label><select><option selected>Send Data Factory</option><option>ADX Client Direct</option><option>CSV Export</option><option>Brain Test (seeds)</option></select></div>
</div>
<div class="form-row">
<div><label>Batch Size</label><input type="number" value="5000" placeholder="Leads per batch"></div>
<div><label>Throttle</label><select><option>No delay</option><option selected>1 batch/min</option><option>1 batch/5min</option></select></div>
<div><label>Dedup Against Send History</label><select><option selected>Last 30 days</option><option>Last 90 days</option><option>All time</option><option>None</option></select></div>
</div>
<div style="margin-top:12px;display:flex;gap:8px">
<button class="btn btn-primary" onclick="alert('Pushing 198,265 leads to Send Data Factory...')">Push to Send Data</button>
<button class="btn" onclick="alert('Downloading CSV...')">Download CSV</button>
<a class="btn" href="send-data-factory.php">Open Send Data Factory</a>
</div>
</div>
</div>
<!-- TAB: LOGS -->
<div id="tab-logs" style="display:none">
<div class="panel" style="max-height:500px;overflow-y:auto">
<h2>Logs Live</h2>
<div id="log-container">
<div class="log-line"><span class="ts">22:14:32</span><span class="ok">[OK]</span> Google Maps: Scraped 200 leads from Paris category:restaurant</div>
<div class="log-line"><span class="ts">22:14:28</span><span class="ok">[OK]</span> LinkedIn: Profile batch #452 - 45 new contacts extracted</div>
<div class="log-line"><span class="ts">22:14:15</span><span class="wrn">[WARN]</span> LinkedIn: Rate limit approaching - slowing to 80/min</div>
<div class="log-line"><span class="ts">22:14:02</span><span class="ok">[OK]</span> Dedup: Removed 23 duplicates from batch #451</div>
<div class="log-line"><span class="ts">22:13:58</span><span class="ok">[OK]</span> MX Check: 198/200 valid in last batch</div>
<div class="log-line"><span class="ts">22:13:45</span><span class="err">[ERR]</span> Dark Scraper: Connection timeout to source #3 - retrying</div>
<div class="log-line"><span class="ts">22:13:30</span><span class="ok">[OK]</span> Newsletter Extractor: 12 new emails from seed inbox #7</div>
<div class="log-line"><span class="ts">22:13:22</span><span class="ok">[OK]</span> Export: Batch #89 (5000 leads) pushed to Send Data Factory</div>
<div class="log-line"><span class="ts">22:13:10</span><span class="wrn">[WARN]</span> Proxy rotation: Switched to pool #3 (pool #2 at 85% usage)</div>
<div class="log-line"><span class="ts">22:12:55</span><span class="ok">[OK]</span> Google Maps: Completed Berlin category:agency - 1,240 leads</div>
</div>
</div>
</div>
<script>
function showTab(name){
document.querySelectorAll('[id^="tab-"]').forEach(t=>t.style.display='none');
document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));
document.getElementById('tab-'+name).style.display='block';
event.target.classList.add('active');
}
// Simulate live counter
setInterval(()=>{
const el=document.getElementById('total-scraped');
if(el){let v=parseInt(el.textContent.replace(/,/g,''));v+=Math.floor(Math.random()*5);el.textContent=v.toLocaleString();}
},3000);
</script>
<script>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");var tb=document.getElementById("theme-toggle");if(tb)tb.textContent="☀️"}</script><script src="arsenal-common.js"></script>
<button class="weval-theme-btn" id="weval-theme-toggle" onclick="(function(){
var h=document.documentElement;
var c=h.getAttribute('data-theme')||'dark';
var n=c==='dark'?'light':'dark';
h.setAttribute('data-theme',n);
localStorage.setItem('weval-theme',n);
document.getElementById('weval-theme-toggle').textContent=n==='dark'?'☀️':'🌙';
})()">☀️</button>