X,或者更好地被称为 Twitter,是加密货币社区参与度最高的领先平台之一。作为实时更新的中心,Twitter 通常是最新区块链发展和新闻的发布地。加密推特机器人(X bots)的出现进一步丰富了用户体验,并在让用户了解情况和参与其中发挥着至关重要的作用——提供从跟踪加密货币价格变化到提供个性化内容的一系列功能。
在今天的教程中,我们将介绍如何构建您自己的 Twitter 机器人(X bot)来发布加密货币价格更新。具体来说,我们将设计一个机器人,根据交易量、各自的底价和 24 小时百分比变化发布排名前 5 的 NFT。
我们将使用以下 API:
CoinGecko API – 我们将利用 NFT 数据端点来获取 NFT 藏品的底价。
Twitter API v2 库 – 这是允许我们连接到 Twitter 并发推文所需的代码库。
如何构建加密货币价格 Twitter 机器人(4 个步骤)
我们将使用 Javascript 创建一个 Twitter 机器人,只需最少的编码知识。以下是步骤的快速概述:
从 CoinGecko API 获取 NFT 数据。
创建推文功能。
合并到一个 main() 函数中。
在服务器上部署并安排自动化。
让我们深入了解吧!
为了便于演示,我们将交替引用 Twitter 和 X 平台。
先决条件和要安装的软件包
对于本教程,您需要安装以下库:
轴
twitter-api-v2
计划任务
创建 npm 存储库后,您可以通过在终端中键入以下命令来安装它们。
npm install axios twitter-api-v2
步骤1:从CoinGecko API获取NFT数据
我们将首先导航至CoinGecko API 文档。以下两个端点将允许我们检索相关的 NFT 数据点:
/nft/list – 根据 24 小时美元交易量获取排名前 5 的 NFT 系列。
/nfts/{id} – 使用 (1) 中 NFT 的 id 获取每个 NFT 的单独底价和百分比 (%) 变化。
首先,我们定义一个数组 NftData,它将在全局范围内存储所有必需的数据(例如价格、变化百分比和名称),以便其他函数可以访问它。
let NftData = [];
填充后,数组应如下所示。
[
{
name: ‘Bored Ape Yacht Club’,
floor_price: 26.7,
native_currency_symbol: ‘ETH’,
floor_price_24h_change: 1.3282732447817835
},
{
name: ‘Pudgy Penguins’,
floor_price: 10.67,
native_currency_symbol: ‘ETH’,
floor_price_24h_change: -0.6335010247810696
}
]
然后,我们创建一个getTopNFT函数来执行 API 调用。这是代码的演练。
我们定义了一个本地数组topNFT来存储排名前 5 的 NFT,以便我们可以循环获取每个 NFT 的价格数据。
第一个调用/nfts/list获取当前按美元交易量排名前 5 名的 NFT。为了过滤这个,我们传入参数
订单=h24_volume_usd_desc
每页=5
页=1
然后我们将 5 个 NFT id 保存在topNFT数组中。
第二次调用/nfts/{id}以获取每个 NFT 的名称、价格、符号和 24 小时变化。我们将其嵌套在 for 循环中,以便我们可以获得所有 5 个 NFT 的数据。
然后我们将它们保存到NftData数组中。
async function getTopNFT() {
let topNFT = [];
const url = ‘https://api.coingecko.com/api/v3/nfts/list?order=h24_volume_usd_desc&per_page=5&page=1’;
await axios.get(url)
.then(function (response) {
topNFT = topNFT.concat(response.data.map(key => key.id));
})
.catch(function (error) { console.log(error) })
console.log(topNFT);
for (let i = 0; i < topNFT.length; i++) {
const url2 = ‘https://api.coingecko.com/api/v3/nfts/’ + topNFT[i];
await axios.get(url2)
.then(function (response) {
var x = response.data;
NftData.push({
“name”: x.name,
“floor_price”: x.floor_price.native_currency,
“native_currency_symbol”: x.native_currency_symbol,
“floor_price_24h_change”: x.floor_price_24h_percentage_change.native_currency
});
})
.catch(function (error) { console.log(error) })
}
}
第 2 步:创建推文功能
让我们首先使用以下代码初始化 Twitter 客户端:
const twitterApi = require(‘twitter-api-v2′);
// Initialize Twitter API client
const twitterClient = new twitterApi.TwitterApi({
appKey:’your-app-key’,
appSecret:’your-app-secret’,
accessToken: ‘your-access-token’,
accessSecret:’your-access-secret’,
});
// Read+Write level
const rwClient = twitterClient.readWrite;
要以编程方式发推文,您需要创建一个 Twitter 开发者帐户,该帐户将为您提供 appKey 等凭据 。
进入门户后,创建一个项目并在该项目下创建一个应用程序。单击项目页面,您将看到“应用程序”部分。只需单击此处的钥匙图标即可。
在下一页中,复制以下凭据(我们还指出了它们应映射到哪个字段)。
消费者钥匙
API 凭证 – 这是appKey
API 秘密 – 这是appSecret
认证密钥
访问令牌 – 这是accessToken
访问秘密 – 这是accessSecret
获得凭据后,是时候创建我们的推文功能了!这是代码的快速解释:
所有操作都发生在 try 块中。该函数应该接受一个输入 logMessages,其中包含一个数组,每个元素代表一行 NFT 价格数据。
async function tweetNFTPrices(logMessages) {
try {
} catch (error) {
console.error(‘Error posting tweet:’, error);
}
}
我们首先检查 logMessages 是否被传入并且它至少包含一个元素。
if (logMessages && logMessages.length > 0) {
}
接下来,我们通过添加页眉和页脚来格式化推文。
作为参考,这是我们将构建的最终消息,括号中是它们在代码中的引用。
(标题)
前 5 个 NFT 底价
(logMessageArray)
Bored Ape Yacht Club -> 26.7 ETH | ?↑ 1.1%
矮胖企鹅 -> 11.37 ETH | ?↑ 6.2%
小豆 -> 6.39 ETH | ?↑ 1.4%
突变猿游艇俱乐部 -> 5.09 ETH | ?↑ 2.3%
神神 -> 3.31 ETH | ?↑ 6.0%
(页脚)
24H %
#Coingecko #NFT
const header = ‘Top 5 NFT floor prices’; // Define your header here
const footer = ‘\n\n24H %\n#Coingecko #NFT ‘; // Define your footer here
以下代码在 for 循环中构造推文,将每一行NFT 数据添加 到推文中,如果超过推文字符限制则停止。如果停止,代码将继续,并且推文文本将一直显示到停止之前的位置。
// Join log messages while considering character limit
let combinedLogMessages = `${header}\n\n`;
let currentLength = combinedLogMessages.length;
const maxTweetLength = 280; // Maximum characters for a tweet
for (const message of logMessages) {
if (currentLength + message.length + footer.length <= maxTweetLength) {
combinedLogMessages += `${message}\n`;
currentLength += message.length;
} else {
break; // Break loop if exceeding character limit
}
}
然后它与页脚合并。
combinedLogMessages += footer;
最后,它使用rwClient.v2.tweet函数发送推文。消息应在对象的文本字段中传递。请记住添加await,因为它是一个异步函数。
await rwClient.v2.tweet({
text: combinedLogMessages,
});
将所有内容放在一起,tweetNFTPrices函数应如下所示。
async function tweetNFTPrices(logMessages) {
try {
if (logMessages && logMessages.length > 0) {
const header = ‘Top 5 NFT floor prices’; // Define your header here
const footer = ‘\n\n24H %\n#Coingecko #NFT ‘; // Define your footer here
// Join log messages while considering character limit
let combinedLogMessages = `${header}\n\n`;
let currentLength = combinedLogMessages.length;
const maxTweetLength = 280; // Maximum characters for a tweet
for (const message of logMessages) {
if (currentLength + message.length + footer.length <= maxTweetLength) {
combinedLogMessages += `${message}\n`;
currentLength += message.length;
} else {
break; // Break loop if exceeding character limit
}
}
combinedLogMessages += footer;
await rwClient.v2.tweet({
text: combinedLogMessages,
});
console.log(‘Tweeted the post:’, combinedLogMessages); //You can print it in console for cross checking
} else {
console.error(‘Error: logMessages array is empty or undefined.’);
}
} catch (error) {
console.error(‘Error posting tweet:’, error);
}
}
这样,您就可以通过代码在 Twitter 上发布加密货币价格更新了!
第 3 步:合并到一个 Main() 函数中
main () 函数整合并执行上述所有步骤,即获取必要的价格数据,对其进行格式化,然后将其发送出去。让我们一步一步地分解它。
首先,我们调用 getTopNFT() 来获取 NFT 数据。
//Get the data
await getTopNFT();
然后,将必要的 NFT 数据填充到 NftData 数组中,我们将进一步格式化它并将其保存到 logMessagesArray 数组中。
对于每个 NFT(使用 for 循环),将 24 小时底价变化修剪至小数点后 1 位。
const formattedChange = parseFloat(floor_price_24h_change).toFixed(1);
根据 24 小时的变化,添加绿色/红色/黑色表情符号和向上/向下箭头以获得更好的可视化效果。
if (floor_price_24h_change > 0) {
changeSymbol = ‘?\u{2191}’; // Green arrow up emoji
} else if (floor_price_24h_change < 0) {
changeSymbol = ‘?\u{2193}’; // Red arrow down emoji
} else {
changeSymbol = ‘⚫️’; // Black circle emoji for no change
}
将每条 NFT 价格数据线的最终形式构建为‘Bored Ape Yacht Club -> 26.7 ETH | ?↑ 1.13%’ 并将其添加到logMessagesArray数组中。
const logMessage = `${name} -> ${floor_price} ${native_currency_symbol} | ${changeSymbol} ${formattedChange}%`;
logMessagesArray.push(logMessage); // Push each log message to the array
最后,将logMessagesArray传递到我们在步骤 2 中创建的tweetNFTPrices函数中。然后它将触发推文,然后 violà – 您已经让您的 Twitter 机器人发推文了!
try {
await tweetNFTPrices(logMessagesArray);
} catch (error) {
console.error(‘Error posting tweet:’, error);
}
这是函数的合并。
async function main() {
//Get the data
await getTopNFT();
//Format tweet
const logMessagesArray = [];
for (let i = 0; i < NftData.length; i++) {
const { name, floor_price, native_currency_symbol, floor_price_24h_change } = NftData[i];
let changeSymbol = ”;
// Limiting floor_price_24h_change to 1 decimal place
const formattedChange = parseFloat(floor_price_24h_change).toFixed(1);
if (floor_price_24h_change > 0) {
changeSymbol = ‘?\u{2191}’; // Green arrow up emoji
} else if (floor_price_24h_change < 0) {
changeSymbol = ‘?\u{2193}’; // Red arrow down emoji
} else {
changeSymbol = ‘⚫️’; // Black circle emoji for no change
}
const logMessage = `${name} -> ${floor_price} ${native_currency_symbol} | ${changeSymbol} ${formattedChange}%`;
logMessagesArray.push(logMessage); // Push each log message to the array
}
console.log(logMessagesArray); // Log the entire array after the loop finishes
//Tweet it out
try {
await tweetNFTPrices(logMessagesArray);
} catch (error) {
console.error(‘Error posting tweet:’, error);
}
}
第 4 步:在服务器上部署并安排自动化
最后,为了以设定的时间间隔定期运行脚本,而不必每次都手动触发它,我们需要将其部署到服务器并设置调度程序。
如果尚未安装 node-cron 软件包,请安装:
npm install node-cron
要每天 00:00 运行此脚本,我们可以简单地将其包装在main()周围。
// Schedule the script to run every 24 hours
cron.schedule(‘0 0 * * *’, async () => {
console.log(‘Running script every 24 hours…’);
try {
await main(); // Call your main function here
} catch (error) {
console.error(‘Error running main function:’, error.message);
}
});
如果您想每 5 分钟运行一次,这里是另一个示例,尽管不建议这样做,因为我们不应该在 Twitter/X 上发布重复的内容。
// Wrap your main function call in a cron job that runs every 5 minutes
cron.schedule(‘*/5 * * * *’, async () => {
console.log(‘Running script every 5 minutes’);
try {
await main(); // Call your main function here
} catch (error) {
console.error(error.message);
}
});
}
要远程运行脚本,您可以根据您的喜好将此脚本部署到任何云服务器。有多种选项可供选择,从 AWS EC2、GCP、Digital Ocean 和 Linode 等自管理服务器到 Heroku、Azure 或 AWS Elastic Beanstalk 等提供简化部署工作流程的平台即服务 PaaS。此外,您还可以使用屏幕会话在虚拟专用服务器的后台运行脚本。
要在本地运行脚本,只需在终端中输入以下命令:
node your_script_name.js
这是从一开始就将所有内容放在一起的脚本,供您参考。
const axios = require(‘axios’);
const twitterApi = require(‘twitter-api-v2’);
const cron = require(‘node-cron’);
// Initialize Twitter API client
const twitterClient = new twitterApi.TwitterApi({
appKey:’your-app-key’,
appSecret:’your-app-secret’,
accessToken: ‘your-access-token’,
accessSecret:’your-access-secret’,
});
// Read+Write level
const rwClient = twitterClient.readWrite;
// Json array to store NFT data such as price, % change
let NftData = [];
async function getTopNFT() {
let topNFT = [];
const url = ‘https://api.coingecko.com/api/v3/nfts/list?order=h24_volume_usd_desc&per_page=5&page=1’;
await axios.get(url)
.then(function (response) {
topNFT = topNFT.concat(response.data.map(key => key.id));
})
.catch(function (error) { console.log(error) })
console.log(topNFT);
for (let i = 0; i < topNFT.length; i++) {
const url2 = ‘https://api.coingecko.com/api/v3/nfts/’ + topNFT[i];
await axios.get(url2)
.then(function (response) {
var x = response.data;
NftData.push({
“name”: x.name,
“floor_price”: x.floor_price.native_currency,
“native_currency_symbol”: x.native_currency_symbol,
“floor_price_24h_change”: x.floor_price_24h_percentage_change.native_currency
});
})
.catch(function (error) { console.log(error) })
}
}
async function tweetNFTPrices(logMessages) {
try {
if (logMessages && logMessages.length > 0) {
const header = ‘Top 5 NFT floor prices’; // Define your header here
const footer = ‘\n\n24H %\n#Coingecko #NFT ‘; // Define your footer here
// Join log messages while considering character limit
let combinedLogMessages = `${header}\n\n`;
let currentLength = combinedLogMessages.length;
const maxTweetLength = 280; // Maximum characters for a tweet
for (const message of logMessages) {
if (currentLength + message.length + footer.length <= maxTweetLength) {
combinedLogMessages += `${message}\n`;
currentLength += message.length;
} else {
break; // Break loop if exceeding character limit
}
}
combinedLogMessages += footer;
await rwClient.v2.tweet({
text: combinedLogMessages,
});
console.log(‘Tweeted the post:’, combinedLogMessages);
} else {
console.error(‘Error: logMessages array is empty or undefined.’);
}
} catch (error) {
console.error(‘Error posting tweet:’, error);
}
}
async function main() {
//Get the data
await getTopNFT();
//Format tweet
const logMessagesArray = [];
for (let i = 0; i < NftData.length; i++) {
const { name, floor_price, native_currency_symbol, floor_price_24h_change } = NftData[i];
let changeSymbol = ”;
// Limiting floor_price_24h_change to 1 decimal place
const formattedChange = parseFloat(floor_price_24h_change).toFixed(1);
if (floor_price_24h_change > 0) {
changeSymbol = ‘?\u{2191}’; // Green arrow up emoji
} else if (floor_price_24h_change < 0) {
changeSymbol = ‘?\u{2193}’; // Red arrow down emoji
} else {
changeSymbol = ‘⚫️’; // Black circle emoji for no change
}
const logMessage = `${name} -> ${floor_price} ${native_currency_symbol} | ${changeSymbol} ${formattedChange}%`;
logMessagesArray.push(logMessage); // Push each log message to the array
}
console.log(logMessagesArray); // Log the entire array after the loop finishes
//Tweet it out
try {
await tweetNFTPrices(logMessagesArray);
} catch (error) {
console.error(‘Error posting tweet:’, error);
}
}
// Schedule the script to run every 24 hours
cron.schedule(‘0 0 * * *’, async () => {
console.log(‘Running script every 24 hours…’);
try {
await main(); // Call your main function here
} catch (error) {
console.error(‘Error running main function:’, error.message);
}
});
最终产品:加密货币价格 Twitter 机器人
通过 4 个简单的步骤,我们创建了一个自动加密货币价格 Twitter 或 X 机器人,可以按交易量发布当前排名前 5 的 NFT 系列,以及它们的底价和价格变化百分比(请在 Twitter/X 上查看其实际操作: https: //twitter.com/nft_listing_bot )。
潜在的增强功能和专业提示
为了方便本教程,我们创建了一个简化的加密货币价格 Twitter/X 机器人。然而,这里有一些潜在的改进领域:
通过构建推文线程来解决 Twitter/X 的字符限制。 如果一个或多个长 NFT 名称导致推文被截断,则单个推文的字符限制可能会被打破。作为一个潜在的增强功能,您还可以检查字符限制并使用tweetThread方法将其作为线程发布。这确保您始终可以发布完整的 NFT 数据,而不受字符限制的限制。
使用付费专属CoinGecko API端点,使API调用更加高效。 本教程对 2 个可公开访问的不同 API 端点进行 6 次调用。或者,您实际上可以使用我们的付费计划中提供的/nfts/markets端点获取相同的数据 。
结论
有了正确的 API,构建 Twitter 机器人或 X 机器人比听起来要简单得多——即使对于编码知识最少的个人来说也是如此。总而言之,该过程涉及从 CoinGecko API 检索加密货币价格数据、建立 tweet 函数、整合 main() 函数中的功能,最后在具有调度自动化功能的服务器上部署机器人。可以使用其他端点进一步复制此过程,以创建不同类型的 Twitter 或 X 机器人来发布不同的数据。