如何用 17 行代码构建一个简单的 Twitter 机器人
几个月前,我创建了一个 Twitter 机器人,它可以转发指定用户列表中的任何内容。你猜怎么着?它只有 17 行代码。我分享这个是因为我觉得网上服务商对一个简单的机器人创建工具至少收费 15 美元,这太疯狂了,而你完全可以自己开发一个。所以,你准备好了吗?
以下是我们构建机器人时要用到的东西:
- Node.js — 在https://nodejs.org/en/上安装
- twit — 用于 Node 的 Twitter API 客户端(相信我,它就是 twit)。https ://github.com/ttezel/twit
啊,基本上就是这样。
创建应用程序
在开始编写代码之前,我们必须先设置我们的 Twitter 应用。你可以在https://apps.twitter.com/上进行设置。点击“创建新应用”按钮,你将看到以下内容:
填写信息。如果您没有网站信息,可以直接填写https://www.example.com。
创建应用程序后,在“密钥和访问令牌”选项卡中,有 4 项重要事项需要注意:
- 消费者密钥
- 消费者秘密
- 访问令牌密钥
- 访问令牌秘密
如果您没有看到“访问令牌密钥”和“访问令牌秘密”,只需单击“创建我的访问令牌”按钮即可完成设置。
初始化项目
打开 CMD 或终端并将 cd 转到 Twitter 机器人的新目录并执行以下命令:
npm init
并填写信息。接下来,我们需要安装适当的依赖项,在本例中只有一个:
npm install twit --save
现在在该目录中创建一个名为 index.js 的文件。
注意:如果您在运行时更改了入口点npm init
,请确保文件名与您输入的内容匹配package.json
。如果您没有更改任何内容,那么不用担心,只需调用它即可index.js
。
有趣的部分
打开一个空白的文本编辑器,创建一个 Twit 实例,用于向 Twitter 的 API 发出请求。配置对象的形式如下:
var Twit = require('twit')
var T = new Twit({
consumer_key: ' ... ',
consumer_secret: ' ... ',
access_token: ' ... ',
access_token_secret: ' ... ',
})
将 替换' ... '
为您的消费者密钥和访问密钥。
现在创建一个数组,用于保存您想要转发的用户的字符串 ID(您可以更改我在下面代码片段中输入的 ID):
var users = ["10228272", "155659213", "783214"];
现在我们要创建一个如下形式的流T.stream(path, [params])
:
var stream = T.stream('statuses/filter', {follow: users});
请注意,在第二个参数中,我们将键的follow
值设置为变量users
。
现在,我们将在触发事件 tweet 时监听该流:
stream.on('tweet', function (tweet) {
if (users.indexOf(tweet.user.id_str) > -1) {
console.log(tweet.user.name + ": " + tweet.text);
T.post('statuses/retweet/:id', { id: tweet.id_str }, function (err, data, response) {
console.log(data)
})
}
})
每次有状态(推文)进入流时,都会触发此函数。第 2 行是必需的,以确保刚刚发推文的用户 ID 存在于数组中users
。
第 4 行基本上使用 twit 转发该推文,并附加一个id
of 属性tweet.id_str
。如果您想查看 tweet 对象还有哪些其他属性,可以访问:https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/tweet-object
让我们运行机器人吧!
基本上就是这样,你用 17 行代码创建了你的第一个 Twitter 机器人!要运行它,只需在 CMD 或终端中执行以下命令:
node index.js
未来更新
我稍后会写另一篇文章,解释如何将您的机器人部署到 Heroku,这样您就不必全天候在本地系统上运行它。
最终代码
var Twit = require('twit')
var T = new Twit({
consumer_key: ' ... ',
consumer_secret: ' ... ',
access_token: ' ... ',
access_token_secret: ' ... ',
})
var users = ["10228272", "155659213", "783214"];
var stream = T.stream('statuses/filter', {follow: users});
stream.on('tweet', function (tweet) {
if (users.indexOf(tweet.user.id_str) > -1) {
console.log(tweet.user.name + ": " + tweet.text);
T.post('statuses/retweet/:id', { id: tweet.id_str }, function (err, data, response) {
console.log(data)
})
}
})