如何设置 Solana Telegram 机器人
Solana 区块链上每秒大约发生 400 笔交易。这些交易包括代币转移、NFT 销售、代币交换、竞标、DAO 投票、投注等等。但是面对如此多的数据,您如何跟踪您关心的变化?这就是 webhook 的作用所在。Webhook 允许您跟踪这些变化并随时了解您关心的事情。本指南将向您展示如何设置 Telegram 机器人,以便使用 Cloudflare 工作器将链上更新直接发送给用户或频道 。

设置 Telegram 机器人的步骤
设置 Telegram 频道和 Telegram 机器人。
创建一个 Cloudflare 工作器,作为发送更新的 webhook 和 Telegram 机器人之间的连接。
创建 Helius webhook。
通过 Helius Webhook API 编辑 webhook 跟踪的地址。此步骤仅适用于跟踪整个 NFT 集合。
设置 Telegram 机器人
Telegram 机器人是自动执行某些任务(尤其是更新)的好方法。以下是设置步骤。
与 BotFather 开始对话:在 Telegram 搜索栏中搜索“BotFather”,然后单击它即可开始对话。
创建新机器人:输入并发送“/newbot”。BotFather 现在将指导您命名机器人并为其指定用户名。
访问令牌:完成后,BotFather 将提供访问令牌。请安全地记下它,因为我们稍后将在本教程中使用它。
对于频道更新:
创建电报频道:转到菜单(☰)并选择“新频道”。
邀请机器人:设置好频道后,点击频道名称,选择“管理员”,然后添加您的机器人。
查找聊天 ID:
要确定您频道的聊天 ID,请按以下步骤操作:
发送消息:首先,向您创建的频道发送消息。
使用 Telegram API:在浏览器中导航到https://api.telegram.org/bot<YOUR_BOT_TOKEN> /getUpdates,将<YOUR_BOT_TOKEN>替换为您从 BotFather 收到的令牌。
找到聊天 ID:在返回的数据中,您会发现一个名为聊天的字段,里面有一个id,它是您频道的聊天 ID。
请记住安全地记下此聊天 ID,因为您将需要它进行进一步的配置。
创建 Cloudflare 工作器
Cloudflare 工作者允许您部署在线托管且将永久运行的代码,以便不断警惕来自您的 Web 挂钩的更新。
登录 Cloudflare:首先登录您的 Cloudflare 帐户。如果您还没有帐户,可以免费注册。
访问 Workers 部分:从 Cloudflare 仪表板,导航到“Workers”选项卡。
创建新的 Worker:点击“创建 Worker”按钮。这将带您进入 Worker 编辑器。

编辑工人代码:
在编辑器中,您将看到一个脚本模板。将默认代码替换为您的 Telegram 机器人提供的 Cloudflare 代码。
在代码中找到BOT_TOKEN和CHAT_ID的变量。这些是占位符,将用于通过您的机器人将消息发送到正确的聊天。
配置环境变量:
在 Cloudflare Workers 仪表板中,导航到您的工作器的“设置”选项卡。
在这里,您可以添加机器人的令牌、聊天令牌和 Helius API 密钥作为环境变量。这有助于将敏感数据排除在主代码之外并确保其安全。
确保正确命名这些环境变量以匹配代码中的预期(例如,BOT_TOKEN,CHAT_ID等)。
部署 Worker:确保代码和环境变量设置正确后,点击“保存并部署”按钮。您的 Worker 将被部署并分配一个唯一的公共 URL。
记下公共 URL:部署后,请务必记下分配给您的工作人员的公共 URL。您将使用此 URL 作为 Telegram 机器人的 webhook 端点。
Cloudflare Worker 代码:
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 来跟踪某个钱包进行的所有交易。
注册:访问dashboard.helius.dev并创建一个免费帐户。
创建 Webhook:在您的仪表板中,选择创建一个新的 webhook。您可以选择决定其类型 - 原始、增强、Discord 或帐户。对于特定分类的更新,建议使用“增强”。选择此项时,请指定您感兴趣的更新,例如NFT_SALES或NFT_LISTING。
提供 Worker 链接和 Solana 地址:确保您提供已部署 Cloudflare Worker 的链接。此外,请提及您希望监控的特定 Solana 帐户地址(可以是用户的钱包或集合中的铸币列表)。

如有不明白或者不清楚的地方,请加入官方电报群:https://t.me/gtokentool
最后更新于