如何设置 Solana Telegram 机器人

Solana 区块链上每秒大约发生 400 笔交易。其中包括代币转让、NFT 销售、代币互换、出价、DAO 投票、投注等等。但面对如此多的数据,您如何跟踪您关心的变化?这就是 Webhooks 的用武之地。Webhooks 允许您跟踪这些更改并及时了解您关心的事情。本指南将向您展示如何设置 Telegram 机器人,以使用 Cloudflare Worker 将链上更新直接发送到用户或频道。

如何设置 Solana Telegram 机器人
如何设置 Solana Telegram 机器人

Solana 区块链上每秒大约发生 400 笔交易。其中包括代币转让、NFT 销售、代币互换、出价、DAO 投票、投注等等。但面对如此多的数据,您如何跟踪您关心的变化?这就是 Webhooks 的用武之地。Webhooks 允许您跟踪这些更改并及时了解您关心的事情。本指南将向您展示如何设置 Telegram 机器人,以使用 Cloudflare Worker 将链上更新直接发送到用户或频道。

Telegram 机器人发送更新。

设置 Telegram 机器人的步骤

  1. 设置 Telegram 频道和 Telegram 机器人。
  2. 创建一个 Cloudflare Worker 来充当发送更新的 Webhook 和 Telegram 机器人之间的连接。
  3. 创建 Helius Webhook。
  4. 通过 Helius Webhook API 编辑 Webhook 跟踪的地址。仅当跟踪整个 NFT 集合时才需要执行此步骤。

设置 Telegram 机器人

Telegram 机器人是自动执行某些任务(尤其是更新)的好方法。以下是设置步骤。

  1. 与 BotFather 开始对话:在 Telegram 搜索栏中搜索“BotFather”并单击它以开始对话。
  2. 创建新机器人:输入并发送“/newbot”。 BotFather 现在将指导您命名您的机器人并为其提供用户名。
  3. 访问令牌:完成后,BotFather 将提供访问令牌。安全地记下它,因为我们稍后将在本教程中使用它。

对于频道更新:

  1. 创建 Telegram 频道:转到菜单 (☰) 并选择“新频道”。
  2. 邀请机器人:设置频道后,单击频道名称,选择“管理员”并将您的机器人添加为其中之一。
  3. 找到聊天ID
  4. 要确定您频道的聊天 ID,请按以下步骤操作:
  5. 发送消息:首先,向您创建的频道发送消息。
  6. 使用 Telegram API:在浏览器中导航至https://api.telegram.org/bot<YOUR_BOT_TOKEN>/ getUpdates,将<YOUR_BOT_TOKEN>替换为您从 BotFather 收到的令牌。
  7. 找到聊天 ID:在返回的数据中,您将找到一个名为“聊天”的字段,其中包含一个id,即您频道的聊天 ID。
  8. 请记住安全记下此聊天 ID,因为您需要它来进行进一步的配置。

创建 Cloudflare 工作线程

Cloudflare Workers 允许您部署在线托管的代码并将永久运行,以便不断警惕来自 Web hook 的更新。

  1. 登录 Cloudflare:首先登录您的 Cloudflare 帐户。如果您还没有,可以免费注册。
  2. 访问 Workers 部分:从 Cloudflare 仪表板,导航到“Workers”选项卡。
  3. 创建新工作人员:单击“创建工作人员”按钮。这将带您进入工作编辑器。
  1. 编辑工人代码
  2. 在编辑器中,您将看到一个脚本模板。将默认代码替换为为您的 Telegram 机器人提供的 Cloudflare 代码。
  3. 在代码中找到BOT_TOKENCHAT_ID的变量。这些是占位符,将用于通过您的机器人将消息发送到正确的聊天室。
  4. 配置环境变量
  5. 在 Cloudflare Workers 仪表板中,导航到工作线程的“设置”选项卡。
  6. 在这里,您可以添加机器人的令牌、聊天令牌和 Helius API 密钥作为环境变量。这有助于确保敏感数据远离您的主代码并保证其安全。
  7. 确保正确命名这些环境变量以匹配代码中的预期(例如,BOT_TOKENCHAT_ID等)。
  8. 部署 Worker:确保正确设置代码和环境变量后,单击“保存并部署”按钮。您的工作人员将被部署并分配一个唯一的公共 URL。
  9. 记下公共 URL:部署后,请务必记下分配给您的工作人员的公共 URL。此 URL 是您将用作 Telegram 机器人的 Webhook 端点的 URL。

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

设置 Helius Webhook

Helius Webhook 弥合了 Solana 区块链和 Telegram 频道上的更改之间的差距。在此示例中,我将设置一个 Webhook 来跟踪某个钱包进行的所有交易。

  1. 注册:访问dev.helius.xyz并创建一个免费帐户。
  2. 创建 Webhook:在仪表板中,选择创建新的 Webhook。您可以选择决定其类型 - 原始、增强、Discord 或帐户。对于特定分类的更新,建议使用“增强”。选择此选项时,请指定您感兴趣的更新,例如NFT_SALESNFT_LISTING此处提供了完整的列表。
  3. 提供工作线程链接和 Solana 地址:确保您提供已部署的 Cloudflare 工作线程的链接。另外,请提及您希望监控的特定 Solana 帐户地址(可以是用户的钱包或收藏中的薄荷糖列表)。
Helius webhook 设置设置

如何跟踪 NFT 收藏(销售机器人设置)

如果您想跟踪某个集合,以便在该集合中的 NFT 发生问题时获取更新,您需要将所有 NFT 铸币地址添加为 Webhook 上的帐户。为此,您需要使用 Helius Webhook 端点来编辑您最初创建的 Webhook。设置完成后,您将能够跟踪销售、列表、出价、销毁以及涉及 NFT 的任何其他交易在。

您需要的第一件事是您要跟踪的集合的哈希/薄荷列表。您可以使用以下代码通过 DAS 获取薄荷列表。您需要做的就是添加您的 Helius API 密钥,并将 CreatorAddress 替换为第一个经过验证的 NFT 创建者的地址。您可以通过您最喜欢的浏览器查找元数据并在创建者部分下找到地址来找到第一个经过验证的创建者:

查找创建者地址

‍ 快照代码:


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 来运行脚本。这将在该目录中创建一个名为 ports.json 的 JSON 文件。或者,您可以使用Magic Eden 快照工具等工具来获取哈希列表。

获得哈希列表后,您可以更新 Webhook 跟踪的帐户列表。为此,您需要使用 Helius webhooks 端点。我在下面附加了一些代码,可以使这变得简单。只需创建一个名为 webhookUpdate.js 的新 JavaScript 文件(与哈希列表位于同一目录中)并添加以下代码。然后,您可以编辑代码以包含您的 Helius API 密钥和 Webhook ID(可以在开发门户上找到)。然后,您需要编辑请求正文以匹配您在创建 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 Worker 并编辑代码以返回特定于 NFT 的详细信息。所需的代码已包含在内,您需要做的就是注释掉用于发送 TRANSFER 更新的部分并取消注释用于发送 NFT 更新的部分。

当您跟踪的事件发生在链上时,Webhook 会向 Cloudflare 工作线程发送更新。此更新将采用 json 格式,通常包含大量信息,例如涉及的所有帐户、每个帐户的更改以及与事件类型相关的信息。在提供的代码中,我们提取了我们认为重要的部分。

如果您想自定义发送的消息或更改从 webhook 更新中提取的数据,您可以更改 messageToSend 变量。如果您想跟踪转账和 NFT 事件之外的其他内容,您仍然可以这样做。您可以修改 Cloudflare 代码以发送整个requestBody[0]。这会将完整的 webhook JSON 响应转发到您的 Telegram 机器人,以便您查看响应结构。然后,您可以查看并决定要在消息中包含其中的哪些部分。

通过此设置,您的 Telegram 频道将成为 Solana 区块链实时更新的中心,这一切都归功于 Helius webhooks。我们希望您发现本指南很有用,如果您有任何疑问或问题,请随时在DiscordTwitter上向团队发送消息。

💡
原文链接:How to set up a Solana Telegram bot
本文由SlerfTools翻译,转载请注明出处。

SlerfTools专为Solana设计的工具箱,致力于简化区块链操作,提供无编程全可视化界面,使发币管理流动性无代码创建Dapp等复杂过程变得安全简单。