Last active
April 27, 2023 06:53
-
-
Save cvzi/19167581a023a2c1c51461aecc15c497 to your computer and use it in GitHub Desktop.
Telegram Bot on Cloudflare Workers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// new versions at https://github.com/cvzi/telegram-bot-cloudflare | |
const TOKEN = '123456789:Tnm6EJ8jjk_KhepfI8PlU1n7x0dAAy-QOxO' // Get it from @BotFather https://core.telegram.org/bots#6-botfather | |
const WEBHOOK = '/endpoint' | |
const SECRET = 'QUEVEDO_BZRP_Music_Sessions_52' // A-Z, a-z, 0-9, _ and - | |
/** | |
* Wait for requests to the worker | |
*/ | |
addEventListener('fetch', event => { | |
const url = new URL(event.request.url) | |
if (url.pathname === WEBHOOK) { | |
event.respondWith(handleWebhook(event)) | |
} else if (url.pathname === '/registerWebhook') { | |
event.respondWith(registerWebhook(event, url, WEBHOOK, SECRET)) | |
} else if (url.pathname === '/unRegisterWebhook') { | |
event.respondWith(unRegisterWebhook(event)) | |
} else { | |
event.respondWith(new Response('No handler for this request')) | |
} | |
}) | |
/** | |
* Handle requests to WEBHOOK | |
* https://core.telegram.org/bots/api#update | |
*/ | |
function handleWebhook (event) { | |
// Check secret | |
if (event.request.headers.get('X-Telegram-Bot-Api-Secret-Token') !== SECRET) { | |
return new Response('Unauthorized', { status: 403 }) | |
} | |
// Handle the request async | |
const handler = async function () { | |
const update = await event.request.json() | |
await onUpdate(update) | |
} | |
event.waitUntil(handler()) | |
return new Response('Ok') | |
} | |
/** | |
* Handle incoming Update | |
* https://core.telegram.org/bots/api#update | |
*/ | |
async function onUpdate (update) { | |
if ('message' in update) { | |
await onMessage(update.message) | |
} | |
} | |
/** | |
* Handle incoming Message | |
* https://core.telegram.org/bots/api#message | |
*/ | |
function onMessage (message) { | |
return sendPlainText(message.chat.id, 'Echo:\n' + message.text) | |
} | |
/** | |
* Send plain text message | |
* https://core.telegram.org/bots/api#sendmessage | |
*/ | |
async function sendPlainText (chatId, text) { | |
return (await fetch(apiUrl('sendMessage', { | |
chat_id: chatId, | |
text | |
}))).json() | |
} | |
/** | |
* Set webhook to this worker's url | |
* https://core.telegram.org/bots/api#setwebhook | |
*/ | |
async function registerWebhook (event, requestUrl, suffix, secret) { | |
// https://core.telegram.org/bots/api#setwebhook | |
const webhookUrl = `${requestUrl.protocol}//${requestUrl.hostname}${suffix}` | |
const r = await (await fetch(apiUrl('setWebhook', { url: webhookUrl, secret_token: secret }))).json() | |
return new Response('ok' in r && r.ok ? 'Ok' : JSON.stringify(r, null, 2)) | |
} | |
/** | |
* Remove webhook | |
* https://core.telegram.org/bots/api#setwebhook | |
*/ | |
async function unRegisterWebhook (event) { | |
const r = await (await fetch(apiUrl('setWebhook', { url: '' }))).json() | |
return new Response('ok' in r && r.ok ? 'Ok' : JSON.stringify(r, null, 2)) | |
} | |
/** | |
* Return url to telegram api, optionally with parameters added | |
*/ | |
function apiUrl (methodName, params = null) { | |
let query = '' | |
if (params) { | |
query = '?' + new URLSearchParams(params).toString() | |
} | |
return `https://api.telegram.org/bot${TOKEN}/${methodName}${query}` | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment