怎么创建加密 Twitter 机器人

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 机器人来发布不同的数据。