122 lines
9.1 KiB
PHP
Executable File
122 lines
9.1 KiB
PHP
Executable File
<?php
|
|
$pdo = new PDO("pgsql:host=localhost;dbname=adx_system", "admin", "admin123");
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
if (isset($_GET['ajax'])) {
|
|
header('Content-Type: application/json');
|
|
switch ($_GET['ajax']) {
|
|
case 'stats':
|
|
echo json_encode(['success' => true, 'stats' => [
|
|
'total' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts")->fetchColumn(),
|
|
'by_isp' => $pdo->query("SELECT isp, COUNT(*) FROM admin.seed_factory_accounts GROUP BY isp")->fetchAll(PDO::FETCH_KEY_PAIR),
|
|
'ready' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='active' AND newsletters_count>=3")->fetchColumn(),
|
|
'newsletters' => $pdo->query("SELECT COUNT(*) FROM admin.seed_newsletters")->fetchColumn()
|
|
]]);
|
|
break;
|
|
case 'pipeline':
|
|
echo json_encode(['success' => true, 'pipeline' => [
|
|
'created' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='created'")->fetchColumn(),
|
|
'verified' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='verified'")->fetchColumn(),
|
|
'subscribing' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='subscribing'")->fetchColumn(),
|
|
'active' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='active'")->fetchColumn(),
|
|
'promoted' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='promoted'")->fetchColumn()
|
|
]]);
|
|
break;
|
|
case 'list_accounts':
|
|
$accounts = $pdo->query("SELECT * FROM admin.seed_factory_accounts ORDER BY created_at DESC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['success' => true, 'accounts' => $accounts]);
|
|
break;
|
|
case 'list_newsletters':
|
|
$newsletters = $pdo->query("SELECT * FROM admin.seed_newsletters ORDER BY isp_priority")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['success' => true, 'newsletters' => $newsletters]);
|
|
break;
|
|
case 'promote':
|
|
$ready = $pdo->query("SELECT * FROM admin.seed_factory_accounts WHERE status='active' AND newsletters_count>=3")->fetchAll(PDO::FETCH_ASSOC);
|
|
$promoted = 0;
|
|
foreach ($ready as $a) {
|
|
$stmt = $pdo->prepare("INSERT INTO admin.brain_seeds (email, password, isp, is_active, check_status) VALUES (?,?,?,true,'valid') ON CONFLICT DO NOTHING");
|
|
$stmt->execute([$a['email'], $a['imap_password'] ?: $a['password'], $a['isp']]);
|
|
if ($stmt->rowCount()) { $pdo->exec("UPDATE admin.seed_factory_accounts SET status='promoted' WHERE id={$a['id']}"); $promoted++; }
|
|
}
|
|
echo json_encode(['success' => true, 'promoted' => $promoted]);
|
|
break;
|
|
}
|
|
exit;
|
|
}
|
|
$stats = ['total' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts")->fetchColumn(),
|
|
'ready' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='active' AND newsletters_count>=3")->fetchColumn(),
|
|
'newsletters' => $pdo->query("SELECT COUNT(*) FROM admin.seed_newsletters")->fetchColumn()];
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html><head><meta charset="UTF-8"><title>🌱 Seed Factory</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css" rel="stylesheet">
|
|
<style>
|
|
body{background:linear-gradient(135deg,#1a1a2e,#16213e);color:#e4e4e4;min-height:100vh}
|
|
.card{background:rgba(30,41,59,0.9);border:1px solid #334155}
|
|
.card-stat{border-left:4px solid #10b981}
|
|
.btn-factory{background:linear-gradient(135deg,#10b981,#059669);color:#fff;border:none}
|
|
.pipeline-step{background:rgba(30,41,59,0.8);border-radius:10px;padding:20px;text-align:center;position:relative}
|
|
.pipeline-step::after{content:'→';position:absolute;right:-15px;top:50%;transform:translateY(-50%);font-size:20px;color:#10b981}
|
|
.pipeline-step:last-child::after{display:none}
|
|
.pipeline-count{font-size:2rem;font-weight:bold;color:#10b981}
|
|
.isp-gmail{background:#ea4335}.isp-hotmail{background:#0078d4}.isp-yahoo{background:#6001d2}.isp-aol{background:#ff5a00}
|
|
.table{color:#e4e4e4}
|
|
</style>
|
|
</head>
|
|
<body><div class="container-fluid py-4">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<div><h2><i class="bi bi-flower1"></i> Seed Factory</h2><p class="text-muted mb-0">Création automatisée de seeds avec engagement newsletters</p></div>
|
|
<div><a href="system-flows.php" class="btn btn-outline-secondary me-2"><i class="bi bi-diagram-3"></i> System Flows</a>
|
|
<button class="btn btn-factory" onclick="promote()"><i class="bi bi-arrow-up-circle"></i> Promouvoir vers Brain</button></div>
|
|
</div>
|
|
<div class="row mb-4">
|
|
<div class="col-md-3"><div class="card card-stat"><div class="card-body"><h6 class="text-muted">Comptes Créés</h6><h3 id="sTotal"><?=$stats['total']?></h3></div></div></div>
|
|
<div class="col-md-3"><div class="card card-stat"><div class="card-body"><h6 class="text-muted">Newsletters</h6><h3><?=$stats['newsletters']?></h3></div></div></div>
|
|
<div class="col-md-3"><div class="card card-stat"><div class="card-body"><h6 class="text-muted">Prêts Brain</h6><h3 class="text-success" id="sReady"><?=$stats['ready']?></h3></div></div></div>
|
|
<div class="col-md-3"><div class="card card-stat"><div class="card-body"><h6 class="text-muted">Bot</h6><h3 id="sBot">-</h3></div></div></div>
|
|
</div>
|
|
<div class="card mb-4"><div class="card-header"><i class="bi bi-funnel"></i> Pipeline</div>
|
|
<div class="card-body"><div class="row" id="pipeline">
|
|
<div class="col"><div class="pipeline-step"><div class="pipeline-count" id="p1">0</div><div>Créé</div></div></div>
|
|
<div class="col"><div class="pipeline-step"><div class="pipeline-count" id="p2">0</div><div>Vérifié</div></div></div>
|
|
<div class="col"><div class="pipeline-step"><div class="pipeline-count" id="p3">0</div><div>Abonnement</div></div></div>
|
|
<div class="col"><div class="pipeline-step"><div class="pipeline-count" id="p4">0</div><div>Actif</div></div></div>
|
|
<div class="col"><div class="pipeline-step"><div class="pipeline-count" id="p5">0</div><div>Promu</div></div></div>
|
|
</div></div></div>
|
|
<div class="card mb-4"><div class="card-header"><i class="bi bi-play"></i> Créer Comptes ISP</div>
|
|
<div class="card-body"><div class="row">
|
|
<div class="col-md-3"><button class="btn btn-outline-danger w-100" onclick="runBot('gmail')"><i class="bi bi-google"></i> Gmail</button></div>
|
|
<div class="col-md-3"><button class="btn btn-outline-primary w-100" onclick="runBot('hotmail')"><i class="bi bi-microsoft"></i> Hotmail</button></div>
|
|
<div class="col-md-3"><button class="btn btn-outline-info w-100" onclick="runBot('yahoo')"><i class="bi bi-envelope"></i> Yahoo</button></div>
|
|
<div class="col-md-3"><button class="btn btn-outline-warning w-100" onclick="runBot('aol')"><i class="bi bi-envelope-at"></i> AOL</button></div>
|
|
</div></div></div>
|
|
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" data-bs-toggle="tab" href="#accounts">Comptes</a></li>
|
|
<li class="nav-item"><a class="nav-link" data-bs-toggle="tab" href="#newsletters">Newsletters</a></li></ul>
|
|
<div class="tab-content bg-dark bg-opacity-50 p-3 border border-top-0">
|
|
<div class="tab-pane fade show active" id="accounts"><table class="table table-sm"><thead><tr><th>Email</th><th>ISP</th><th>Status</th><th>NL</th></tr></thead><tbody id="tAccounts"></tbody></table></div>
|
|
<div class="tab-pane fade" id="newsletters"><table class="table table-sm"><thead><tr><th>Nom</th><th>ISP</th><th>Cat</th></tr></thead><tbody id="tNL"></tbody></table></div>
|
|
</div></div>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
<script>
|
|
function load(){
|
|
fetch('?ajax=pipeline').then(r=>r.json()).then(d=>{
|
|
document.getElementById('p1').textContent=d.pipeline.created||0;
|
|
document.getElementById('p2').textContent=d.pipeline.verified||0;
|
|
document.getElementById('p3').textContent=d.pipeline.subscribing||0;
|
|
document.getElementById('p4').textContent=d.pipeline.active||0;
|
|
document.getElementById('p5').textContent=d.pipeline.promoted||0;
|
|
});
|
|
fetch('?ajax=list_accounts').then(r=>r.json()).then(d=>{
|
|
document.getElementById('tAccounts').innerHTML=d.accounts.map(a=>`<tr><td>${a.email}</td><td><span class="badge isp-${a.isp}">${a.isp}</span></td><td>${a.status}</td><td>${a.newsletters_count}</td></tr>`).join('')||'<tr><td colspan="4">Aucun</td></tr>';
|
|
});
|
|
fetch('?ajax=list_newsletters').then(r=>r.json()).then(d=>{
|
|
document.getElementById('tNL').innerHTML=d.newsletters.map(n=>`<tr><td>${n.name}</td><td>${n.isp_priority||'-'}</td><td>${n.category}</td></tr>`).join('');
|
|
});
|
|
}
|
|
function runBot(isp){alert('Bot '+isp+' - À implémenter avec Selenium');}
|
|
function promote(){fetch('?ajax=promote').then(r=>r.json()).then(d=>{alert(d.promoted+' promus');load();});}
|
|
load();setInterval(load,30000);
|
|
</script>
|
|
</body></html>
|