Повторяющаяся ошибка статуса при публикации твита с использованием Twitter API

Я новичок в JavaScript и использую Node.js и Twitter API, чтобы научиться программировать. Я также использую пакет Twit NPM. Я пытаюсь создать «игру», в которой нужно твитнуть определенную фразу, чтобы начать. У меня есть функция, в которой, если конкретная фраза не отправлена ​​в твиттер учетной записи, учетная запись также отвечает, чтобы попробовать еще раз.

Встречается фраза или нет, эта функция срабатывает один раз. Однако что, если тот же пользователь снова попытается твитнуть фразу (соответствующую фразе или нет)? Как избежать дублирования ошибки статуса? Я не уверен, какой лучший подход здесь, поскольку он выходит за рамки моих знаний. Вот упрощенная версия кода, который возвращает ошибку повторяющегося статуса после того, как оба условия if были выполнены одним и тем же пользователем, а затем он снова пытается отправить твит:

var Twit          = require('twit');
var T             = new Twit(config);

// Start a stream for listening for @mentions
var stream = T.stream('statuses/filter', { track: ['@someusername'] });
stream.on('tweet', somePhrase);

function somePhrase(tweet) {

  var request = tweet.text;
  var trigger = /(?:[^"']|^)(\bsome phrase\b)(?!["'])/ig;
  var name    = tweet.user.screen_name;
  var nameID  = tweet.id_str;

  // check to see if the tweet does not meet the request trigger
  if (request != trigger) {

    var reply   = '@' + name + "try again";
    var params  = { status: reply };

  }
  // check to see if the request matches the request trigger
  if (request.match(trigger)) {

    var question = "what do you want to know?";
    var params = {
        status: question + ' @' + name,
        in_reply_to_status_id: nameID
    };
  }

  T.post('statuses/update', params, function(err, data, response) {
    if (err !== undefined) {
      console.log(err);
    } else {
      console.log('Tweeted: ' + params.status);
    }
  })
};

Это код ошибки, который возвращает API:

{ [Error: Status is a duplicate.]
  message: 'Status is a duplicate.',
  code: 187,
  allErrors: [ { code: 187, message: 'Status is a duplicate.' } ],
  twitterReply: { errors: [ [Object] ] },
  statusCode: 403 }

person mmryspace    schedule 01.05.2016    source источник


Ответы (1)


Twitter сравнивает текст поста с последними текстами, чтобы определить, является ли он дубликатом. Я не знаю, насколько строго это сравнение. Но одним из возможных способов обойти это может быть добавление чего-то уникального к каждому тексту статуса.

Полезным уникальным номером может быть счетчик количества сыгранных игр. Пример: «Что вы хотите знать? @jaime #0001»

Чтобы создать такой счетчик, вы можете использовать базу данных, но если вы не хотите использовать базу данных, вы можете использовать пакет Twit npm, чтобы получить число, которое вы использовали в своем последнем твите, и увеличить его. Таким образом, это всегда уникальный номер.

Вы также можете просто сгенерировать случайную строку для добавления, но это не очень хорошая практика.

Изменить: если длина символов не является проблемой (поскольку Twitter ограничением в 140 символов), вы можете просто добавить отметку времени UNIX, которая всегда будет уникальным числом. Это очень легко включить в объект Date().

person Gibryon Bhojraj    schedule 01.05.2016
comment
Я также задаюсь вопросом, можно ли уничтожить этот твит, чтобы попытаться снова его опубликовать? Не уверен, что это также обходной путь для ошибки дублирования статуса. - person mmryspace; 02.05.2016
comment
Похоже, это тоже должно работать, хотя это будет зависеть от Twitter. Вы можете найти идентификатор недавнего твита, который точно совпадает, сделать вызов T.post('statuses/destroy/:id') и вложить его в if(err.code==187). Затем, как только вы получите успешный ответ на этот звонок, сделайте публикацию снова, при необходимости, с тайм-аутом. - person Gibryon Bhojraj; 02.05.2016
comment
Я не могу сказать из документации в Твиттере, приведет ли вас к бану за постоянную попытку дублирования статуса или просто дублирующий твит не выйдет. Я склоняюсь к стилю счетчика или рандомизированному массиву ответов. Я надеюсь, что с множеством ответов люди не будут пытаться проводить стресс-тестирование со слишком большим количеством неправильных ответов, они просто сдадутся. - person mmryspace; 03.05.2016
comment
Судя по всему, отправка большого количества повторяющихся ответов и упоминаний считается спамом и подлежит бану. Правила Твиттера . Но я думаю, что, поскольку пользователи соглашаются и это не массовое упоминание, это не так проблематично. Дополнительную информацию можно найти в разделе Автоматизация раздела Рекомендации. - person Gibryon Bhojraj; 03.05.2016