node.js - Node Twitter bot 在 Heroku 上不断崩溃
问题描述
作为一种尝试自学 Node 以及如何使用 Heroku 的方法,我决定创建一个简单的 Twitter 机器人,它应该每天发一次推文。
手动运行我的机器人时,一切都很好,它会发出应有的推文。一旦在 Heroku 上,甚至在我添加调度程序(每天运行一次我的机器人)之前,它就开始随机发送推文。我必须继续删除它们。我在日志中注意到,机器人不断崩溃并重新启动,这会触发推文。
我已经用谷歌搜索了几个小时,无法弄清楚为什么会发生这种情况。我是 Node 的新手,一般来说与服务器有关,所以我真的不知道如何从这一点上进行故障排除。
在找出导致我的机器人崩溃的原因方面,我将不胜感激。
(我应该注意,我确实在 Heroku 上将它设置为 a worker
,并且在我的. 中Procfile
。不确定这是否会有所不同。)
Heroku 日志:
2018-07-08T16:21:10.427313+00:00 heroku[worker.1]: Starting process with command `node bot.js`
2018-07-08T16:21:11.167238+00:00 heroku[worker.1]: State changed from starting to up
2018-07-08T16:21:15.159855+00:00 heroku[worker.1]: State changed from up to crashed
2018-07-08T16:21:15.056356+00:00 heroku[worker.1]: Process exited with status 0
2018-07-08T16:56:32.097321+00:00 heroku[worker.1]: State changed from crashed to starting
2018-07-08T16:56:36.064795+00:00 heroku[worker.1]: Starting process with command `node bot.js`
2018-07-08T16:56:36.789264+00:00 heroku[worker.1]: State changed from starting to up
2018-07-08T16:56:40.212853+00:00 heroku[worker.1]: State changed from up to crashed
2018-07-08T16:56:40.170153+00:00 heroku[worker.1]: Process exited with status 0
2018-07-08T17:08:08.000000+00:00 app[api]: Build started by user myemailaddress
2018-07-08T17:08:23.727988+00:00 app[api]: Deploy 852c8541 by user myemailaddress
2018-07-08T17:08:23.727988+00:00 app[api]: Release v17 created by user myemailaddress
2018-07-08T17:08:24.186005+00:00 heroku[worker.1]: State changed from crashed to starting
2018-07-08T17:08:24.000000+00:00 app[api]: Build succeeded
2018-07-08T17:08:26.514939+00:00 heroku[worker.1]: Starting process with command `node bot.js`
2018-07-08T17:08:27.156637+00:00 heroku[worker.1]: State changed from starting to up
2018-07-08T17:08:28.631772+00:00 heroku[worker.1]: Process exited with status 0
2018-07-08T17:08:28.723695+00:00 heroku[worker.1]: State changed from up to crashed
2018-07-08T17:08:28.725787+00:00 heroku[worker.1]: State changed from crashed to starting
2018-07-08T17:08:31.479079+00:00 heroku[worker.1]: Starting process with command `node bot.js`
2018-07-08T17:08:32.358515+00:00 heroku[worker.1]: State changed from starting to up
2018-07-08T17:08:33.922886+00:00 heroku[worker.1]: State changed from up to crashed
2018-07-08T17:08:33.878013+00:00 heroku[worker.1]: Process exited with status 0
2018-07-08T17:12:36.000000+00:00 app[api]: Build started by user myemailaddress
2018-07-08T17:12:48.895075+00:00 app[api]: Release v18 created by user myemailaddress
2018-07-08T17:12:48.895075+00:00 app[api]: Deploy 1fbb896c by user myemailaddress
2018-07-08T17:12:49.246800+00:00 heroku[worker.1]: State changed from crashed to starting
2018-07-08T17:12:49.000000+00:00 app[api]: Build succeeded
2018-07-08T17:12:53.635812+00:00 heroku[worker.1]: Starting process with command `node bot.js`
2018-07-08T17:12:54.327615+00:00 heroku[worker.1]: State changed from starting to up
2018-07-08T17:12:57.874384+00:00 heroku[worker.1]: State changed from up to crashed
2018-07-08T17:12:57.852555+00:00 heroku[worker.1]: Process exited with status 0
2018-07-08T17:35:48.475654+00:00 heroku[worker.1]: State changed from crashed to starting
2018-07-08T17:35:52.257156+00:00 heroku[worker.1]: Starting process with command `node bot.js`
2018-07-08T17:35:52.995975+00:00 heroku[worker.1]: State changed from starting to up
2018-07-08T17:35:56.888137+00:00 heroku[worker.1]: State changed from up to crashed
2018-07-08T17:35:56.871199+00:00 heroku[worker.1]: Process exited with status 0
机器人源代码: https ://github.com/meowwwls/words-of-tori-amos/blob/master/bot.js
const twit = require('twit');
const getVideo = require('./youtube');
const { getLyrics } = require('./lyricadder/lyrics');
const { randomNumber } = require('./helpers');
const config = {
consumer_key: process.env.consumer_key,
consumer_secret: process.env.consumer_secret,
access_token: process.env.access_token,
access_token_secret: process.env.access_token_secret
};
const Twitter = new twit(config);
const lyrics = getLyrics();
const tweetLyric = () => {
const random = randomNumber(lyrics.length);
const lyric = lyrics[random];
getVideo(lyric.song).then(response => {
const songHash = lyric.song.replace(/\s/g, '');
const tweet = {
status: `${lyric.lyric}\n${response} #ToriAmos #${songHash}`
};
Twitter.post('statuses/update', tweet, (err, data, response) => {
if (err) {
console.log(err);
}
});
});
};
tweetLyric();
解决方案
由 Heroku 支持解决!这让我发疯了。我想我会分享支持答案,以防其他人遇到这个问题。我认为我阅读的 Twitter 机器人教程没有这个问题的原因是他们的机器人也在做其他事情,比如回复主题标签、关注者或发送给他们的机器人的推文。或者他们setInterval
用来发推文,这使应用程序不断运行。
我遵循了这个建议,它一直运行良好。
崩溃的原因是您没有在工作人员测功机上运行进程,您只是发出推文并退出的命令,heroku web 和工作人员测功机旨在处理长时间运行的任务,因此您的工作人员正在启动,发出一条推文然后突然退出并崩溃,导致我们检测到崩溃并启动一个新的工作人员,它只是在循环中循环执行相同的操作。
如果您只想运行预定的推文,您可以删除您的 Procfile 并缩减您的网络和工作人员 dyno,调度程序将在您安排它时启动一个单独的一次性 dyno,这将为您运行您的推文脚本并退出.
推荐阅读
- razor - 身份的 site.css 文件位于何处?
- javascript - 在节点js中选择zip文件中的每个文件
- android - Android Studio 布局预览未显示设计
- asp.net-core - ASP.NET Core 2.1 - 是否应将 wwwroot 从源代码控制中排除?
- java - tomcat - HTTP 连接器 maxThreads / acceptCount 和 JDBC 池 maxActive 之间的比率
- android - Android 格式化日期并返回日期为 dd-MMM-yyyy
- azure - 部署 iOS 应用时 Azure AD B2C ApiEndpoint 混淆
- c++ - 创建具有给定尺寸的新位图并填充给定颜色
- c++ - g++ O1 不等于 O0 与所有相关的优化标志
- cookies - 您可以使用 asp.net 核心中间件添加 cookie 来请求吗?