// _worker.js export default { async fetch(request, env, ctx) { const url = new URL(request.url); // ===== COOKIE FIXO ===== const COOKIE = 'cf_clearance=123GlC3xQFsdHwwEi6u_Nk.awEvOJuRT8S3nPh27N68-1774469116-1.2.1.1-PheQQg2LVwrLgup17MwoNkSB_g.lyiDp4rxdlhET.Gi1VpX7gzyqr50DvX9GtgJHgB7c8wwEZhqPbLpRKH94ZovRwI8qdNPKJhye9_BsgGoKEwFjlU3OusrTpcBAEowaHZTVy1D2rS7Fudj6YqTA7K.Y54jdzPaXlNIby9Yr6kIOkCN_NN4sgVIgzZiXillANHUbROqmJqjJufILkrVfVARWZ5dXbnCsoByP5IVQsj.1pd6f2cnyxiIrIWGGsfSBO'; // ===== ROTA DE DIAGNÓSTICO ===== if (url.pathname === '/diagnostico') { return new Response(`Cookie ativo: ${COOKIE.substring(0, 100)}...`, { headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); } // ===== PROXY NORMAL ===== let targetUrl = url.searchParams.get('url'); if (!targetUrl && url.search) { const params = new URLSearchParams(url.search); targetUrl = params.get('url'); } if (!targetUrl && request.url.includes('url=')) { targetUrl = request.url.split('url=')[1]; } if (!targetUrl) { return new Response(`Proxy ativo. Use ?url= para passar o link. /diagnostico para ver cookie.`, { status: 200, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); } try { targetUrl = decodeURIComponent(targetUrl).trim(); } catch (e) {} if (!targetUrl.startsWith('http')) { return new Response("Erro: URL inválida", { status: 400 }); } // ===== HEADERS COM USER-AGENT E COOKIE ===== const headers = { 'User-Agent': 'Mozilla/5.0 (Android 13; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'Cache-Control': 'max-age=0', 'Referer': 'https://mangalivre.tv/', 'Origin': 'https://mangalivre.tv', 'Cookie': COOKIE }; // ===== CACHE ===== const cache = caches.default; const cacheKey = new Request(url.toString(), { method: 'GET', headers: {} }); const cachedResponse = await cache.match(cacheKey); if (cachedResponse) { const responseWithHeader = new Response(cachedResponse.body, cachedResponse); responseWithHeader.headers.set('X-Cache-Status', 'HIT'); return responseWithHeader; } try { const response = await fetch(targetUrl, { method: 'GET', headers: headers, redirect: "follow" }); const newHeaders = new Headers(response.headers); newHeaders.set('Access-Control-Allow-Origin', '*'); newHeaders.set('X-Cache-Status', 'MISS'); newHeaders.set('Cache-Control', 'public, max-age=3600'); const finalResponse = new Response(response.body, { status: response.status, headers: newHeaders }); ctx.waitUntil(cache.put(cacheKey, finalResponse.clone())); return finalResponse; } catch (e) { return new Response(`Erro ao buscar: ${e.message}`, { status: 500 }); } } };