setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $action = $_GET["action"] ?? $_POST["action"] ?? "status"; try { switch($action) { case "status": $total = $db->query("SELECT count(*) FROM admin.proxy_pool")->fetchColumn(); $active = $db->query("SELECT count(*) FROM admin.proxy_pool WHERE status='active'")->fetchColumn(); $residential = $db->query("SELECT count(*) FROM admin.proxy_pool WHERE is_residential=true AND status='active'")->fetchColumn(); echo json_encode(["status"=>"success","service"=>"ghost-network","total"=>$total,"active"=>$active,"residential"=>$residential,"actions"=>["status","list","add","remove","test","stats","providers"]]); break; case "list": $type = $_GET["type"] ?? null; $sql = "SELECT id,provider,proxy_type,host,port,country,city,is_residential,status,success_rate,last_used FROM admin.proxy_pool"; if($type) { $stmt=$db->prepare($sql." WHERE proxy_type=? ORDER BY success_rate DESC"); $stmt->execute([$type]); } else { $stmt=$db->query($sql." ORDER BY success_rate DESC LIMIT 100"); } echo json_encode(["status"=>"success","data"=>$stmt->fetchAll(PDO::FETCH_ASSOC)]); break; case "add": $d = json_decode(file_get_contents("php://input"), true) ?: $_POST; $stmt = $db->prepare("INSERT INTO admin.proxy_pool (provider,proxy_type,host,port,username,password,country,city,is_residential,status) VALUES (?,?,?,?,?,?,?,?,?,?) RETURNING id"); $stmt->execute([$d["provider"]??"",$d["proxy_type"]??"http",$d["host"]??"",$d["port"]??8080,$d["username"]??"",$d["password"]??"",$d["country"]??"",$d["city"]??"",$d["is_residential"]??false,"active"]); echo json_encode(["status"=>"success","id"=>$stmt->fetch(PDO::FETCH_ASSOC)["id"]]); break; case "remove": $id = $_GET["id"] ?? $_POST["id"] ?? 0; $db->prepare("DELETE FROM admin.proxy_pool WHERE id=?")->execute([$id]); echo json_encode(["status"=>"success","deleted"=>$id]); break; case "test": $id = $_GET["id"] ?? 0; $proxy = $db->prepare("SELECT * FROM admin.proxy_pool WHERE id=?"); $proxy->execute([$id]); $p = $proxy->fetch(PDO::FETCH_ASSOC); if(!$p) { echo json_encode(["error"=>"Proxy not found"]); break; } $ch = curl_init("https://httpbin.org/ip"); curl_setopt($ch, CURLOPT_PROXY, $p["host"].":".$p["port"]); if($p["username"]) curl_setopt($ch, CURLOPT_PROXYUSERPWD, $p["username"].":".$p["password"]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $start = microtime(true); $result = curl_exec($ch); $time = round((microtime(true)-$start)*1000); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $ok = $code == 200; $db->prepare("UPDATE admin.proxy_pool SET success_rate=CASE WHEN ? THEN LEAST(success_rate+1,100) ELSE GREATEST(success_rate-5,0) END, last_check=NOW() WHERE id=?")->execute([$ok,$id]); echo json_encode(["status"=>$ok?"success":"failed","proxy_id"=>$id,"response_time_ms"=>$time,"http_code"=>$code,"ip"=>json_decode($result,true)["origin"]??"unknown"]); break; case "stats": $by_type = $db->query("SELECT proxy_type, count(*) as cnt, AVG(success_rate) as avg_rate FROM admin.proxy_pool WHERE status='active' GROUP BY proxy_type")->fetchAll(PDO::FETCH_ASSOC); $by_country = $db->query("SELECT country, count(*) as cnt FROM admin.proxy_pool WHERE status='active' GROUP BY country ORDER BY cnt DESC LIMIT 10")->fetchAll(PDO::FETCH_ASSOC); $by_provider = $db->query("SELECT provider, count(*) as cnt, AVG(success_rate) as avg_rate FROM admin.proxy_pool GROUP BY provider ORDER BY cnt DESC")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(["status"=>"success","by_type"=>$by_type,"by_country"=>$by_country,"by_provider"=>$by_provider]); break; case "providers": echo json_encode(["status"=>"success","supported"=>[ ["name"=>"IPRoyal","type"=>"residential","url"=>"https://iproyal.com","api"=>true], ["name"=>"Bright Data","type"=>"residential","url"=>"https://brightdata.com","api"=>true], ["name"=>"Oxylabs","type"=>"datacenter+residential","url"=>"https://oxylabs.io","api"=>true], ["name"=>"SmartProxy","type"=>"residential","url"=>"https://smartproxy.com","api"=>true], ["name"=>"Storm Proxies","type"=>"rotating","url"=>"https://stormproxies.com","api"=>false], ["name"=>"Custom SOCKS5","type"=>"manual","url"=>"","api"=>false] ]]); break; default: echo json_encode(["error"=>"Unknown action"]); } } catch(Exception $e) { echo json_encode(["error"=>$e->getMessage()]); }