新着:HeliusがLight Protocolを買収
100行未満のコードでSolana Telegramボットを作成する
ブログ/開発

100行未満のコードでSolana Telegramボットを作成する

インテグレーションエンジニアXのHet DagliLinkedInのHet Dagli
読了時間:4分

Solanaのイベントをリアルタイムで把握したいですか?このガイドでは、オンチェーンアクティビティを追跡できるTelegramボットの作成方法を説明します。NFT販売トラッカーを例にしますが、ここで作成するテンプレートは、ほかのユースケースにも簡単に応用できます。

完成するサンプルボットは次のようになります。

このテンプレートでは、Solanaのリアルタイムデータを取得するHelius webhooksと、サーバーレスホスティング用の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

このコマンドを実行すると、成功レスポンスが返されます。

設定した新しいwebhookを確認するには、Heliusダッシュボードを開きます。

6. webhookを編集する

webhookを作成した後、Heliusダッシュボードでさらにカスタマイズできます。 

  1. ダッシュボードのwebhooksセクションに移動します
  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;
};

‍ここでは、Cloudflare Workers向けの軽量WebフレームワークであるHonoを使用しています。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 webhooksドキュメントをご覧ください。ただし、明示的に定義されたイベントだけに限定する必要はありません。Helius webhooksは非常に柔軟で、ドキュメントで直接解析または言及されていないものも含め、幅広いオンチェーンアクティビティを追跡できます。

追跡できるイベントの例は次のとおりです。

  • 特定のSPLトークンのトークン転送
  • 新しいプログラムのデプロイ
  • Raydiumプールの作成または流動性の追加
  • ガバナンス提案の作成または投票
  • Metaplexキャンディマシンのローンチ
  • Serumマーケットの作成

このテンプレートを活用すれば、DeFiプロトコルのイベントやウォレットアクティビティの追跡をはじめ、Solanaを監視するさまざまなTelegramボットを作成できます。

ここまでお読みいただき、ありがとうございます。このガイドが、独自のSolana Telegramボットを作成する第一歩になれば幸いです。Solanaの最新情報を見逃さないよう、ぜひニュースレターにご登録ください。さらに詳しく知りたい場合は、Heliusブログの最新記事をご覧になり、今すぐSolanaの旅を続けましょう。

その他のリソース

  1. Heliusドキュメント
  2. Cloudflare Workersドキュメント
  3. Telegram Bot API
  4. Honoドキュメント

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます

拡大画像