PHP Code Editor
<?php /** * Web Crawler & Previewer - Enhanced Version */ // --- KONFIGURASI --- define('DB_FILE', 'crawler_data.db'); define('PAGESPEED_API_KEY', 'YOUR_GOOGLE_API_KEY'); define('HUGGINGFACE_TOKEN', 'YOUR_HF_TOKEN'); define('SCREENSHOT_DIR', 'screenshots/'); if (!is_dir(SCREENSHOT_DIR)) mkdir(SCREENSHOT_DIR, 0777, true); // --- DATABASE --- $db = new PDO('sqlite:' . DB_FILE); $db->exec("CREATE TABLE IF NOT EXISTS sites ( id INTEGER PRIMARY KEY AUTOINCREMENT, url TEXT UNIQUE, title TEXT, description TEXT, server_info TEXT, response_time TEXT, screenshot_path TEXT, ai_description TEXT, last_crawl DATETIME )"); // --- FUNGSI TAMBAHAN: INFO WEBSITE --- function getWebsiteInfo($url) { $start = microtime(true); $header = @get_headers($url, 1); $end = microtime(true); $ip = gethostbyname(parse_url($url, PHP_URL_HOST)); $responseTime = round(($end - $start) * 1000) . "ms"; $server = $header['Server'] ?? 'Unknown'; return ['ip' => $ip, 'speed' => $responseTime, 'server' => (is_array($server) ? $server[0] : $server)]; } // --- FUNGSI CORE (Metadata, Screenshot, AI) --- function getMetadata($url) { $options = ['http' => ['user_agent' => 'Mozilla/5.0']]; $context = stream_context_create($options); $html = @file_get_contents($url, false, $context); if (!$html) return ['title' => 'N/A', 'desc' => 'N/A']; $doc = new DOMDocument(); @$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $xpath = new DOMXPath($doc); return [ 'title' => trim($xpath->query('//title')->item(0)->nodeValue ?? 'No Title'), 'desc' => trim($xpath->query('//meta[@name="description"]/@content')->item(0)->nodeValue ?? 'Tidak ada meta deskripsi.') ]; } function captureScreenshot($url) { $api_url = "https://googleapis.com" . urlencode($url) . "&screenshot=true&key=" . PAGESPEED_API_KEY; $data = json_decode(@file_get_contents($api_url), true); if (isset($data['lighthouseResult']['audits']['final-screenshot']['details']['data'])) { $img_data = base64_decode(str_replace(['data:image/jpeg;base64,', 'data:image/png;base64,'], '', $data['lighthouseResult']['audits']['final-screenshot']['details']['data'])); $filename = SCREENSHOT_DIR . md5($url) . '.jpg'; file_put_contents($filename, $img_data); return $filename; } return null; } function getAIDescription($imagePath) { if (!file_exists($imagePath)) return "Gagal menganalisis visual."; $data = file_get_contents($imagePath); $ch = curl_init("https://huggingface.co"); curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . HUGGINGFACE_TOKEN]); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = json_decode(curl_exec($ch), true); curl_close($ch); return $result[0]['generated_text'] ?? "AI belum memberikan deskripsi."; } // --- LOGIKA JALANKAN CRAWLER --- if (isset($_GET['run_crawler'])) { $targets = ['https://detik.com', 'https://wikipedia.org']; // Contoh target foreach ($targets as $url) { $meta = getMetadata($url); $info = getWebsiteInfo($url); $screenshot = captureScreenshot($url); $ai_desc = ($screenshot) ? getAIDescription($screenshot) : "No Image"; $stmt = $db->prepare("INSERT OR REPLACE INTO sites (url, title, description, server_info, response_time, screenshot_path, ai_description, last_crawl) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$url, $meta['title'], $meta['desc'], $info['server'] . " (IP: ".$info['ip'].")", $info['speed'], $screenshot, $ai_desc, date('Y-m-d H:i:s')]); } header("Location: " . strtok($_SERVER["REQUEST_URI"], '?')); exit; } $sites = $db->query("SELECT * FROM sites ORDER BY last_crawl DESC")->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="id"> <head> <meta charset="UTF-8"> <title>AI Web Explorer</title> <link href="https://jsdelivr.net" rel="stylesheet"> <style> body { background-color: #f4f7f6; } .card { border: none; border-radius: 15px; overflow: hidden; box-shadow: 0 4px 15px rgba(0,0,0,0.05); } .preview-img { height: 180px; object-fit: cover; } .info-label { font-size: 0.75rem; text-transform: uppercase; color: #888; font-weight: bold; margin-bottom: 2px; } .info-value { font-size: 0.85rem; color: #333; margin-bottom: 10px; } .ai-section { background: #f0f3ff; border-left: 4px solid #4338ca; padding: 10px; margin-top: 15px; border-radius: 0 8px 8px 0; } </style> </head> <body> <div class="container py-5"> <div class="d-flex justify-content-between align-items-center mb-5"> <h1>🌐 Web Insight <span class="badge bg-dark">v2.0</span></h1> <a href="?run_crawler=1" class="btn btn-primary shadow">Jalankan Scan Baru</a> </div> <div class="row g-4"> <?php foreach ($sites as $site): ?> <div class="col-md-6 col-lg-4"> <div class="card h-100 p-3"> <img src="<?= $site['screenshot_path'] ?: 'https://placeholder.com' ?>" class="rounded mb-3 preview-img" alt="Screenshot"> <!-- 1. JUDUL & URL --> <h5 class="fw-bold mb-1 text-truncate"><?= htmlspecialchars($site['title']) ?></h5> <p class="text-primary small mb-3 text-truncate"><?= htmlspecialchars($site['url']) ?></p> <!-- 2. META DATA --> <div class="info-label">Meta Description</div> <p class="info-value fst-italic">"<?= htmlspecialchars($site['description']) ?>"</p> <!-- 3. INFO WEBSITE --> <div class="row"> <div class="col-6"> <div class="info-label">Server Info</div> <div class="info-value small"><?= htmlspecialchars($site['server_info']) ?></div> </div> <div class="col-6"> <div class="info-label">Response Time</div> <div class="info-value small text-success"><?= htmlspecialchars($site['response_time']) ?></div> </div> </div> <!-- 4. DESKRIPSI AI --> <div class="ai-section"> <div class="info-label text-primary">AI Visual Analysis</div> <div class="info-value mb-0 fw-medium"><?= htmlspecialchars($site['ai_description']) ?></div> </div> <div class="mt-auto pt-3 border-top text-muted small"> Terakhir diperbarui: <?= $site['last_crawl'] ?> </div> </div> </div> <?php endforeach; ?> </div> </div> </body> </html>
Run Code
<?php /** * Web Crawler & Previewer - Enhanced Version */ // --- KONFIGURASI --- define('DB_FILE', 'crawler_data.db'); define('PAGESPEED_API_KEY', 'YOUR_GOOGLE_API_KEY'); define('HUGGINGFACE_TOKEN', 'YOUR_HF_TOKEN'); define('SCREENSHOT_DIR', 'screenshots/'); if (!is_dir(SCREENSHOT_DIR)) mkdir(SCREENSHOT_DIR, 0777, true); // --- DATABASE --- $db = new PDO('sqlite:' . DB_FILE); $db->exec("CREATE TABLE IF NOT EXISTS sites ( id INTEGER PRIMARY KEY AUTOINCREMENT, url TEXT UNIQUE, title TEXT, description TEXT, server_info TEXT, response_time TEXT, screenshot_path TEXT, ai_description TEXT, last_crawl DATETIME )"); // --- FUNGSI TAMBAHAN: INFO WEBSITE --- function getWebsiteInfo($url) { $start = microtime(true); $header = @get_headers($url, 1); $end = microtime(true); $ip = gethostbyname(parse_url($url, PHP_URL_HOST)); $responseTime = round(($end - $start) * 1000) . "ms"; $server = $header['Server'] ?? 'Unknown'; return ['ip' => $ip, 'speed' => $responseTime, 'server' => (is_array($server) ? $server[0] : $server)]; } // --- FUNGSI CORE (Metadata, Screenshot, AI) --- function getMetadata($url) { $options = ['http' => ['user_agent' => 'Mozilla/5.0']]; $context = stream_context_create($options); $html = @file_get_contents($url, false, $context); if (!$html) return ['title' => 'N/A', 'desc' => 'N/A']; $doc = new DOMDocument(); @$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $xpath = new DOMXPath($doc); return [ 'title' => trim($xpath->query('//title')->item(0)->nodeValue ?? 'No Title'), 'desc' => trim($xpath->query('//meta[@name="description"]/@content')->item(0)->nodeValue ?? 'Tidak ada meta deskripsi.') ]; } function captureScreenshot($url) { $api_url = "https://googleapis.com" . urlencode($url) . "&screenshot=true&key=" . PAGESPEED_API_KEY; $data = json_decode(@file_get_contents($api_url), true); if (isset($data['lighthouseResult']['audits']['final-screenshot']['details']['data'])) { $img_data = base64_decode(str_replace(['data:image/jpeg;base64,', 'data:image/png;base64,'], '', $data['lighthouseResult']['audits']['final-screenshot']['details']['data'])); $filename = SCREENSHOT_DIR . md5($url) . '.jpg'; file_put_contents($filename, $img_data); return $filename; } return null; } function getAIDescription($imagePath) { if (!file_exists($imagePath)) return "Gagal menganalisis visual."; $data = file_get_contents($imagePath); $ch = curl_init("https://huggingface.co"); curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . HUGGINGFACE_TOKEN]); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = json_decode(curl_exec($ch), true); curl_close($ch); return $result[0]['generated_text'] ?? "AI belum memberikan deskripsi."; } // --- LOGIKA JALANKAN CRAWLER --- if (isset($_GET['run_crawler'])) { $targets = ['https://detik.com', 'https://wikipedia.org']; // Contoh target foreach ($targets as $url) { $meta = getMetadata($url); $info = getWebsiteInfo($url); $screenshot = captureScreenshot($url); $ai_desc = ($screenshot) ? getAIDescription($screenshot) : "No Image"; $stmt = $db->prepare("INSERT OR REPLACE INTO sites (url, title, description, server_info, response_time, screenshot_path, ai_description, last_crawl) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$url, $meta['title'], $meta['desc'], $info['server'] . " (IP: ".$info['ip'].")", $info['speed'], $screenshot, $ai_desc, date('Y-m-d H:i:s')]); } header("Location: " . strtok($_SERVER["REQUEST_URI"], '?')); exit; } $sites = $db->query("SELECT * FROM sites ORDER BY last_crawl DESC")->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="id"> <head> <meta charset="UTF-8"> <title>AI Web Explorer</title> <link href="https://jsdelivr.net" rel="stylesheet"> <style> body { background-color: #f4f7f6; } .card { border: none; border-radius: 15px; overflow: hidden; box-shadow: 0 4px 15px rgba(0,0,0,0.05); } .preview-img { height: 180px; object-fit: cover; } .info-label { font-size: 0.75rem; text-transform: uppercase; color: #888; font-weight: bold; margin-bottom: 2px; } .info-value { font-size: 0.85rem; color: #333; margin-bottom: 10px; } .ai-section { background: #f0f3ff; border-left: 4px solid #4338ca; padding: 10px; margin-top: 15px; border-radius: 0 8px 8px 0; } </style> </head> <body> <div class="container py-5"> <div class="d-flex justify-content-between align-items-center mb-5"> <h1>🌐 Web Insight <span class="badge bg-dark">v2.0</span></h1> <a href="?run_crawler=1" class="btn btn-primary shadow">Jalankan Scan Baru</a> </div> <div class="row g-4"> <?php foreach ($sites as $site): ?> <div class="col-md-6 col-lg-4"> <div class="card h-100 p-3"> <img src="<?= $site['screenshot_path'] ?: 'https://placeholder.com' ?>" class="rounded mb-3 preview-img" alt="Screenshot"> <!-- 1. JUDUL & URL --> <h5 class="fw-bold mb-1 text-truncate"><?= htmlspecialchars($site['title']) ?></h5> <p class="text-primary small mb-3 text-truncate"><?= htmlspecialchars($site['url']) ?></p> <!-- 2. META DATA --> <div class="info-label">Meta Description</div> <p class="info-value fst-italic">"<?= htmlspecialchars($site['description']) ?>"</p> <!-- 3. INFO WEBSITE --> <div class="row"> <div class="col-6"> <div class="info-label">Server Info</div> <div class="info-value small"><?= htmlspecialchars($site['server_info']) ?></div> </div> <div class="col-6"> <div class="info-label">Response Time</div> <div class="info-value small text-success"><?= htmlspecialchars($site['response_time']) ?></div> </div> </div> <!-- 4. DESKRIPSI AI --> <div class="ai-section"> <div class="info-label text-primary">AI Visual Analysis</div> <div class="info-value mb-0 fw-medium"><?= htmlspecialchars($site['ai_description']) ?></div> </div> <div class="mt-auto pt-3 border-top text-muted small"> Terakhir diperbarui: <?= $site['last_crawl'] ?> </div> </div> </div> <?php endforeach; ?> </div> </div> </body> </html>
Run Code New Tab
Result