'Need id and key']); exit; } // Save key pg_query($db, "UPDATE cloudflare_accounts SET api_key='".pg_escape_string($db,$key)."', api_status='active', last_api_check=NOW() WHERE id=$id"); // Immediately harvest zones $acc = pg_fetch_assoc(pg_query($db, "SELECT email, api_key FROM cloudflare_accounts WHERE id=$id")); $ch = curl_init("https://api.cloudflare.com/client/v4/zones?per_page=50&status=active"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "X-Auth-Email: {$acc['email']}", "X-Auth-Key: {$acc['api_key']}", "Content-Type: application/json" ] ]); $resp = json_decode(curl_exec($ch), true); curl_close($ch); $domains = []; if ($resp['success'] ?? false) { foreach ($resp['result'] ?? [] as $z) { $d = pg_escape_string($db, $z['name']); $zid = pg_escape_string($db, $z['id']); pg_query($db, "INSERT INTO cloudflare_domains(account_id, domain, zone_id, status, created_at) VALUES($id, '$d', '$zid', '{$z['status']}', NOW()) ON CONFLICT DO NOTHING"); pg_query($db, "INSERT INTO domains_pool(domain, provider, status, created_at) VALUES('$d', 'cloudflare', 'active', NOW()) ON CONFLICT DO NOTHING"); $domains[] = $z['name']; } pg_query($db, "UPDATE cloudflare_accounts SET domains_count=".count($domains).", api_status='active' WHERE id=$id"); } echo json_encode([ 'success' => true, 'domains_found' => count($domains), 'domains' => $domains, 'api_valid' => $resp['success'] ?? false ]); exit; } if ($action === 'stats') { header('Content-Type: application/json'); $s = pg_fetch_assoc(pg_query($db, " SELECT (SELECT COUNT(*) FROM cloudflare_accounts WHERE status='active') as total, (SELECT COUNT(*) FROM cloudflare_accounts WHERE api_key IS NOT NULL AND api_key!='' AND api_key!='PENDING') as with_keys, (SELECT COUNT(*) FROM cloudflare_domains) as total_domains, (SELECT string_agg(domain, ', ') FROM cloudflare_domains LIMIT 20) as sample_domains ")); echo json_encode($s); exit; } // UI $accounts = pg_fetch_all(pg_query($db, " SELECT id, email, password, domains_count, CASE WHEN api_key IS NOT NULL AND api_key!='' AND api_key!='PENDING' THEN 'has_key' ELSE 'needs_key' END as key_status, api_status FROM cloudflare_accounts WHERE status='active' ORDER BY CASE WHEN api_key IS NOT NULL AND api_key!='' AND api_key!='PENDING' THEN 1 ELSE 0 END, domains_count DESC ")); $need_keys = array_filter($accounts, fn($a) => $a['key_status'] === 'needs_key'); $has_keys = array_filter($accounts, fn($a) => $a['key_status'] === 'has_key'); ?>
💡 Raccourci: Glisse ce bookmarklet dans ta barre de favoris, puis clique dessus sur la page Profile CF :
📎 CF Key Grabber (glisser dans la barre de favoris)
Password: = htmlspecialchars($acc['password']) ?>