export default { async fetch(request, env) { // 1. Настройка CORS-заголовков для вызова скрипта с любого домена const corsHeaders = { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type", }; // Обработка предварительных CORS-запросов (Preflight) if (request.method === "OPTIONS") { return new Response(null, { headers: corsHeaders }); } // Принимаем только POST-запросы if (request.method !== "POST") { return new Response("Method Not Allowed", { status: 405, headers: corsHeaders }); } try { // 2. Чтение данных (широта и долгота), отправленных браузером const { lat, lon } = await request.json(); if (!lat || !lon) { return new Response(JSON.stringify({ error: "Missing lat/lon" }), { status: 400, headers: { ...corsHeaders, "Content-Type": "application/json" } }); } // 3. Получение токена и Chat ID из защищенных переменных окружения Cloudflare const botToken = env.TELEGRAM_BOT_TOKEN; const chatId = env.TELEGRAM_CHAT_ID; // 4. Отправка геолокации в Telegram await fetch(`https://api.telegram.org/bot${botToken}/sendLocation`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ chat_id: chatId, latitude: lat, longitude: lon }) }); // 5. Отправка текстового сообщения со ссылкой на Google Maps const mapUrl = `https://maps.google.com/?q=${lat},${lon}`; const message = `🚨 Charlie's tag was scanned!\n\n📍 Google Maps: ${lat.toFixed(5)}, ${lon.toFixed(5)}`; await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ chat_id: chatId, text: message, parse_mode: "HTML" }) }); return new Response(JSON.stringify({ success: true }), { status: 200, headers: { ...corsHeaders, "Content-Type": "application/json" } }); } catch (err) { return new Response(JSON.stringify({ error: err.message }), { status: 500, headers: { ...corsHeaders, "Content-Type": "application/json" } }); } } };