НОВОЕ: Helius приобретает Light Protocol
как настроить Telegram-бота для Solana
Блог/Разработка

Как настроить Telegram-бота для Solana

Инженер по взаимодействию с разработчикамиOwen Venter в XOwen Venter в LinkedIn
Чтение: 8 мин

В блокчейне Solana ежесекундно происходит около 400 транзакций. Среди них — переводы токенов, продажи NFT, обмены токенов, ставки, голосования DAO и многое другое. Но как отслеживать важные для вас изменения при таком объеме данных? Для этого существуют webhooks. Они позволяют отслеживать изменения и быть в курсе интересующих вас событий. В этом руководстве вы узнаете, как с помощью воркера Cloudflare настроить Telegram-бота, который будет отправлять ончейн-обновления непосредственно пользователю или в канал.

Как настроить Telegram-бота

  1. Настройте Telegram-канал и Telegram-бота.
  2. Создайте воркер Cloudflare, который свяжет webhook, отправляющий обновления, с Telegram-ботом.
  3. Создайте webhook Helius.
  4. Измените адреса, которые отслеживает webhook, через Helius Webhook API. Этот шаг нужен только для отслеживания целых коллекций NFT.

Настройка Telegram-бота

Telegram-боты отлично подходят для автоматизации различных задач, особенно отправки обновлений. Ниже описано, как настроить такого бота.

1. Начните диалог с BotFather

Найдите 'BotFather' через строку поиска Telegram и нажмите на него, чтобы начать диалог.

2. Создайте нового бота

Введите и отправьте '/newbot'. Затем BotFather предложит вам указать имя и имя пользователя для бота.

3. Получите токен доступа

После этого BotFather предоставит токен доступа.

Сохраните его в надежном месте: он понадобится далее в этом руководстве.

4. Создайте канал

Откройте меню (☰) и выберите 'Создать канал'.

После настройки канала нажмите на его название, выберите 'Администраторы' и добавьте своего бота в качестве администратора.

5. Найдите ID чата

Чтобы определить ID чата вашего канала, выполните следующие действия:

Отправьте сообщение:

Сначала отправьте сообщение в созданный канал.

Используйте Telegram API

Откройте в браузере https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates, заменив <YOUR_BOT_TOKEN> токеном, полученным от BotFather.

Найдите ID чата

В полученных данных найдите поле chat. В нем будет id — это ID чата вашего канала.

Сохраните этот ID чата в надежном месте: он понадобится для дальнейшей настройки.

Создание воркера Cloudflare

Воркеры Cloudflare позволяют развернуть код в интернете и выполнять его непрерывно, чтобы постоянно получать обновления от вашего webhook.

1. Войдите в Cloudflare

Сначала войдите в свою учетную запись Cloudflare. Если у вас ее еще нет, зарегистрируйтесь бесплатно.

2. Откройте раздел Workers

На панели управления Cloudflare перейдите на вкладку "Workers".

3. Создайте новый воркер

Нажмите кнопку “Create a Worker”. Откроется редактор воркера.

4. Измените код воркера

В редакторе вы увидите шаблон скрипта. Замените стандартный код предоставленным кодом Cloudflare для вашего Telegram-бота.

Найдите в коде переменные BOT_TOKEN и CHAT_ID. Это заполнители, которые используются для отправки сообщений через вашего бота в нужный чат.

5. Настройте переменные окружения

На панели управления Cloudflare Workers откройте вкладку "Settings" вашего воркера.

Здесь вы можете добавить токен бота, токен чата и ключ Helius API в качестве переменных окружения. Так конфиденциальные данные не попадут в основной код и останутся защищенными.

Убедитесь, что имена переменных окружения соответствуют именам, ожидаемым в коде (например, BOT_TOKEN, CHAT_ID и т. д.).

6. Разверните воркер

Убедитесь, что код и переменные окружения настроены правильно, а затем нажмите кнопку “Save and Deploy”. Воркер будет развернут и получит уникальный публичный URL.

7. Сохраните публичный URL

После развертывания обязательно сохраните публичный URL, назначенный вашему воркеру. Этот URL будет использоваться как конечная точка webhook для вашего Telegram-бота.

Код воркера 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;
}

Настройка webhook Helius

Webhooks Helius связывают изменения в блокчейне Solana с вашим Telegram-каналом. В этом примере я настрою webhook для отслеживания всех транзакций определенного кошелька.

1. Зарегистрируйтесь

Откройте dashboard.helius.dev и создайте бесплатную учетную запись.

2. Создайте webhook

На панели управления выберите создание нового webhook. Вы сможете выбрать его тип: Raw, Enhanced, Discord или Account. Для получения определенных категорий обновлений рекомендуется тип 'Enhanced'. Выбрав его, укажите интересующие вас обновления, например NFT_SALES или NFT_LISTING.

Полный список доступен здесь.

3. Укажите ссылку на воркер и адрес Solana

Укажите ссылку на развернутый воркер Cloudflare. Также добавьте конкретный адрес аккаунта Solana, который хотите отслеживать. Это может быть кошелек пользователя или список минтов из коллекции.

Как отслеживать коллекции NFT (настройка бота для продаж)

Если вы хотите отслеживать определенную коллекцию и получать обновления о событиях с входящими в нее NFT, добавьте адреса минтов всех NFT в качестве аккаунтов вашего webhook. Для этого используйте конечную точку webhook Helius и измените изначально созданный webhook. После настройки вы сможете отслеживать продажи, листинги, ставки, сжигания и любые другие транзакции с участием NFT.

Сначала вам понадобится список хешей или минтов отслеживаемой коллекции. С помощью следующего кода вы можете получить список минтов через DAS. Вам нужно только добавить ключ Helius API и заменить creatorAddress адресом первого подтвержденного создателя NFT. Чтобы найти первого подтвержденного создателя, откройте NFT в своем любимом обозревателе блоков Solana, найдите метаданные и скопируйте адрес из раздела создателей:

Код для создания снимка:

Код
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();

Получив код, откройте терминал, перейдите в каталог со скриптом и выполните node snapshot.js. В этом каталоге будет создан JSON-файл addresses.json. Также список хешей можно получить с помощью такого инструмента, как Magic Eden snapshot tool.

Получив список хешей, вы можете обновить список аккаунтов, которые отслеживает ваш webhook. Для этого используйте конечную точку webhooks Helius. Ниже приведен код, который упрощает эту задачу. Создайте новый файл JavaScript с именем webhookUpdate.js в том же каталоге, где находится список хешей, и добавьте в него приведенный ниже код. Затем укажите в коде свой ключ Helius API и ID webhook, который можно найти на портале разработчика. После этого измените тело запроса в соответствии с данными, указанными при создании webhook. Например, если вы решили отслеживать листинги и продажи NFT, обязательно добавьте их. Не изменяйте поле accountAddresses: оно настроено на использование созданного ранее списка хешей.

После внесения изменений запустите скрипт из терминала с помощью node webhookUpdate.js. После выполнения кода в терминале должно появиться подтверждение.

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();

После обновления webhook вернитесь к воркеру Cloudflare и измените код, чтобы он возвращал сведения, относящиеся к NFT. Необходимый код уже добавлен. Вам нужно только закомментировать раздел отправки обновлений TRANSFER и раскомментировать раздел отправки обновлений NFT.

Когда отслеживаемое событие произойдет ончейн, webhook отправит обновление воркеру Cloudflare. Оно будет в формате JSON и обычно будет содержать большой объем информации: все задействованные аккаунты, изменения в каждом аккаунте и сведения о типе события. В предоставленном коде мы извлекаем данные, которые считаем важными.

Чтобы настроить отправляемое сообщение или изменить данные, извлекаемые из обновления webhook, измените переменную messageToSend. Вы также можете отслеживать события, не связанные с переводами и NFT. Измените код Cloudflare, чтобы отправлять весь объект requestBody[0]. Тогда полный JSON-ответ webhook будет пересылаться вашему Telegram-боту, и вы сможете изучить его структуру. После этого выберите разделы, которые хотите включить в сообщение.

После такой настройки ваш Telegram-канал станет центром обновлений блокчейна Solana в реальном времени благодаря webhooks Helius. Надеемся, что это руководство оказалось полезным. Если у вас есть вопросы или проблемы, напишите нашей команде в Discord или X.

Подпишитесь на Helius

Следите за новостями разработки на Solana и получайте уведомления о наших публикациях

Увеличенное изображение