javascript - Node 永远说程序正在运行,但证据表明没有

标签 javascript node.js twitter forever

我正在尝试使用 twit 运行一个简单的 Twitterbot图书馆和forever 。该机器人本质上是监视另一个 Twitter 帐户,并通过一些修改复制其推文。

我一直在记录从流 API 接收的推文,并记录所有错误。

但是,机器人通常会停止工作,同时不会记录任何错误,而 forever list 仍显示程序正在运行。

info:    Forever processes running
data:        uid  command         script forever pid   id logfile                        uptime        
data:    [0] QOmt /usr/bin/nodejs bot.js 13642   13649    /home/ubuntu/.forever/QOmt.log 0:5:25:34.733

起初,我认为这可能是 twitter 流 API 的问题 - 即,信息已停止“沿着管道”发送,因为日志文件已停止记录来自 twitter 流 API 的新消息。

为了验证机器人确实仍在运行,我创建了一个每分钟记录一次的心跳

// Heartbeat to make sure the process is still running
setInterval(function () {
  console.logWithDate('Program heartbeat');
}, 60*1000);

当机器人停止运行时,心跳也会停止记录。然而永远仍然表示机器人正在运行。

任何帮助将不胜感激。我在下面发布了我的机器人的完整代码,以防它有用。

#!/usr/bin/env node
"use strict"

const fs = require('fs');
const util = require('util');
const Twit = require('twit');

// Logging
const error_log_file = fs.createWriteStream(__dirname + '/debug.log', {flags : 'a'});
const log_stdout = process.stdout;

console.error = function(d) {
  error_log_file.write(util.format("\n%s> %s", new Date(), d) + '\n');
  log_stdout.write(util.format("\n%s> %s", new Date(), d) + '\n');
};

console.logWithDate = function(d) {
    log_stdout.write(util.format("\n%s> %s", new Date(), d) + '\n');
}

// Heartbeat to make sure the process is still running
setInterval(function () {
  console.logWithDate('Program heartbeat');
}, 60*1000);


// Read in twitter secrets file
const twitter_secrets = JSON.parse(fs.readFileSync("twitter_secrets.json"));


// Connect to twitter
const client = new Twit({
    consumer_key: twitter_secrets.TWITTER_CONSUMER_KEY,
    consumer_secret: twitter_secrets.TWITTER_CONSUMER_SECRET,
    access_token: twitter_secrets.TWITTER_ACCESS_TOKEN_KEY,
    access_token_secret: twitter_secrets.TWITTER_ACCESS_TOKEN_SECRET,
    timeouts_ms: 60*1000
});

// Main
const stream = client.stream('statuses/filter', {follow: 87818409});
stream.on('tweet', function(event) {
    if (event.user.id === 87818409) {
        console.logWithDate("Guardian tweet: " + event.text)
        client.post(
            'statuses/update',
            {status: misspellRandomWords(event.text)},
            function(error, tweet, response) {
                if (error) {
                    console.error(error);
                } else {
                    console.logWithDate("Bot tweet: " + tweet.text);  // Tweet body.
                    //console.log(response);  // Raw response object.
                }
            }
        );
    } else {
        console.logWithDate("Guardian-related tweet: " + event.text)
    }
});

// Log various types of messages for debugging
stream.on('limit', function(error) {
    console.error(error);
});

stream.on('disconnect', function(error) {
    console.error(error);
});

stream.on('error', function(error) {
    console.error(error);
});

stream.on('connect', function (conn) {
  console.logWithDate('connecting')
})

stream.on('reconnect', function (reconn, res, interval) {
  console.logWithDate('reconnecting. statusCode:', res.statusCode)
})


/* Helper functions */

function swapRandomLetters(word) {
    const limit = word.length;
    const iFirstLetter = Math.floor(Math.random() * limit);
    var iSecondLetter = Math.floor(Math.random() * limit);

    while (iFirstLetter === iSecondLetter) {
        iSecondLetter = Math.floor(Math.random() * limit);
    }

    let letters = word.split("");
    letters[iFirstLetter] = word[iSecondLetter];
    letters[iSecondLetter] = word[iFirstLetter];
    return letters.join("");
}

function isLink(word) {
    // Very crude URL check
    return word.substring(0,4) === "http";
}

function misspellRandomWords(sentence) {
    let words = sentence.split(" ");
    const limit = words.length;

    // Choose a first word, filtering out urls
    var iFirstWord = Math.floor(Math.random() * limit);
    while (isLink(words[iFirstWord]) || words[iFirstWord][0] === "@" ) {
        iFirstWord = Math.floor(Math.random() * limit);
    }

    // Choose second misspelled word, and make sure it isn't the first or an URL
    var iSecondWord = Math.floor(Math.random() * limit);
    while (isLink(words[iSecondWord]) ||
            iSecondWord === iFirstWord ||
            words[iSecondWord][0] === "@") {
        iSecondWord = Math.floor(Math.random() * limit);
    }

    words[iFirstWord] = swapRandomLetters(words[iFirstWord]);
    words[iSecondWord] = swapRandomLetters(words[iSecondWord]);

    return words.join(" ");
}

最佳答案

如果推文的所有单词都以 @ 开头,则会出现无限循环,从而阻塞主线程。

关于javascript - Node 永远说程序正在运行,但证据表明没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40954463/

相关文章:

javascript - JS 数组在子组内排序

JavaScript 多重自增变量解决方案

javascript - 没有名称或 ID 的 Selenium 单击按钮

html - 如何通过 html 文件显示 MySQL 数据库中的内容?

python - 轮询网络服务的最佳方式(例如,对于推特应用程序)

drupal - 在 drupal 7 网站中集成 twitter

javascript - 原型(prototype)对象/方法代码 - 不显示在控制台上

javascript - 使用议程安排电子邮件

javascript - JS ES6 类构造函数行为

c# - Tweetinvi 接收推文速度慢?备择方案?