2017-02-15 56 views
11

Używam następującego kodu, który działa czasami, ale jest niestabilny, kiedy uruchomię program, czasami mam błąd 420 z błędem analizy json, który nie daje wiele wskazówek, jak go rozwiązać. Jakiś pomysł, co robię źle?Używanie Twittera Błąd API czasami

Błąd jest:

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"}); 
}); 

Może jeśli istnieje sposób, że gdy wystąpił błąd zignorować i kontynuować od teraz proces jest zatrzymany.

Aktualizacja:

w Dokumentach twitter jest informacji o HTTP 420 ale nie wiem jak to naprawić ...

Odpowiedz

3

Zgodnie pii_ke „s odpowiedź należy po prostu zmodyfikować tweet_id następująco:

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

Pełna zmodyfikowana kod, który można skopiować:

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

Dzięki, że spróbuję, ale mam ten sam erorr :(, jakikolwiek inny pomysł? –

6

HTTP 420 is returned when you are being rate limited.

Jest https://publish.twitter.com/oembed resource URL, że nie jest ani ograniczone tempo ani nie wymaga uwierzytelniania. Myślę, że zwraca te same rzeczy, których oczekuje twój program. Możesz tego użyć, jeśli przełączysz parametr zapytania o nazwie url z linkiem do tweetowania. Spróbuj link jak:

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

Do przykładowych danych zwracanych przez Twitter kliknij here

+0

Dzięki, ale nie wiesz, jak to zrobić na przykładzie, możesz podać przykład z moim kodem? –

+0

Nie programuję w JavaScript dużo. Widzę, jak tworzyć obiekty "Twitter" i "client" w kodzie, ale nie jestem pewien co do obiektów 'request',' stream' i 'io'. Jeśli powiesz, jak je utworzyć, mogę przetestować coś. @shopiaT –