新消息:Helius 收购 Light Protocol
用不到 100 行代码创建 Solana Telegram 机器人
博客/开发

用不到 100 行代码创建 Solana Telegram 机器人

集成工程师X 上的 Het DagliLinkedIn 上的 Het Dagli
阅读需 4 分钟

想实时掌握 Solana 事件?本指南将向你展示如何创建一个可跟踪链上活动的 Telegram 机器人。我们将以 NFT 销售跟踪器为例,但你可以轻松调整这个模板,将其用于其他场景。

我们的示例机器人将如下所示:

此模板结合了用于获取实时 Solana 数据的 Helius webhook 和提供无服务器托管的 Cloudflare Workers。无论你要跟踪 NFT 销售、监控 DeFi 协议,还是关注特定钱包,此设置都能提供坚实的基础。

设置项目

让我们启动并运行你的项目:

1. 克隆仓库

代码
git clone https://github.com/helius-labs/cloudfare-telegram-template.git

cd cloudfare-telegram-template

2. 安装依赖项

代码
npm install

3. 配置环境变量

打开 wrangler.toml 并填写以下键:

TELEGRAM_BOT_TOKEN

  1. 打开 Telegram 并搜索 @BotFather。
  2. 与 BotFather 开始聊天,然后发送命令 /newbot。 
  3. 按照提示为你的机器人选择名称和用户名。 
  4. 创建完成后,BotFather 会提供一个令牌。这就是你的 TELEGRAM_BOT_TOKEN。 

TELEGRAM_CHAT_ID

  1. 创建一个频道,并将你的机器人添加为管理员。
  2. 向该频道发送一条消息。
  3. 访问:https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
  4. 在响应中找到 "chat":{"id": 字段。这就是你的 TELEGRAM_CHAT_ID。
  5. 观看此视频,了解分步操作方法:

HELIUS_API_KEY 你的 Helius API 密钥(从 Helius 获取)

AUTH_TOKEN 打开 bash 并生成一个唯一的 AUTH_TOKEN:

代码
openssl rand -base64 32

4. 部署到 Cloudflare

代码
npm run deploy

运行此命令后,你将在控制台输出中看到部署 URL。请记下此 URL,因为下一步会用到它。

5. 创建 webhook

使用上一步中的部署 URL 创建 webhook:

代码
curl -X POST https://your-worker-url.workers.dev/create-webhook

运行此命令后,你将收到成功响应。

你可以在 Helius 控制面板中查看新建的 webhook。

6. 编辑 webhook

创建 webhook 后,你可以在 Helius 控制面板中进一步自定义它: 

  1. 前往控制面板中的 webhook 部分
  2. 你应该会在列表中看到新创建的 webhook。 
  3. 点击该 webhook 以编辑其设置。
  4. 你可以在此修改各种参数,例如:
    • 要跟踪的交易类型
    • 要监控的特定钱包地址
    • 网络(mainnet、devnet)

代码解析

首先,让我们查看导入项和类型定义:

代码
import { Hono } from 'hono';

type Env = {
  HELIUS_API_KEY: string;
  TELEGRAM_BOT_TOKEN: string;
  TELEGRAM_CHAT_ID: string;
  AUTH_TOKEN: string;
};

‍我们使用的是 Hono,这是一个适用于 Cloudflare Workers 的轻量级 Web 框架。Env 类型定义了 Helius 和 Telegram 集成所需的环境变量。

接下来,设置 Hono 应用:‍

代码
const app = new Hono<{ Bindings: Env }>();

app.get('/', (c) => c.text('Solana Action Bot is running!'));

这会创建应用并设置一个简单的健康检查端点。

现在,让我们创建 webhook:

代码
app.post('/create-webhook', async (c) => {
  const webhookURL = `${new URL(c.req.url).origin}/webhook`;
  console.log('Setting up webhook with URL:', webhookURL);

  const response = await fetch(
    `https://api.helius.xyz/v0/webhooks?api-key=${c.env.HELIUS_API_KEY}`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        webhookURL: webhookURL,
        transactionTypes: ["NFT_SALE"],
        accountAddresses: ["M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K"], // Magic Eden v2 program
        webhookType: "enhanced",
        authHeader: c.env.AUTH_TOKEN
      }),
    }
  );
  const data = await response.json();
  console.log('Helius webhook setup response:', data);
  return c.json({ success: true, webhook: data, webhookURL: webhookURL });
});

此端点会设置 Helius webhook。在本例中,我们会跟踪 Magic Eden v2 程序中的 NFT 销售,但你可以根据需要修改 transactionTypes 和 accountAddresses。‍

下面是向 Telegram 发送消息的方式:

代码
async function sendTelegramMessage(message: string, env: Env) {
  const url = `https://api.telegram.org/bot${env.TELEGRAM_BOT_TOKEN}/sendMessage`;
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      chat_id: env.TELEGRAM_CHAT_ID,
      text: message,
      parse_mode: 'Markdown',
    }),
  });
  return response.json();
}

此函数会格式化消息并将其发送到 Telegram 聊天。

最后,让我们处理传入的 webhook 数据:

代码
app.post('/webhook', async (c) => {

  const authToken = c.req.header('Authorization');
  if (authToken !== c.env.AUTH_TOKEN) {
    return c.text('Unauthorized', 401);
  }

  let data;
  try {
    data = await c.req.json();
    console.log('Received webhook data:', JSON.stringify(data, null, 2));
  } catch (error) {
    console.error('Error parsing webhook data:', error);
    return c.text('Error processing webhook', 400);
  }

  if (!Array.isArray(data) || data.length === 0) {
    console.log('No transactions in webhook data');
    return c.text('No transactions to process', 200);
  }

  for (const transaction of data) {
    if (transaction.type === 'NFT_SALE') {
      const { amount, buyer, seller, signature, nfts } = transaction.events.nft;
      const message = `🎉 *NFT Sale*\n\n` +
        `*Price*: ${amount / 1e9} SOL\n` +
        `*Buyer*: \`${buyer}\`\n` +
        `*Seller*: \`${seller}\`\n` +
        `*Signature*: [View on Solana Explorer](https://explorer.solana.com/tx/${signature})`;

      try {
        const result = await sendTelegramMessage(message, c.env);
        console.log('Telegram message sent:', result);
      } catch (error) {
        console.error('Error sending Telegram message:', error);
      }
    }
  }

  return c.text('Webhook processed');
});

‍我们会在这里处理来自 Helius 的数据,并向 Telegram 发送格式化后的消息。你可以根据自己的使用场景自定义这部分,以处理不同类型的交易或提取不同的信息。

自定义选项

虽然我们的示例侧重于 NFT 销售,但你可以轻松调整此模板,将其用于各种场景:

  1. 修改 webhook 创建过程中的 transactionTypes,以跟踪不同事件
  2. 更改 accountAddresses,以监控特定程序或钱包
  3. 调整 /webhook 端点中的消息格式,以满足你的数据需求
  4. 实现额外逻辑,对传入的数据进行筛选或处理‍

查看 Helius webhook 文档,了解所有可跟踪的数据和事件。但不要将自己局限于明确定义的事件!Helius webhook 非常灵活,可以跟踪大量链上活动,包括文档中未直接解析或提及的活动。

以下是一些你可以跟踪的事件示例:

  • 特定 SPL 代币的转账
  • 新程序部署
  • Raydium 池创建或流动性添加
  • 治理提案创建或投票
  • Metaplex candy machine 发布
  • Serum 市场创建

利用此模板,你可以创建用于执行各种 Solana 监控任务的 Telegram 机器人,涵盖 DeFi 协议事件、钱包活动跟踪等众多场景。

感谢你阅读到这里!希望本指南能帮助你开始创建自己的 Solana Telegram 机器人。欢迎订阅我们的新闻简报,及时了解 Solana 的最新动态。准备好深入探索了吗?立即查看 Helius 博客上的最新文章,继续你的 Solana 之旅。

其他资源

  1. Helius 文档
  2. Cloudflare Workers 文档
  3. Telegram Bot API
  4. Hono 文档

订阅 Helius

及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新

放大图片