
Cómo configurar un bot de Telegram para Solana
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
- Configura el canal de Telegram y el bot de Telegram.
- Crea un Worker de Cloudflare que actúe como conexión entre el webhook que envía las actualizaciones y el bot de Telegram.
- Crea un webhook de Helius.
- 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:
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:
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:
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.
Artículos relacionados
Suscríbete a Helius
Mantente al día con las novedades del desarrollo en Solana y recibe actualizaciones cuando publiquemos


