MỚI: Helius mua lại Light Protocol
cách thiết lập bot Telegram cho Solana
Blog/Phát triển

Cách thiết lập bot Telegram cho Solana

Kỹ sư trải nghiệm nhà phát triểnOwen Venter trên XOwen Venter trên LinkedIn
Đọc trong 8 phút

Có khoảng 400 giao dịch diễn ra mỗi giây trên blockchain Solana. Chúng bao gồm chuyển token, bán NFT, hoán đổi token, đặt giá, biểu quyết DAO, đặt cược và nhiều hoạt động khác. Nhưng với lượng dữ liệu lớn như vậy, làm thế nào để theo dõi những thay đổi mà bạn quan tâm? Đây là lúc webhook phát huy tác dụng. Webhook cho phép bạn theo dõi các thay đổi này và luôn nắm bắt thông tin mới nhất về những điều mình quan tâm. Hướng dẫn này sẽ chỉ cho bạn cách thiết lập bot Telegram để nhận thông tin cập nhật on-chain được gửi trực tiếp đến người dùng hoặc kênh thông qua Cloudflare worker.

Các bước thiết lập bot Telegram

  1. Thiết lập kênh Telegram và bot Telegram.
  2. Tạo một Cloudflare worker để làm cầu nối giữa webhook gửi thông tin cập nhật và bot Telegram.
  3. Tạo webhook Helius.
  4. Chỉnh sửa các địa chỉ mà webhook theo dõi qua Helius Webhook API. Bước này chỉ cần thiết khi theo dõi toàn bộ bộ sưu tập NFT.

Thiết lập bot Telegram

Bot Telegram là một cách tuyệt vời để tự động hóa một số tác vụ, đặc biệt là việc cập nhật thông tin. Sau đây là các bước để thiết lập bot.

1. Bắt đầu cuộc trò chuyện với BotFather

Tìm kiếm 'BotFather' trong thanh tìm kiếm của Telegram rồi nhấp vào đó để bắt đầu cuộc trò chuyện.

2. Tạo bot mới

Nhập và gửi '/newbot'. BotFather sẽ hướng dẫn bạn đặt tên và tên người dùng cho bot.

3. Lấy token truy cập

Sau khi hoàn tất, BotFather sẽ cung cấp một token truy cập.

Hãy lưu token này ở nơi an toàn vì chúng ta sẽ sử dụng nó ở phần sau của hướng dẫn.

4. Tạo kênh của bạn

Mở menu (☰) và chọn 'Kênh mới'.

Sau khi thiết lập kênh, hãy nhấp vào tên kênh, chọn 'Quản trị viên' và thêm bot của bạn làm quản trị viên.

5. Tìm ID cuộc trò chuyện

Để xác định ID cuộc trò chuyện của kênh, hãy làm theo các bước sau:

Gửi tin nhắn:

Trước tiên, hãy gửi một tin nhắn đến kênh bạn đã tạo.

Sử dụng Telegram API

Truy cập https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates trong trình duyệt và thay <YOUR_BOT_TOKEN> bằng token bạn nhận được từ BotFather.

Tìm ID cuộc trò chuyện

Trong dữ liệu được trả về, bạn sẽ thấy một trường có tên chat và bên trong trường đó là id, chính là ID cuộc trò chuyện của kênh.

Hãy nhớ lưu ID cuộc trò chuyện này ở nơi an toàn vì bạn sẽ cần nó cho các bước cấu hình tiếp theo.

Tạo Cloudflare worker

Cloudflare worker cho phép bạn triển khai mã được lưu trữ trực tuyến và chạy liên tục để luôn sẵn sàng nhận thông tin cập nhật từ webhook.

1. Đăng nhập vào Cloudflare

Trước tiên, hãy đăng nhập vào tài khoản Cloudflare. Nếu chưa có tài khoản, bạn có thể đăng ký miễn phí.

2. Truy cập mục Workers

Từ bảng điều khiển Cloudflare, chuyển đến thẻ "Workers".

3. Tạo Worker mới

Nhấp vào nút “Tạo Worker”. Thao tác này sẽ đưa bạn đến trình chỉnh sửa Worker.

4. Chỉnh sửa mã Worker

Trong trình chỉnh sửa, bạn sẽ thấy một mẫu tập lệnh. Hãy thay mã mặc định bằng mã Cloudflare được cung cấp cho bot Telegram của bạn.

Tìm các biến BOT_TOKEN và CHAT_ID trong mã. Đây là các phần giữ chỗ và sẽ được dùng để gửi tin nhắn qua bot đến đúng cuộc trò chuyện.

5. Cấu hình biến môi trường

Trong bảng điều khiển Cloudflare Workers, chuyển đến thẻ "Cài đặt" của worker.

Tại đây, bạn có thể thêm token của bot, token cuộc trò chuyện và khóa Helius API dưới dạng biến môi trường. Cách này giúp tách dữ liệu nhạy cảm khỏi mã chính và giữ dữ liệu an toàn.

Hãy đảm bảo đặt tên chính xác cho các biến môi trường này để khớp với tên được yêu cầu trong mã (ví dụ: BOT_TOKEN, CHAT_ID, v.v.).

6. Triển khai Worker

Sau khi đảm bảo mã và các biến môi trường đã được thiết lập chính xác, hãy nhấp vào nút “Lưu và triển khai”. Worker của bạn sẽ được triển khai và gán một URL công khai duy nhất.

7. Lưu lại URL công khai

Sau khi triển khai, hãy nhớ lưu lại URL công khai được gán cho worker. Đây là URL bạn sẽ sử dụng làm endpoint webhook cho bot Telegram.

Mã Cloudflare Worker:

Mã
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;
}

Thiết lập webhook Helius

Webhook Helius kết nối các thay đổi trên blockchain Solana với kênh Telegram của bạn. Trong ví dụ này, tôi sẽ thiết lập một webhook để theo dõi tất cả giao dịch do một ví cụ thể thực hiện.

1. Đăng ký

Truy cập dashboard.helius.dev và tạo một tài khoản miễn phí.

2. Tạo webhook

Trong bảng điều khiển, chọn tạo webhook mới. Bạn có thể chọn loại webhook: Raw, Enhanced, Discord hoặc Account. Đối với các thông tin cập nhật được phân loại cụ thể, nên chọn 'Enhanced'. Khi chọn loại này, hãy chỉ định những thông tin cập nhật mà bạn quan tâm, ví dụ: NFT_SALES hoặc NFT_LISTING.

Danh sách đầy đủ có tại đây.

3. Cung cấp liên kết Worker và địa chỉ Solana

Hãy cung cấp liên kết đến Cloudflare worker đã triển khai. Đồng thời, chỉ định địa chỉ tài khoản Solana cụ thể mà bạn muốn theo dõi, chẳng hạn như ví của người dùng hoặc danh sách mint từ một bộ sưu tập.

Cách theo dõi bộ sưu tập NFT (Thiết lập bot bán hàng)

Nếu muốn theo dõi một bộ sưu tập cụ thể để nhận thông tin cập nhật khi có sự kiện xảy ra với một NFT trong bộ sưu tập đó, bạn cần thêm tất cả địa chỉ mint NFT làm tài khoản trên webhook. Để thực hiện việc này, bạn cần dùng endpoint webhook Helius để chỉnh sửa webhook đã tạo ban đầu. Sau khi thiết lập xong, bạn sẽ có thể theo dõi hoạt động bán, niêm yết, đặt giá, đốt và mọi giao dịch khác có liên quan đến NFT.

Trước tiên, bạn cần có danh sách hash/mint của bộ sưu tập muốn theo dõi. Bạn có thể sử dụng đoạn mã sau để lấy danh sách mint bằng DAS. Bạn chỉ cần thêm khóa Helius API và thay creatorAddress bằng địa chỉ của người sáng tạo được xác minh đầu tiên của một NFT. Bạn có thể tìm người sáng tạo được xác minh đầu tiên bằng cách truy cập trình khám phá khối Solana yêu thích của bạn, tìm metadata rồi tìm địa chỉ trong mục người sáng tạo:

Mã snapshot:

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

Sau khi có danh sách này, bạn có thể chạy tập lệnh bằng cách mở terminal, chuyển đến thư mục chứa tập lệnh rồi chạy node snapshot.js. Thao tác này sẽ tạo một tệp JSON có tên addresses.json trong thư mục đó. Ngoài ra, bạn có thể dùng một công cụ như công cụ snapshot của Magic Eden để lấy danh sách hash.

Sau khi có danh sách hash, bạn có thể cập nhật danh sách tài khoản mà webhook theo dõi. Để thực hiện việc này, bạn cần dùng endpoint webhook Helius. Tôi đã đính kèm bên dưới một đoạn mã giúp việc này trở nên dễ dàng. Chỉ cần tạo một tệp JavaScript mới có tên webhookUpdate.js (trong cùng thư mục với danh sách hash) và thêm đoạn mã bên dưới. Sau đó, bạn có thể chỉnh sửa mã để thêm khóa Helius API và ID webhook của mình (có thể tìm thấy trên cổng thông tin dành cho nhà phát triển). Tiếp theo, bạn cần chỉnh sửa phần body của request để khớp với dữ liệu đã sử dụng khi tạo webhook. Vì vậy, nếu chọn theo dõi hoạt động niêm yết và bán NFT, hãy nhớ thêm các hoạt động đó. Không chỉnh sửa trường accountAddresses vì trường này được thiết lập để sử dụng danh sách hash mà chúng ta đã tạo trước đó.

Sau khi thực hiện các thay đổi này, bạn có thể chạy tập lệnh từ terminal bằng node webhookUpdate.js. Sau khi chạy mã, bạn sẽ nhận được thông báo xác nhận trong terminal.

webhookUpdate.js:

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

Sau khi webhook được cập nhật, bạn có thể quay lại Cloudflare worker và chỉnh sửa mã để trả về thông tin chi tiết dành riêng cho NFT. Mã cần thiết đã được thêm sẵn; bạn chỉ cần chuyển phần gửi thông tin cập nhật TRANSFER thành chú thích và bỏ chú thích ở phần gửi thông tin cập nhật NFT.

Khi một sự kiện bạn đang theo dõi xảy ra on-chain, webhook sẽ gửi thông tin cập nhật đến Cloudflare worker. Thông tin cập nhật này sẽ ở định dạng JSON và thường chứa nhiều dữ liệu, chẳng hạn như tất cả tài khoản liên quan, thay đổi trong từng tài khoản và thông tin về loại sự kiện. Trong đoạn mã được cung cấp, chúng tôi trích xuất những phần được xem là quan trọng.

Nếu muốn tùy chỉnh tin nhắn được gửi hoặc thay đổi dữ liệu được trích xuất từ thông tin cập nhật của webhook, bạn có thể sửa biến messageToSend. Nếu muốn theo dõi nội dung ngoài hoạt động chuyển và sự kiện NFT, bạn vẫn có thể thực hiện được. Bạn có thể sửa mã Cloudflare để gửi toàn bộ requestBody[0]. Thao tác này sẽ chuyển tiếp toàn bộ phản hồi JSON của webhook đến bot Telegram, cho phép bạn xem cấu trúc phản hồi. Sau đó, bạn có thể xem xét và quyết định những phần muốn đưa vào tin nhắn.

Với thiết lập này, kênh Telegram của bạn sẽ trở thành trung tâm nhận thông tin cập nhật theo thời gian thực từ blockchain Solana nhờ webhook Helius. Hy vọng hướng dẫn này hữu ích. Nếu có bất kỳ câu hỏi hoặc vấn đề nào, bạn có thể nhắn tin cho đội ngũ trên Discord hoặc X.

Đăng ký nhận tin từ Helius

Luôn cập nhật những thông tin mới nhất về phát triển Solana và nhận thông báo khi chúng tôi đăng bài

Hình ảnh phóng to