PDO::ERRMODE_EXCEPTION]); } return $pdo; } function getServerIP() { return trim(file_get_contents('https://api.ipify.org') ?: '89.167.40.150'); } function namecheapAPI($command, $params, $username, $apiKey) { $baseUrl = "https://api.namecheap.com/xml.response"; $defaultParams = [ 'ApiUser' => $username, 'ApiKey' => $apiKey, 'UserName' => $username, 'ClientIp' => getServerIP(), 'Command' => $command ]; $allParams = array_merge($defaultParams, $params); $url = $baseUrl . '?' . http_build_query($allParams); $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => true ]); $response = curl_exec($ch); $error = curl_error($ch); curl_close($ch); if ($error) { return ['success' => false, 'error' => $error]; } $xml = @simplexml_load_string($response); if (!$xml) { return ['success' => false, 'error' => 'Invalid XML response']; } $status = (string)$xml['Status']; if ($status === 'ERROR') { $errors = []; foreach ($xml->Errors->Error as $err) { $errors[] = (string)$err; } return ['success' => false, 'error' => implode(', ', $errors)]; } return ['success' => true, 'xml' => $xml, 'raw' => $response]; } // Créer la table si nécessaire function ensureTable() { $pdo = getDB(); $pdo->exec(" CREATE TABLE IF NOT EXISTS admin.namecheap_accounts ( id SERIAL PRIMARY KEY, username VARCHAR(255) NOT NULL, password VARCHAR(255), api_key VARCHAR(255), api_user VARCHAR(255), whitelisted_ip VARCHAR(50), status VARCHAR(50) DEFAULT 'pending', domains_count INTEGER DEFAULT 0, last_sync TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(username) ); CREATE TABLE IF NOT EXISTS admin.namecheap_domains ( id SERIAL PRIMARY KEY, account_id INTEGER, domain VARCHAR(255) NOT NULL, expires_at DATE, is_locked BOOLEAN DEFAULT FALSE, auto_renew BOOLEAN DEFAULT FALSE, nameservers TEXT, status VARCHAR(50) DEFAULT 'active', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(domain) ); "); } // AJAX Handler if (isset($_REQUEST['action'])) { header('Content-Type: application/json'); ensureTable(); $pdo = getDB(); switch ($_REQUEST['action']) { case 'get_ip': echo json_encode(['ip' => getServerIP()]); break; case 'accounts': $stmt = $pdo->query(" SELECT id, username, password, api_key IS NOT NULL AND api_key != '' as has_api, whitelisted_ip, status, domains_count, last_sync FROM admin.namecheap_accounts ORDER BY id "); echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)); break; case 'add_account': $username = trim($_POST['username'] ?? ''); $password = trim($_POST['password'] ?? ''); if (!$username) { echo json_encode(['success' => false, 'error' => 'Username required']); break; } $stmt = $pdo->prepare(" INSERT INTO admin.namecheap_accounts (username, password, status) VALUES (?, ?, 'pending') ON CONFLICT (username) DO UPDATE SET password = EXCLUDED.password RETURNING id "); $stmt->execute([$username, $password]); $id = $stmt->fetchColumn(); echo json_encode(['success' => true, 'id' => $id]); break; case 'save_api': $id = $_POST['id'] ?? 0; $apiKey = trim($_POST['api_key'] ?? ''); $apiUser = trim($_POST['api_user'] ?? ''); $stmt = $pdo->prepare(" UPDATE admin.namecheap_accounts SET api_key = ?, api_user = COALESCE(NULLIF(?, ''), username), whitelisted_ip = ?, status = 'active' WHERE id = ? "); $stmt->execute([$apiKey, $apiUser, getServerIP(), $id]); echo json_encode(['success' => true]); break; case 'test_api': $username = $_POST['username'] ?? ''; $apiKey = $_POST['api_key'] ?? ''; $apiUser = $_POST['api_user'] ?? $username; $result = namecheapAPI('namecheap.domains.getList', ['PageSize' => 1], $apiUser, $apiKey); echo json_encode($result); break; case 'fetch_domains': $id = $_POST['id'] ?? 0; $stmt = $pdo->prepare("SELECT username, api_key, api_user FROM admin.namecheap_accounts WHERE id = ?"); $stmt->execute([$id]); $acc = $stmt->fetch(PDO::FETCH_ASSOC); if (!$acc || !$acc['api_key']) { echo json_encode(['success' => false, 'error' => 'No API key']); break; } $apiUser = $acc['api_user'] ?: $acc['username']; $result = namecheapAPI('namecheap.domains.getList', ['PageSize' => 100], $apiUser, $acc['api_key']); if (!$result['success']) { echo json_encode($result); break; } $domains = []; $xml = $result['xml']; if (isset($xml->CommandResponse->DomainGetListResult->Domain)) { foreach ($xml->CommandResponse->DomainGetListResult->Domain as $domain) { $domainName = (string)$domain['Name']; $expires = (string)$domain['Expires']; $isLocked = ((string)$domain['IsLocked']) === 'true'; $autoRenew = ((string)$domain['AutoRenew']) === 'true'; // Insert into namecheap_domains $stmt = $pdo->prepare(" INSERT INTO admin.namecheap_domains (account_id, domain, expires_at, is_locked, auto_renew) VALUES (?, ?, ?, ?, ?) ON CONFLICT (domain) DO UPDATE SET expires_at = EXCLUDED.expires_at, is_locked = EXCLUDED.is_locked, auto_renew = EXCLUDED.auto_renew "); $stmt->execute([$id, $domainName, $expires, $isLocked, $autoRenew]); // Also add to domains_pool $stmt = $pdo->prepare(" INSERT INTO admin.domains_pool (domain, provider, status) VALUES (?, 'namecheap', 'FREE') ON CONFLICT DO NOTHING "); $stmt->execute([$domainName]); $domains[] = [ 'domain' => $domainName, 'expires' => $expires, 'locked' => $isLocked ]; } } // Update account $pdo->prepare("UPDATE admin.namecheap_accounts SET domains_count = ?, last_sync = NOW() WHERE id = ?") ->execute([count($domains), $id]); echo json_encode(['success' => true, 'domains' => $domains, 'count' => count($domains)]); break; case 'get_domains': $id = $_POST['id'] ?? 0; $stmt = $pdo->prepare("SELECT domain, expires_at, is_locked, auto_renew FROM admin.namecheap_domains WHERE account_id = ? ORDER BY domain"); $stmt->execute([$id]); echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)); break; case 'get_dns': $id = $_POST['account_id'] ?? 0; $domain = $_POST['domain'] ?? ''; $stmt = $pdo->prepare("SELECT api_key, api_user, username FROM admin.namecheap_accounts WHERE id = ?"); $stmt->execute([$id]); $acc = $stmt->fetch(PDO::FETCH_ASSOC); if (!$acc || !$acc['api_key']) { echo json_encode(['success' => false, 'error' => 'No API key']); break; } // Split domain into SLD and TLD $parts = explode('.', $domain); $tld = array_pop($parts); $sld = implode('.', $parts); $apiUser = $acc['api_user'] ?: $acc['username']; $result = namecheapAPI('namecheap.domains.dns.getHosts', [ 'SLD' => $sld, 'TLD' => $tld ], $apiUser, $acc['api_key']); if (!$result['success']) { echo json_encode($result); break; } $records = []; if (isset($result['xml']->CommandResponse->DomainDNSGetHostsResult->host)) { foreach ($result['xml']->CommandResponse->DomainDNSGetHostsResult->host as $host) { $records[] = [ 'id' => (string)$host['HostId'], 'name' => (string)$host['Name'], 'type' => (string)$host['Type'], 'address' => (string)$host['Address'], 'ttl' => (string)$host['TTL'] ]; } } echo json_encode(['success' => true, 'records' => $records]); break; case 'set_dns': $id = $_POST['account_id'] ?? 0; $domain = $_POST['domain'] ?? ''; $ip = $_POST['ip'] ?? '151.80.235.110'; $stmt = $pdo->prepare("SELECT api_key, api_user, username FROM admin.namecheap_accounts WHERE id = ?"); $stmt->execute([$id]); $acc = $stmt->fetch(PDO::FETCH_ASSOC); if (!$acc || !$acc['api_key']) { echo json_encode(['success' => false, 'error' => 'No API key']); break; } // Split domain $parts = explode('.', $domain); $tld = array_pop($parts); $sld = implode('.', $parts); $apiUser = $acc['api_user'] ?: $acc['username']; // First get existing records $existing = namecheapAPI('namecheap.domains.dns.getHosts', [ 'SLD' => $sld, 'TLD' => $tld ], $apiUser, $acc['api_key']); // Build new records array (keep existing + add/update @ A record) $params = [ 'SLD' => $sld, 'TLD' => $tld ]; $recordNum = 1; $foundRoot = false; if ($existing['success'] && isset($existing['xml']->CommandResponse->DomainDNSGetHostsResult->host)) { foreach ($existing['xml']->CommandResponse->DomainDNSGetHostsResult->host as $host) { $name = (string)$host['Name']; $type = (string)$host['Type']; // Skip root A record (we'll add our own) if ($name === '@' && $type === 'A') { continue; } $params["HostName{$recordNum}"] = $name; $params["RecordType{$recordNum}"] = $type; $params["Address{$recordNum}"] = (string)$host['Address']; $params["TTL{$recordNum}"] = (string)$host['TTL']; $recordNum++; } } // Add our tracking A record $params["HostName{$recordNum}"] = '@'; $params["RecordType{$recordNum}"] = 'A'; $params["Address{$recordNum}"] = $ip; $params["TTL{$recordNum}"] = '300'; $result = namecheapAPI('namecheap.domains.dns.setHosts', $params, $apiUser, $acc['api_key']); if ($result['success']) { // Update domains_pool $pdo->prepare("UPDATE admin.domains_pool SET status = 'TRACKING', usage_type = 'tracking', tracking_ip = ? WHERE domain = ?") ->execute([$ip, $domain]); } echo json_encode($result); break; case 'delete_account': $id = $_POST['id'] ?? 0; $pdo->prepare("DELETE FROM admin.namecheap_domains WHERE account_id = ?")->execute([$id]); $pdo->prepare("DELETE FROM admin.namecheap_accounts WHERE id = ?")->execute([$id]); echo json_encode(['success' => true]); break; } exit; } ensureTable(); $serverIP = getServerIP(); ?>
Configurer les comptes Namecheap et récupérer les domaines
= $serverIP ?>
| ID | Username | Password | API | Whitelisted IP | Domains | Actions |
|---|