Spaces:
Paused
Paused
| import { | |
| buildTelegramDirectLink, | |
| createSignedTelegramFileId, | |
| getTelegramFileFromMessage, | |
| sendTelegramUploadNotice, | |
| shouldUseSignedTelegramLinks, | |
| shouldWriteTelegramMetadata, | |
| } from '../../utils/telegram.js'; | |
| export async function onRequestGet(context) { | |
| const { request } = context; | |
| const url = new URL(request.url); | |
| return jsonResponse({ | |
| ok: true, | |
| message: 'Telegram webhook endpoint is ready.', | |
| endpoint: url.pathname, | |
| }); | |
| } | |
| export async function onRequestPost(context) { | |
| const { request, env } = context; | |
| if (!env.TG_Bot_Token) { | |
| return jsonResponse({ ok: false, error: 'TG_Bot_Token is not configured.' }, 500); | |
| } | |
| const expectedSecret = env.TG_WEBHOOK_SECRET || env.TELEGRAM_WEBHOOK_SECRET; | |
| if (expectedSecret) { | |
| const headerSecret = request.headers.get('X-Telegram-Bot-Api-Secret-Token') || ''; | |
| if (headerSecret !== expectedSecret) { | |
| return jsonResponse({ ok: false, error: 'Invalid webhook secret.' }, 401); | |
| } | |
| } | |
| let update; | |
| try { | |
| update = await request.json(); | |
| } catch { | |
| return jsonResponse({ ok: false, error: 'Invalid JSON body.' }, 400); | |
| } | |
| const message = update?.message || update?.channel_post; | |
| if (!message) { | |
| return jsonResponse({ ok: true, ignored: 'no-message' }); | |
| } | |
| const media = getTelegramFileFromMessage(message); | |
| if (!media) { | |
| return jsonResponse({ ok: true, ignored: 'message-without-file' }); | |
| } | |
| const useSigned = shouldUseSignedTelegramLinks(env); | |
| const directId = useSigned | |
| ? await createSignedTelegramFileId( | |
| { | |
| fileId: media.fileId, | |
| fileExtension: media.fileExtension, | |
| fileName: media.fileName, | |
| mimeType: media.mimeType, | |
| fileSize: media.fileSize, | |
| messageId: media.messageId, | |
| }, | |
| env | |
| ) | |
| : `${media.fileId}.${media.fileExtension}`; | |
| if (env.img_url && shouldWriteTelegramMetadata(env)) { | |
| await env.img_url.put(`${media.fileId}.${media.fileExtension}`, '', { | |
| metadata: { | |
| TimeStamp: Date.now(), | |
| ListType: 'None', | |
| Label: 'None', | |
| liked: false, | |
| fileName: media.fileName, | |
| fileSize: media.fileSize, | |
| storageType: 'telegram', | |
| telegramFileId: media.fileId, | |
| telegramMessageId: media.messageId || undefined, | |
| fromWebhook: true, | |
| signedLink: useSigned, | |
| }, | |
| }); | |
| } | |
| const directLink = buildTelegramDirectLink(env, directId, new URL(request.url).origin); | |
| const chatId = message?.chat?.id; | |
| if (chatId) { | |
| const noticeResult = await sendTelegramUploadNotice( | |
| { | |
| chatId, | |
| replyToMessageId: message.message_id, | |
| directLink, | |
| fileId: media.fileId, | |
| messageId: media.messageId || message.message_id, | |
| fileName: media.fileName, | |
| fileSize: media.fileSize, | |
| }, | |
| env | |
| ); | |
| if (!noticeResult?.ok && !noticeResult?.skipped) { | |
| console.warn( | |
| 'Webhook reply failed:', | |
| noticeResult?.data?.description || noticeResult?.error || 'unknown error' | |
| ); | |
| } | |
| } | |
| return jsonResponse({ | |
| ok: true, | |
| directLink, | |
| storageType: 'telegram', | |
| mode: useSigned ? 'signed' : 'kv', | |
| }); | |
| } | |
| function jsonResponse(body, status = 200) { | |
| return new Response(JSON.stringify(body), { | |
| status, | |
| headers: { 'Content-Type': 'application/json' }, | |
| }); | |
| } | |