使用 JavaScript 创建 Twitter 机器人
两个月前,我开始了我的 100DaysOfCode 之旅,重新开始使用 Twitter。每天分享我的学习进度时,我对那些点赞和转发我帖子的机器人感到好奇。最终,我决定自己创建一个 Twitter 机器人,并尝试使用 Twitter API 进行实验。
让我们一步一步地了解整个过程。在开始之前,我们先来了解一下 Twitter API。
Twitter API
Twitter 允许您通过机器人帐户以编程方式执行许多操作。
它有不同版本和层次的 API
- Twitter API v2
- Twitter API - 企业版
- Twitter API - 高级版 v1.1
- Twitter API - 标准 v1.1
- Twitter 广告 API
我们免费获得并将在本教程中使用的是标准 v1.1和v2
v1.1 是标准 API,v2 是其基础上的一些附加方法。
流行的方法和用途
-
搜索推文
- GET /2/tweets/search/recent - 仅在最近的推文中搜索并返回指定数量的结果。
-
状态更新
- POST /1.1/statuses/update - 接受状态文本并从 Bot 帐户发送推文。
-
转发
- POST /1.1/statuses/retweet/:id - 使用 Bot 帐户提供的 id 转发推文。
我们将使用这三个 API,但还有很多其他用途。例如,机器人可以搜索自己的推文、取消转发、删除旧推文、创建收藏等等。
查看整个API 参考以获取更多详细信息。
一旦你确定了要构建的内容以及要使用的 API,就可以开始构建了。首先,我们要申请一个开发者账号。
申请开发者账号
先决条件 - 您需要拥有一个 Twitter 帐户。您可以使用自己的帐户,也可以为您的机器人创建一个新的 Twitter 帐户。无论您使用哪个帐户,都需要您提供已验证的电子邮件 ID 和电话号码。
遵循的步骤
- 登录 Twitter 帐户
- 申请开发者访问权限 - 使用链接进入申请流程
- 填写申请表 - 它会询问您有关应用程序用途的问题,如果尚未验证,则验证您的电话号码和电子邮件,并回答一些有关如何使用开发者帐户的问题。
完成流程后,您将看到一个仪表板,表示已获批准。通常情况下,批准是即时的。
创建应用程序并获取安全令牌
- 在仪表板上,如果我们想使用 API v2,首先需要创建一个项目。单击“创建项目”并为其命名。
- 项目创建完成后,您将看到一个“创建应用程序”按钮。单击它即可开始创建您的第一个应用程序。
- 输入应用名称,然后点击“下一步”。您将进入“密钥和令牌”部分,其中将显示API 密钥、API 密钥密码和 Bearer 令牌。复制这些值并妥善保管。
- 单击下一步创建应用程序。
- 创建应用程序后,您将进入仪表板。您将看到您的应用程序显示出来。点击旁边的“设置”图标。
-
编辑“应用权限”部分。默认情况下,您的应用仅具有读取权限,我们将授予其读写权限,使其能够发送推文。如果您还需要使用私信功能,也可以启用该功能。
-
- 消费者密钥 - 点击“重新生成”。复制出现的密钥和密码。您无法再次查看它们,只有在忘记时才可以重新生成。
- 身份验证令牌 - 用于与关联的用户帐户进行交互。重新生成这两个部分。复制并保存创建的值。
至此,我们的配置已全部设置完毕。我们保存了一些密钥和令牌。现在,我们来看看身份验证是如何进行的。
验证
我不会深入讲解 OAuth,而是会解释在哪种情况下需要使用哪种密钥和令牌。您不需要了解更多。因此,如果您不熟悉身份验证标头,可以暂时忽略这些令人困惑的术语。等我们编写代码时,这些术语会更加清晰。
- 应用身份验证- 您正在对您的应用进行身份验证,以便向 Twitter API 发出请求。我们需要遵循以下两种方式之一。这两种方式都将使用我们在创建应用时创建的密钥/令牌。
- 选项 1:API 密钥和 API 密钥秘密 - 使用 OAuth1.0,将 API 密钥和 API 密钥添加到授权标头中
- 选项 2:Bearer Token - 使用 OAuth2.0,在授权标头中添加 Bearer 令牌。
- 用户身份验证- 授权您的应用使用已连接的用户帐户发布推文/进行更改。这里我们将使用以下 4 个值,这些值是我们授予应用为该帐户写入权限时生成的。
- 消费者密钥
- 消费者秘密
- 访问令牌
- 访问令牌秘密
例如,
- 在搜索推文时,只需要应用程序身份验证,因此我们只需使用 Bearer Token。
- 在执行状态更新时,需要进行用户身份验证,因此我们将使用上面提到的 4 个值。
开发环境
我将在 Github 上托管该 repo,并使用 Repl 作为我的 IDE 和运行时环境。
如果你是 Repl 新手,这里有一个快速入门指南
Repl 对于您的机器人来说不是强制性的,您还可以在浏览器和其他部署环境(如 Heroku、Netlify、AWS、Azure 等)中使用离线 IDE/VS Code。因此,选择您觉得合适的即可。
我将使用 Repl 来演示这一点,即使在使用 Azure 多年之后,我仍然发现 Repl 非常适合这个小项目。它完全免费,提供了存储环境变量的简便方法,并在浏览器中运行应用程序。
通过执行以下步骤开始
- 创建一个 repo。
- 在您的 IDE 中导入 repo。
- 初始化一个新的 Node 项目 - 我使用
npm init
。填写所需的值。
Twitter-Lite 库
虽然库并不重要,并且所有 API 调用都可以通过通用的 GET 和 POST 请求进行,但它会为您处理所有样板代码和授权标头,并帮助您专注于应用程序逻辑。
让我们将库安装为依赖项
npm install twitter-lite
让我们编写代码
我们要做什么?
- 从用户列表中获取最近的推文。
- 从该列表中找出最热门的推文。
- 转发或引用推文与他人分享。
创建 API 客户端
经过身份验证的应用程序客户端
const app = new TwitterLite({
version: "2",
extension: false,
bearer_token: process.env.BEARER_TOKEN
})
定义参数:
- 版本 - 默认值为 1.1。我将其设置为 2,因为我将使用 API v2 方法。
- 扩展 - 对于 v2 为 false。对于 v1.1 默认为 true
- bearer_token - 我们上面为应用程序保存的 Bearer 令牌。
通过此客户端,应用程序可以调用所有不会从用户帐户进行更改的 v2 API 端点。
已验证用户的客户端
const user = new TwitterLite({
access_token_key: process.env.ACCESS_TOKEN,
access_token_secret: process.env.ACCESS_SECRET,
consumer_key: process.env.CONS_KEY,
consumer_secret: process.env.CONS_SECRET
})
参数:
- 我们上面保存的用于用户身份验证的身份验证参数。
- 请注意,由于我们将使用 v1.1 标准 API 发推文,因此不需要版本和扩展参数。
搜索最近的推文
搜索查询的示例如下
(from:username1 OR from:username2 OR from:username3) -is:reply -is:retweet
此查询获取来自三个用户的推文,但不包括回复或转发的推文。
有关创建查询的具体步骤,请参阅 GitHub 仓库。(链接如下)
参数:
{
start_time: '2021-09-15T03:10:41.161Z',
max_results: 10,
'tweet.fields': 'public_metrics',
expansions: 'author_id',
'user.fields': 'id,username',
query: '(from:username1 OR from:username2 OR from:username3) -is:reply -is:retweet'
}
参数:
- 开始时间 - 需要获取最近推文的时间戳
- 最大结果数 - 返回的结果数。默认值为 10-100。每月可检索的推文数量有限制,因此请根据实际情况选择数量。
tweet.fields: 'public_metrics'
- 将返回诸如喜欢、评论、转发以及推文文本等指标。- user.fields -
user.fields
将返回发布推文的用户的用户对象 - 我只指定了 id 和用户名。 expansions: author_id
。用户数组和推文数组将会分开。Tweetauthor_id
对象的作用类似于外键,与id
用户对象的字段相链接。
调用 API
const {meta, data, includes} = await app.get('tweets/search/recent' , params)
使用应用程序客户端。
该调用返回三个对象
- meta - 元数据,例如返回的结果数量。
- 数据 - 推文数组
- 包括 - 相关对象,如用户数组。
下一步是根据公开指标从这些推文中找出最佳推文。只需进行简单的数学运算和比较即可。具体操作请参考代码。
我们最终需要的是tweet id
最佳username
推文的
转发/引用推文
机器人会根据开关或概率,随机选择转发或引用推文。Math.random()
逻辑很简单。
让我们看看 API 调用。
引用推文
const {data} = await user.post('statuses/update', {status: status})
这里的状态是将被发送的推文文本。它还会包含指向被引用推文的链接。这是代码库中需要解决的另一个问题。
转推
const {data} = await user.post('statuses/retweet/'+ id)
就这么简单 -id
这是我们之前找到的最佳推文 ID。
就是这样。现在每次我们的代码运行时,它都会找到来自特定用户的 10 条最新推文,并分享其中最好的一条。
现在让我们看一些支持细节。
环境变量
所有 token 和用户列表都保存为环境变量。出于安全考虑,不应将它们放入代码中。
我使用了 Repl Secrets 来完成这项任务。您可以选择您环境提供的任何方式。
部署你的机器人并保持其运行
实现这一点的方法有很多。机器人开发者常用的一种方法是将其部署到 Heroku 上,并使其按预定的时间戳运行。AWS Lambda 和 Azure Functions 也可以实现同样的功能。
我的方法是把它保留在 Repl 本身上。不知道这种方法有多流行,但我还是分享一下步骤:
- 将代码保留在 Repl 上。
-
配置运行按钮 -文档。
- 将 .replit 文件添加到您的 Repl
- 添加语言和命令
language = "bash" run = "node index.js"
-
定期运行它 - 这是有趣的部分。
- 触发 Repl 的一个简单方法是访问其 URL https://repl-name.username.repl.co/
- 我将把这个 URL 放入监视器中,监视器将按照定义的时间间隔对该 URL 进行健康检查。
- UptimeRobot 是推荐的解决方案,但它在短时间间隔内对我来说运行不太顺利。
- 最终选择了免费增值工具 - https://www.easycron.com/
- 仍在使用免费套餐。最终可能会切换。
就这样。现在机器人每小时运行一次,找到一条新推文分享。前提是用户在该小时内发过推文。由于我的用户列表很长,所以很少会错过。
感谢您阅读本文。
代码在Github上
如果您想联系我并打个招呼,请关注我的Twitter 。
哦,等等!这个机器人也在推特上。快来看看它怎么样了。
鏂囩珷鏉ユ簮锛�https://dev.to/abh1navv/creating-a-twitter-bot-with-javascript-and-repl-it-1gbf