Crea y aloja un bot de Telegram gratis

Alojar gratis bot telegram cloudflare crear facil bot telegram explicado gratis

Los bots de Telegram pueden ser muy útiles para automatizar tareas, como por ejemplo, recibir notificaciones, consultar información, asistir a nuestros usuarios, etc. Es por ello que hoy te enseñaré a crear un bot de Telegram y alojarlo en un servidor para que esté disponible todo el tiempo.

Este trabajo es posible gracias a cvzi y a sus ejemplos de bot de telegram en Cloudflare Workers que me ayudaron enormemente a contruir este codigo.

Requisitos

Crear un Bot en Telegram

Solo necesitas hablar con el bot @BotFather y elegir la opción /newbot. Luego te pedirá un nombre y un usuario. El nombre de usuario debe terminar en bot y ser único. Por ejemplo, MiBot o MiBot123_bot. Una vez creado, ya puedes editar los detalles como la descripción, la foto de perfil y demás:

Hay muchas opciones disponibles, pero como viste en el video solo agregaremos 2 comandos simples, para ello selecciona la opción "Edit Commands" y luego envía un mensaje con lo siguiente:

help - Lista de comandos
test - Envía un texto de prueba

Si lo hiciste correctamente cuando visites el bot veras un menú con los comandos que agregaste. Por último y como paso mas importante, copia la clave de API de tu Bot que te proporcionó @BotFather, la necesitaremos para el siguiente proceso.

Crear un Worker en Cloudflare

Cloudflare nos proporciona un servicio que permite ejecutar código JavaScript, con un tiempo de respuesta muy bajo y sin necesidad de un servidor, por ello lo usaremos para alojar nuestro bot de Telegram.

Crear Worker

Para crear un nuevo Worker, debes ir a la sección "Workers y Pages" que encontrarás en la barra lateral y hacer clic en el botón "Crear Worker". Escribe un nombre para tu aplicación (sin espacios ni caracteres especiales) y presiona el botón "Implementar" para finalizar.

Guardar la clave de API del bot

Para mantener la clave de API de Telegram segura, vamos a agregarla como una variable de entorno. Para ello, dirígete la pestaña de Configuración de tu Worker y selecciona la opción "Variables". Haz clic en el botón "Agregar variable" y escribe TELEGRAM_API_KEY en el campo "Nombre de variable" y la clave de API en el campo "Valor", por último guarda los cambios.

cear variable de entorno

Código del Bot

Hasta el momento ya tenemos un bot de Telegram y un Worker en Cloudflare, ahora solo nos falta el código que hará que nuestro bot funcione. Vamos a precionar el botón "Edición rápida" para abrir el editor de código y reemplaza todo el contenido por el siguiente código:

const TELEGRAM_TOKEN = TELEGRAM_API_KEY
const WEBHOOK = '/endpoint'
const SECRET = 'X_PALABRA_SECRETA'

addEventListener('fetch', event => {
  const url = new URL(event.request.url)
  const path = url.pathname

  let response
  switch (path) {
  case WEBHOOK:
    response = handleWebhook(event)
    break
  case '/registerWebhook':
    response = registerWebhook(event, url, WEBHOOK, SECRET)
    break
  case '/unRegisterWebhook':
    response = unRegisterWebhook(event)
    break
  default:
    response = new Response('No hay nada aquí')
  }

  event.respondWith(response)
})

Este codigo escucha las peticiones que llegan a la ruta /endpoint y las envía a la función handleWebhook. También crea dos rutas adicionales para registrar y eliminar el webhook, las cuales veremos más adelante.

Es importante que cambies el valor de la variable SECRET por una palabra secreta que solo tu conozcas, ya que la usaremos para verificar que las peticiones que llegan a nuestro Worker provienen de Telegram.

Ahora vamos a crear la función handleWebhook que se encargará de verificar la palabra secreta y procesar la respuesta que envía Telegram. Para ello, agrega el siguiente código debajo del anterior:

async function handleWebhook (event) {
  // Verifica la clave secreta
  if (event.request.headers.get('X-Telegram-Bot-Api-Secret-Token') !== SECRET) {
    return new Response('Unauthorized', { status: 403 })
  }

  const update = await event.request.json()
  event.waitUntil(onUpdate(update))
  return new Response('Ok')
}

async function onUpdate (update) {
  if ('message' in update) {
    await onMessage(update.message)
  }
}

Como habrás notado, llamamos a una función onUpdate que verifica si la actualización contiene un mensaje y si es así, llama a la función onMessage, la cual veremos al final. Ahora vamos a crear las funciones para registrar y eliminar el webhook:

async function makeApiRequest (endpoint, params = {}) {
  const response = await fetch(apiUrl(endpoint, params))
  const jsonResponse = await response.json()

  if ('ok' in jsonResponse && jsonResponse.ok) {
    return new Response('Ok')
  } else {
    return new Response(JSON.stringify(jsonResponse, null, 2))
  }
}

async function registerWebhook (event, requestUrl, suffix, secret) {
  const webhookUrl = `${requestUrl.protocol}//${requestUrl.hostname}${suffix}`

  return makeApiRequest('setWebhook', {
    url: webhookUrl,
    secret_token: secret
  })
}

async function unRegisterWebhook (event) {
  return makeApiRequest('setWebhook', { url: '' })
}

Y para finalizar con los preparativos, vamos a crear la función apiUrl que nos ayudará a crear la URL de la API de Telegram dependiendo del método que queramos usar:

function apiUrl (methodName, params = null) {
  const baseUrl = `https://api.telegram.org/bot${TELEGRAM_TOKEN}`
  let query = ''

  if (params) {
    const searchParams = new URLSearchParams(params)
    query = `?${searchParams.toString()}`
  }

  return `${baseUrl}/${methodName}${query}`
}

Ahora si, ya tenemos todo listo para enfocarnos en las funciones que finalmente harán que nuestro bot haga algo. Primero crearemos la funcion sendMessage que llama al método sendMessage de la API de Telegram para enviar un mensaje a un chat:

async function sendMessage (chatId, text, options = {}) {
  return (await fetch(apiUrl('sendMessage', {
    chat_id: chatId,
    text,
    ...options
  }))).json()
}

Esta función recibe el ID del chat, el texto del mensaje y un objeto con opciones adicionales, el metodo tiene mas opciones, pero para este tutorial solo usaremos estas.

Por ultimo vamos a crear la función onMessage que usamos anteriormente. Esta función es la que finalmente enviará el mensaje de respuesta al chat:

async function onMessage (message) {
  const chatId = message.chat.id
  const text = message.text

  if (text.startsWith('/help')) {
    return sendMessage(chatId,
      'Estos son los comandos disponibles:\n\n' +
      '/help - Lista de comandos y más información\n' +
      '/test - Texto de prueba'
    )
  }

  if (text.startsWith('/test')) {
    return sendMessage(chatId, 'Esto es un texto de prueba')
  }
}

Esta función verifica si el mensaje empieza por alguno de los comandos y envía un mensaje en respuesta. Si quieres agregar más, solo debes crear mas condiciones y el texto de respuesta. Tambien cabe aclarar que aunque tu bot no tenga comandos configurados estos seguirán funcionando sin problemas.

Registrar o eliminar el Webhook

Ya tenemos todo listo para probar nuestro bot, pero antes debemos registrar el webhook para que Telegram envíe las actualizaciones a nuestro Worker. Tan solo debes visitar la ruta /registerWebhook de tu Worker y si recibes un mensaje de "Ok", es que todo salió bien.

Si quieres eliminar el webhook y por ende detener el bot, puedes visitar la ruta /unRegisterWebhook. Por último entra a Telegram y envía uno de los comandos que hemos agregado, si todo salió bien, deberías recibir un mensaje de respuesta.

Conclusión

Como puedes ver, crear un bot de Telegram es bastante sencillo y gracias a Cloudflare Workers lo podemos alojar gratis y sin servidor. Si tuviste algún problema o tienes alguna duda, puedes dejar un comentario, los leo todos.

Si este articulo te ha sido útil, puedes compartirlo en tus redes sociales, eso siempre me motiva a seguir compartiendo contenido. Espero que te haya gustado y nos vemos en próximos articulos en donde agregaremos mas funcionalidades interesantes a nuestro bot.