首页 > 解决方案 > 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();

标签: node.jsheroku

解决方案


由 Heroku 支持解决!这让我发疯了。我想我会分享支持答案,以防其他人遇到这个问题。我认为我阅读的 Twitter 机器人教程没有这个问题的原因是他们的机器人也在做其他事情,比如回复主题标签、关注者或发送给他们的机器人的推文。或者他们setInterval用来发推文,这使应用程序不断运行。

我遵循了这个建议,它一直运行良好。

崩溃的原因是您没有在工作人员测功机上运行进程,您只是发出推文并退出的命令,heroku web 和工作人员测功机旨在处理长时间运行的任务,因此您的工作人员正在启动,发出一条推文然后突然退出并崩溃,导致我们检测到崩溃并启动一个新的工作人员,它只是在循环中循环执行相同的操作。

如果您只想运行预定的推文,您可以删除您的 Procfile 并缩减您的网络和工作人员 dyno,调度程序将在您安排它时启动一个单独的一次性 dyno,这将为您运行您的推文脚本并退出.


推荐阅读