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" }
});
}
}
};