NUEVO: Helius adquiere Light Protocol
cómo configurar un bot de Telegram para Solana
Blog/Desarrollo

Cómo configurar un bot de Telegram para Solana

Ingeniero de experiencia del desarrolladorOwen Venter en XOwen Venter en LinkedIn
8 min de lectura

En la blockchain de Solana se producen aproximadamente 400 transacciones por segundo. Estas incluyen transferencias de tokens, ventas de NFT, intercambios de tokens, ofertas, votaciones de DAO, apuestas y mucho más. Pero con tantos datos, ¿cómo puedes seguir los cambios que te interesan? Aquí es donde entran los webhooks. Los webhooks te permiten seguir estos cambios y mantenerte al día con lo que te importa. Esta guía te mostrará cómo configurar un bot de Telegram para enviar actualizaciones on-chain directamente a un usuario o canal mediante un Worker de Cloudflare.

Pasos para configurar un bot de Telegram

  1. Configura el canal de Telegram y el bot de Telegram.
  2. Crea un Worker de Cloudflare que actúe como conexión entre el webhook que envía las actualizaciones y el bot de Telegram.
  3. Crea un webhook de Helius.
  4. Edita mediante la API de Helius Webhook las direcciones que sigue el webhook. Este paso solo es necesario para seguir colecciones completas de NFT.

Configura un bot de Telegram

Los bots de Telegram son una excelente forma de automatizar ciertas tareas, especialmente las actualizaciones. Estos son los pasos para configurar uno.

1. Inicia una conversación con BotFather

Busca 'BotFather' en la barra de búsqueda de Telegram y haz clic para iniciar una conversación.

2. Crea un nuevo bot

Escribe y envía '/newbot'. BotFather te guiará para elegir el nombre y el nombre de usuario de tu bot.

3. Obtén un token de acceso

Cuando termines, BotFather te proporcionará un token de acceso.

Guárdalo de forma segura, ya que lo usaremos más adelante en el tutorial.

4. Crea tu canal

Ve al menú (☰) y selecciona 'Nuevo canal'.

Cuando hayas configurado el canal, haz clic en su nombre, selecciona 'Administradores' y agrega tu bot como administrador.

5. Encuentra el ID del chat

Para determinar el ID de chat de tu canal, sigue estos pasos:

Envía un mensaje:

Primero, envía un mensaje al canal que creaste.

Usa la API de Telegram

Ve a https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates en tu navegador y reemplaza <YOUR_BOT_TOKEN> por el token que recibiste de BotFather.

Localiza el ID del chat

En los datos devueltos, encontrarás un campo llamado chat y, dentro de él, un id que corresponde al ID de chat de tu canal.

Recuerda guardar este ID de chat de forma segura, ya que lo necesitarás para otras configuraciones.

Crea un Worker de Cloudflare

Cloudflare Workers te permite desplegar código alojado en línea que se ejecutará permanentemente para estar siempre atento a las actualizaciones de tu webhook.

1. Inicia sesión en Cloudflare

Primero, inicia sesión en tu cuenta de Cloudflare. Si aún no tienes una, puedes registrarte gratis.

2. Accede a la sección Workers

En el panel de Cloudflare, ve a la pestaña "Workers".

3. Crea un nuevo Worker

Haz clic en el botón “Crear un Worker”. Esto te llevará al editor de Workers.

4. Edita el código del Worker

En el editor verás una plantilla de script. Reemplaza el código predeterminado por el código de Cloudflare proporcionado para tu bot de Telegram.

Localiza las variables BOT_TOKEN e CHAT_ID en el código. Son marcadores de posición y se usarán para enviar mensajes al chat correcto mediante tu bot.

5. Configura las variables de entorno

En el panel de Cloudflare Workers, ve a la pestaña "Configuración" de tu Worker.

Aquí puedes agregar el token de tu bot, el token del chat y tu clave de API de Helius como variables de entorno. Esto mantiene los datos confidenciales fuera del código principal y los protege.

Asegúrate de nombrar correctamente estas variables de entorno para que coincidan con lo que espera tu código (p. ej., BOT_TOKEN, CHAT_ID, etc.).

6. Despliega el Worker

Después de verificar que el código y las variables de entorno estén configurados correctamente, haz clic en el botón “Guardar y desplegar”. Tu Worker se desplegará y recibirá una URL pública única.

7. Guarda la URL pública

Después del despliegue, asegúrate de guardar la URL pública asignada a tu Worker. Usarás esta URL como endpoint del webhook de tu bot de Telegram.

Código del Worker de Cloudflare:

Código
const TELEGRAM_BOT_TOKEN = BOT_TOKEN;
const TELEGRAM_CHAT_ID = CHAT_ID;
const HELIUS_API_KEY=API_KEY;
const HELIUS_RPC_URL = `https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`;

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  if (request.method === 'POST') {
    const requestBody = await request.json();
    console.log('Received POST request with body:', requestBody);

    //THIS IS FOR NFT UPDATES (comment this section out if you are doing something else)
    // Extract transaction description, timestamp, signature, and mint address
      // const NFTdescription = requestBody[0].description;
      // const NFTtimestamp = new Date(requestBody[0].timestamp * 1000).toLocaleString(); // Convert Unix timestamp to readable date-time
      // const NFTsignature = `https://solscan.io/tx/${requestBody[0].signature}`
      // const NFTmintAddress = requestBody[0].events.nft.nfts[0].mint;
      // const NFTimageUrl = await getAssetImageUrl(NFTmintAddress);// Get NFT image URL
      // // Construct the message
      // const messageToSendNFT =
      // `----NEW UPDATE---\n`+
      // `Description:\n${NFTdescription}\n` +
      // `Mint Address:\n${NFTmintAddress}\n` +
      // `Signature:\n${NFTsignature}\n` +
      // `Timestamp:\n${NFTtimestamp}`;
      // await sendToTelegramNFT(messageToSendNFT, NFTimageUrl); // Send to Telegram

    //THIS IS FOR TRANSFER UPDATES (comment this section out if you are doing something else)
    // Extract transaction description, timestamp, signature
      const Transferdescription = requestBody[0].description;
      const Transfertimestamp = new Date(requestBody[0].timestamp * 1000).toLocaleString(); // Convert Unix timestamp to readable date-time
      const Transfersignature = `https://xray.helius.xyz/tx/${requestBody[0].signature}`
      // Construct the message
      const messageToSendTransfer =
      `----NEW UPDATE---\n`+
      `Description:\n${Transferdescription}\n` +
      `Signature:\n${Transfersignature}\n` +
      `Timestamp:\n${Transfertimestamp}`;
      await sendToTelegramTransfer(messageToSendTransfer); // Send to Telegram

    return new Response('Logged POST request body.', {status: 200});
  } else {
    return new Response('Method not allowed.', {status: 405});
  }
}

// This function is used to send NFT Updates to the bot
async function sendToTelegramNFT(message, imageUrl) {
  const telegramUrl = `https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPhoto`;
  const response = await fetch(telegramUrl, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      chat_id: TELEGRAM_CHAT_ID,
      photo: imageUrl,
      caption: message,
      parse_mode: "HTML"
    }),
  });
  const responseData = await response.json();

  if (!response.ok) {
    console.error('Failed to send photo to Telegram:', responseData);
  }
}

//This function is used to send Transfer Updates to the Bot
async function sendToTelegramTransfer(message) {
  const telegramUrl = `https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage`;
  const response = await fetch(telegramUrl, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      chat_id: TELEGRAM_CHAT_ID,
      text: message,
      parse_mode: "HTML"
    }),
  });
  const responseData = await response.json();

  if (!response.ok) {
    console.error('Failed to send message to Telegram:', responseData);
  }
}

//This function gets images associated to NFTs that are features in updates.
async function getAssetImageUrl(mintAddress) {
  const response = await fetch(HELIUS_RPC_URL, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'getAsset',
      params: {
        id: mintAddress,
      },
    }),
  });
  const { result } = await response.json();
  return result.content.links.image;
}

Configura un webhook de Helius

Los webhooks de Helius conectan los cambios en la blockchain de Solana con tu canal de Telegram. En este ejemplo, configuraré un webhook para seguir todas las transacciones que realiza una billetera determinada.

1. Regístrate

Visita dashboard.helius.dev y crea una cuenta gratuita.

2. Crea un webhook

En tu panel, selecciona la opción para crear un nuevo webhook. Podrás elegir entre los tipos Raw, Enhanced, Discord o Account. Para recibir actualizaciones específicas y categorizadas, se recomienda 'Enhanced'. Al elegirlo, especifica las actualizaciones que te interesan, por ejemplo, NFT_SALES o NFT_LISTING.

Puedes consultar una lista completa aquí.

3. Proporciona el enlace del Worker y la dirección de Solana

Asegúrate de proporcionar el enlace de tu Worker de Cloudflare desplegado. También indica la dirección específica de la cuenta de Solana que quieres monitorear, ya sea la billetera de un usuario o una lista de mints de una colección.

Cómo seguir colecciones de NFT (configuración de un bot de ventas)

Si quieres seguir una colección determinada para recibir actualizaciones cuando ocurra algo con uno de sus NFT, tendrás que agregar todas las direcciones de mint de los NFT como cuentas en tu webhook. Para hacerlo, deberás usar el endpoint de webhooks de Helius y editar el webhook que creaste inicialmente. Una vez configurado, podrás seguir ventas, publicaciones, ofertas, quemas y cualquier otra transacción en la que participe un NFT.

Lo primero que necesitarás es una lista de hashes o mints de la colección que quieres seguir. Puedes usar el siguiente código para obtener una lista de mints mediante DAS. Solo debes agregar tu clave de API de Helius y reemplazar creatorAddress por la dirección del primer creador verificado de un NFT. Para encontrar al primer creador verificado, ve a tu explorador de bloques de Solana favorito, busca los metadatos y encuentra la dirección en la sección de creadores:

Código de snapshot:

Código
const fs = require('fs');
const url = `https://mainnet.helius-rpc.com/?api-key=`;

const getAssetsByCreator = async () => {
  let page = 1;
  let allMintAddresses = [];

  while (true) {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: `my-id-page-${page}`,
        method: 'getAssetsByCreator',
        params: {
          creatorAddress: 'GFQBHxuNcAwYwHtEpggMwbH5kwV6Ne4JowHbLVfsMC6C',
          onlyVerified: true,
          page: page,
          limit: 1000
        },
      }),
    });

    const { result } = await response.json();

    // If there are no more items, break the loop
    if (!response.ok) {
      throw new Error(`HTTP error! Status: ${response.status}`);
    }else{
      if (!result.items || result.items.length === 0) {
        break;
      }
    }

    // Extract mint addresses and add them to the list
    const mintAddresses = result.items.map(item => item.id);
    allMintAddresses.push(...mintAddresses);

    // Check if there are less than 1000 results to stop further requests
    if (result.items.length < 1000) {
      break;
    }

    page++;
  }

  // Join the addresses by comma
  const addressesString = allMintAddresses.join(',');
  console.log("All Mint Addresses: ", addressesString);
  fs.writeFileSync('addresses.json', JSON.stringify(allMintAddresses, null, 2));
};

getAssetsByCreator();

Cuando tengas esto, puedes ejecutar el script. Abre tu terminal, ve al directorio que contiene el script y ejecuta node snapshot.js. Esto creará en ese directorio un archivo JSON llamado addresses.json. También puedes usar una herramienta como la herramienta de snapshots de Magic Eden para obtener una lista de hashes.

Cuando tengas una lista de hashes, puedes actualizar la lista de cuentas que sigue tu webhook. Para hacerlo, deberás usar el endpoint de webhooks de Helius. A continuación, incluí un código que facilita el proceso. Crea un nuevo archivo JavaScript llamado webhookUpdate.js en el mismo directorio que tu lista de hashes y agrega el código siguiente. Después, edita el código para incluir tu clave de API de Helius y el ID de tu webhook, que encontrarás en el portal para desarrolladores. También deberás editar el cuerpo de la solicitud para que coincida con los datos que usaste al crear el webhook. Por ejemplo, si elegiste seguir publicaciones y ventas de NFT, asegúrate de incluirlas. No edites el campo accountAddresses, ya que está configurado para usar la lista de hashes que creamos antes.

Cuando hayas realizado estos cambios, puedes ejecutar el script desde tu terminal con node webhookUpdate.js. Después de ejecutar el código, deberías recibir una confirmación en la terminal.

webhookUpdate.js:

Código
const fs = require('fs');

const editWebhook = async () => {
    try {
      // Read the JSON file
      const addresses = JSON.parse(fs.readFileSync('addresses.json', 'utf8'));
  
      const response = await fetch(
        "https://api.helius.xyz/v0/webhooks/?api-key=",
        {
          method: 'PUT',
          headers: {
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            webhookURL: "",
            transactionTypes: ["NFT_LISTING","NFT_SALE"],
            accountAddresses: addresses,  // Use the addresses from the file
            webhookType: "enhanced"
          }),
        }
      );
      const data = await response.json();
      console.log({ data });
    } catch (e) {
      console.error("error", e);
    }
  };
  
  editWebhook();

Cuando el webhook se haya actualizado, puedes volver al Worker de Cloudflare y editar el código para devolver detalles específicos de los NFT. El código necesario ya está incluido. Solo debes comentar la sección que envía actualizaciones de TRANSFER y quitar los comentarios de la sección que envía actualizaciones de NFT.

Cuando ocurra on-chain un evento que estés siguiendo, el webhook enviará una actualización al Worker de Cloudflare. Esta actualización tendrá formato JSON y normalmente incluirá mucha información, como todas las cuentas involucradas, los cambios en cada cuenta y los datos relacionados con el tipo de evento. En el código proporcionado, extraemos las partes que consideramos importantes.

Si quieres personalizar el mensaje enviado o cambiar los datos que se extraen de la actualización del webhook, puedes modificar la variable messageToSend. También puedes seguir eventos distintos de transferencias y eventos de NFT. Puedes modificar el código de Cloudflare para enviar el requestBody[0] completo. Esto reenviará la respuesta JSON completa del webhook a tu bot de Telegram para que puedas consultar su estructura. Después, podrás decidir qué secciones quieres incluir en tu mensaje.

Con esta configuración, tu canal de Telegram se convierte en un centro de actualizaciones en tiempo real de la blockchain de Solana gracias a los webhooks de Helius. Esperamos que esta guía te haya resultado útil. Si tienes alguna pregunta o problema, no dudes en escribirle al equipo en Discord o X.

Suscríbete a Helius

Mantente al día con las novedades del desarrollo en Solana y recibe actualizaciones cuando publiquemos

Imagen ampliada