diff --git a/index.js b/index.js new file mode 100644 index 0000000..54177fa --- /dev/null +++ b/index.js @@ -0,0 +1,151 @@ +export default { + async fetch(request, env, ctx) { + // Handle CORS preflight requests + if (request.method === 'OPTIONS') { + return new Response(null, { + status: 204, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type', + 'Access-Control-Max-Age': '86400', + }, + }); + } + + if (request.method !== 'POST') { + return new Response('Method not allowed', { + status: 405, + headers: { + 'Access-Control-Allow-Origin': '*', + } + }); + } + + try { + const contentType = request.headers.get('content-type'); + let text; + + if (contentType && contentType.includes('application/json')) { + const body = await request.json(); + text = body.text; + } else if (contentType && contentType.includes('application/x-www-form-urlencoded')) { + const formData = await request.formData(); + text = formData.get('text'); + } else { + return new Response('Content-Type must be application/json or application/x-www-form-urlencoded', { + status: 400, + headers: { + 'Access-Control-Allow-Origin': '*', + } + }); + } + + if (!text) { + return new Response('Missing text parameter', { + status: 400, + headers: { + 'Access-Control-Allow-Origin': '*', + } + }); + } + + // Collect client request information + const clientIP = request.headers.get('CF-Connecting-IP') || + request.headers.get('X-Forwarded-For') || + request.headers.get('X-Real-IP') || + 'Unknown'; + + const userAgent = request.headers.get('User-Agent') || 'Unknown'; + const country = request.cf?.country || 'Unknown'; + const city = request.cf?.city || 'Unknown'; + const region = request.cf?.region || 'Unknown'; + const latitude = request.cf?.latitude || 'Unknown'; + const longitude = request.cf?.longitude || 'Unknown'; + const timezone = request.cf?.timezone || 'Unknown'; + const url = request.url || 'Unknown'; + const timestamp = new Date().toISOString(); + + // Format the message with request information + const hasCoordinates = latitude !== 'Unknown' && longitude !== 'Unknown'; + const mapLink = hasCoordinates + ? `https://www.google.com/maps?q=${latitude},${longitude}` + : null; + + const requestInfo = `IP: ${clientIP} 🔍 +Browser: ${userAgent} +Country: ${country} +Region: ${region} +City: ${city} +Coordinates: ${latitude}, ${longitude}${mapLink ? ` 📍` : ''} +Timezone: ${timezone} +Timestamp: ${timestamp} +Original text:`; + + const formattedMessage = `${requestInfo} + +${text}`; + + const telegramToken = env.TELEGRAM_TOKEN; + const telegramChatId = env.TELEGRAM_CHAT_ID; + + if (!telegramToken || !telegramChatId) { + return new Response('Missing TELEGRAM_TOKEN or TELEGRAM_CHAT_ID environment variables', { + status: 500, + headers: { + 'Access-Control-Allow-Origin': '*', + } + }); + } + + const telegramUrl = `https://api.telegram.org/bot${telegramToken}/sendMessage`; + const telegramPayload = { + chat_id: telegramChatId, + text: formattedMessage, + parse_mode: 'HTML' + }; + + const telegramResponse = await fetch(telegramUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(telegramPayload) + }); + + const telegramResult = await telegramResponse.json(); + + if (!telegramResponse.ok) { + return new Response(JSON.stringify({ + success: false + }), { + status: 500, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + } + }); + } + + return new Response(JSON.stringify({ + success: true + }), { + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + } + }); + + } catch (error) { + return new Response(JSON.stringify({ + success: false + }), { + status: 500, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + } + }); + } + }, +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..63e8a42 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "wrangler": "^4.0.0" + } +} diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000..0735d39 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,3 @@ +name = "telegram-mcp" +main = "index.js" +compatibility_date = "2026-01-01"