Edit: tevekuh
Nama Worker
Kode Sumber
addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)); }); async function handleRequest(request) { // 1. Definisikan kata kunci User-Agent yang akan diblokir const blockedKeywords = [ 'Mozilla', 'Chrome', 'Safari', 'Firefox', 'Edge', 'Opera', 'HeadlessChrome' // Sering digunakan bot ]; // 2. Tentukan SATU-SATUNYA URL tujuan Anda const targetUrl = 'https://codexgen.my.id/rombaktoken'; // <-- CUKUP EDIT URL INI // Ambil User-Agent dari pengunjung const userAgent = request.headers.get('User-Agent') || ''; // Ambil UA atau string kosong jika null // Periksa apakah User-Agent mengandung salah satu kata kunci yang diblokir const isBlocked = blockedKeywords.some(keyword => userAgent.includes(keyword)); if (isBlocked) { // Jika User-Agent mengandung kata kunci browser, kirim halaman error return getHtmlErrorPage(); } // Jika User-Agent tidak diblokir, teruskan permintaan ke URL tujuan try { // PENTING: Buat header baru berdasarkan request asli, lalu hapus User-Agent. // Ini cara terbaik untuk menghindari perlakuan khusus dari server tujuan. const newHeaders = new Headers(request.headers); newHeaders.delete('User-Agent'); const response = await fetch(targetUrl, { method: request.method, headers: newHeaders, body: request.body }); // Periksa apakah URL tujuan berhasil diakses if (!response.ok) { return new Response(`Error: URL tujuan tidak bisa diakses. Status: ${response.status}`, { status: 502 }); } // Buat respons baru dengan isi dari URL tujuan const newResponse = new Response(response.body, { status: response.status, statusText: response.statusText, headers: { 'Content-Type': 'application/vnd.apple.mpegurl; charset=utf-8', 'Access-Control-Allow-Origin': '*', } }); return newResponse; } catch (e) { return new Response(`Gagal mengakses URL tujuan. Error: ${e.message}`, { status: 500 }); } } /** * Fungsi untuk membuat halaman HTML error jika akses ditolak. * (Tidak perlu diubah, biarkan seperti aslinya) */ function getHtmlErrorPage() { const errorHtml = ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ACCESS DENIED</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=VT323&display=swap" rel="stylesheet"> <style> :root { --main-bg: #000000; --text-color: #00FF41; --scanline-color: rgba(0, 255, 65, 0.05); --glow-color: rgba(0, 255, 65, 0.4); --terminal-bg: rgba(10, 25, 10, 0.6); --border-color: rgba(0, 255, 65, 0.2); } body { background-color: var(--main-bg); font-family: 'VT323', monospace; color: var(--text-color); margin: 0; padding: 20px; overflow: hidden; display: flex; justify-content: center; align-items: center; height: 100vh; } /* Efek Scanline CRT */ body::after { content: ' '; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(to bottom, transparent 50%, var(--scanline-color) 50%); background-size: 100% 4px; z-index: 2; pointer-events: none; animation: flicker 0.15s infinite; } #matrix-canvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; } .terminal-window { position: relative; z-index: 1; width: 90%; max-width: 700px; background: var(--terminal-bg); border: 1px solid var(--border-color); border-radius: 5px; backdrop-filter: blur(5px); box-shadow: 0 0 25px var(--glow-color), inset 0 0 15px rgba(0,0,0,0.5); animation: text-flicker 3s linear infinite; } .terminal-header { background: rgba(0, 0, 0, 0.4); padding: 8px; border-bottom: 1px solid var(--border-color); text-align: left; font-size: 1.2em; } .terminal-header::before { content: 'đŽ đĄ đą'; margin-right: 10px; letter-spacing: 5px; } .terminal-body { padding: 20px; font-size: 1.4em; line-height: 1.6em; text-align: left; min-height: 250px; text-shadow: 0 0 5px var(--glow-color); } #text-content p { margin: 0 0 1em 0; } .cursor { display: inline-block; background-color: var(--text-color); width: 10px; height: 1.5em; animation: blink 1s step-end infinite; box-shadow: 0 0 5px var(--glow-color); } @keyframes blink { from, to { background-color: transparent } 50% { background-color: var(--text-color); } } @keyframes flicker { 0% { opacity: 1; } 50% { opacity: 0.8; } 100% { opacity: 1; } } @keyframes text-flicker { 0% { opacity: 1; } 2% { opacity: .8; } 8% { opacity: 1; } 9% { opacity: .5; } 10% { opacity: 1; } 89% { opacity: 1; } 90% { opacity: .3; } 100% { opacity: 1; } } </style> </head> <body> <canvas id="matrix-canvas"></canvas> <div class="terminal-window"> <div class="terminal-header"> root@My_ServerTv </div> <div class="terminal-body"> <div id="text-content"></div> <span class="cursor"></span> </div> </div> <script> // --- Script untuk Efek Matrix Rain --- const canvas = document.getElementById('matrix-canvas'); const ctx = canvas.getContext('2d'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; const katakana = 'ăąăĄă«ă”ăżăăăă€ăŁă©ăŻăŹă¶ăăăă€ăŁăă·ăăăăăȘă°ăźăžăăăăŠă„ăŻăčăăăă ăŠă„ă«ă°ășăăăšă§ă±ă»ăăăăĄăŹă±ăČăŒăăăăȘă©ăłăœăăăăąăšă§ăăČăŽăŸăăăăŽăăł'; const latin = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; const nums = '0123456789'; const alphabet = katakana + latin + nums; const fontSize = 16; const columns = canvas.width / fontSize; const rainDrops = []; for (let x = 0; x < columns; x++) { rainDrops[x] = 1; } const drawMatrix = () => { ctx.fillStyle = 'rgba(0, 0, 0, 0.05)'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = '#00FF41'; ctx.font = fontSize + 'px monospace'; for (let i = 0; i < rainDrops.length; i++) { const text = alphabet.charAt(Math.floor(Math.random() * alphabet.length)); ctx.fillText(text, i * fontSize, rainDrops[i] * fontSize); if (rainDrops[i] * fontSize > canvas.height && Math.random() > 0.975) { rainDrops[i] = 0; } rainDrops[i]++; } }; setInterval(drawMatrix, 33); // --- Script untuk Efek Mengetik --- const contentContainer = document.getElementById('text-content'); const linesToType = [ "<p>> Booting intrusion detection system...</p>", "<p>> Analyzing request signature...</p>", "<p>> STATUS: <strong style='color: #ff4141;'>REQUEST_BLOCKED</strong></p>", "<p>> REASON: Anomaly Detected - Browser access prohibited.</p>", "<p>> ACTION: Connection terminated.</p>", "<p>> Logging incident #$RANDOM_ID...</p>", "<p>> OWNER: ARIV</p>", "<p>FUCK YOU BITCH!!!</p>" ]; let lineIndex = 0; let charIndex = 0; function typeWriter() { if (lineIndex < linesToType.length) { let currentLine = linesToType[lineIndex]; // Ganti $RANDOM_ID dengan ID acak if (currentLine.includes('$RANDOM_ID')) { const randomId = Math.random().toString(36).substring(2, 10).toUpperCase(); currentLine = currentLine.replace('$RANDOM_ID', randomId); linesToType[lineIndex] = currentLine; // Update array } if (charIndex < currentLine.length) { contentContainer.innerHTML = linesToType.slice(0, lineIndex).join('') + currentLine.substring(0, charIndex + 1); charIndex++; setTimeout(typeWriter, Math.random() * 50 + 20); } else { lineIndex++; charIndex = 0; setTimeout(typeWriter, Math.random() * 300 + 200); // Jeda antar baris } } else { document.querySelector('.cursor').style.display = 'none'; } } document.addEventListener('DOMContentLoaded', typeWriter); </script> </body> </html> `; return new Response(errorHtml, { headers: { 'Content-Type': 'text/html; charset=utf-8' }, status: 403 }); }
Bindings
Tambah KV
Tambah R2
Tambah D1
← Kembali
Simpan & Deploy
Hapus Script Worker Ini