Подтвердить что ты не робот

Использование twitter API иногда возникает ошибка

Я использую следующий код, который работает иногда, но его неустойчивый, когда я запускаю программу, иногда я получал ошибку 420 с ошибкой json parse, которая не дает вам много подсказок, как ее решить. любая идея, что я делаю неправильно?

Ошибка:

Ошибка получения твитов: Ошибка: Код состояния: 420 Ошибка при получении твитов: SyntaxError: Неожиданный токен E в JSON в позиции 0

var Twitter=require('twitter');
var lclconf = require('../config.json');


var client=new Twitter({
  consumer_key: lclconf.twitter.consumer_key,
  consumer_secret: lclconf.twitter.consumer_secret,
  access_token_key: lclconf.twitter.access_token_key,
  access_token_secret: lclconf.twitter.access_token_secret
});
stream.on("data", function(data){
  console.log(data.id_str);
  var tweet_id="https://api.twitter.com/1.1/statuses/oembed.json?id="+data.id_str;
  request.get(tweet_id)
  .end(function(err,res){
      if(err){
        console.log("Error from Twitter API: " + err);
      }else{
        //console.log(res.body);
        io.emit('tweet',res.body);
      }
  });
});
stream.on('error', function(err){
  console.log("Error getting tweets: "+err);
});
io.on('connection', function(client){
  client.on("join", function(data){
    console.log(data);
  });
  client.emit("join",{"message":"running"});
});

Возможно, если есть способ, что при возникновении ошибки игнорировать его и продолжать с этого момента, процесс прекращается.

Update:

В twitter docs есть информация об HTTP 420, но не уверен, как ее исправить...

4b9b3361

Ответ 1

В соответствии с ответом pii_ke вы должны просто изменить tweet_id следующим образом:

var tweet_id = "https://publish.twitter.com/oembed?url=https://twitter.com/" + data.user.screen_name + "/statuses/" + data.id_str;

Полный модифицированный код, который вы можете скопировать в папку:

var Twitter=require('twitter');
var lclconf = require('../config.json');


var client=new Twitter({
  consumer_key: lclconf.twitter.consumer_key,
  consumer_secret: lclconf.twitter.consumer_secret,
  access_token_key: lclconf.twitter.access_token_key,
  access_token_secret: lclconf.twitter.access_token_secret
});
stream.on("data", function(data){
  console.log(data.id_str);
  var tweet_id = "https://publish.twitter.com/oembed?url=https://twitter.com/" + data.user.screen_name + "/statuses/" + data.id_str;
  request.get(tweet_id)
  .end(function(err,res){
      if(err){
        console.log("Error from Twitter API: " + err);
      }else{
        //console.log(res.body);
        io.emit('tweet',res.body);
      }
  });
});
stream.on('error', function(err){
  console.log("Error getting tweets: "+err);
});
io.on('connection', function(client){
  client.on("join", function(data){
    console.log(data);
  });
  client.emit("join",{"message":"running"});
});

Ответ 2

HTTP 420 возвращается, когда вы ограничены в скорости.

Существует URL https://publish.twitter.com/oembed ресурса, который не ограничивается ни скоростью, ни требует аутентификации. Я думаю, что он возвращает то же, что ожидает ваша программа. Вы можете использовать это, если передаете параметр запроса url, имеющий ссылку на твит. Попробуйте сделать ссылку как:

"https://publish.twitter.com/oembed?url=https://twitter.com/"+data.user.screen_name+"/statuses/"+data.id_str

Для данных примера, возвращаемых Twitter, нажмите здесь