2017-02-15 26 views
11

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

Ошибка:

Error getting tweets: Error: Status Code: 420 Error getting tweets: SyntaxError: Unexpected token E in JSON at position 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:

В твиттер документы есть информация о HTTP 420, но не уверен, как это исправить ...

ответ

3

Согласно pii_ke «s ответ вы должны просто изменить 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"}); 
}); 
+0

Спасибо, я попробовал, но у меня такой же erorr :(, любая другая идея? –

6

HTTP 420 is returned when you are being rate limited.

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

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

Для выборки данных, возвращаемых Twitter нажмите here

+0

Спасибо, но не знаете, как это сделать с вашим примером, можете ли вы предоставить пример с моим кодом? –

+0

Я не программирую в Javascript много. Я вижу, как создавать объекты 'Twitter' и' client' в вашем коде, но я не уверен в запросах объектов ',' stream' и 'io'. Если вы расскажете, как их создать, я могу что-то проверить. @shopiaT –

 Смежные вопросы

  • Нет связанных вопросов^_^