I use the following code which works sometimes but its unstable , when I run the program sometimes I got error 420 with json parse error which doesnt give you lot of hints how to solve it. any idea what am I doing wrong ?
The error is :
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"});
});
Maybe if there is a way that when the error is occurred ignore it and proceed since now the process is stopped.
Update:
In twitter docs there is info about HTTP 420 but not sure how to fix it ...
Corresponds with HTTP 403. Thrown when a Tweet cannot be posted due to the user having no allowance remaining to post. Despite the text in the error message indicating that this error is only thrown when a daily limit is reached, this error will be thrown whenever a posting limitation has been reached.
The use of the Twitter API and developer products to create spam, or engage in any form of platform manipulation, is prohibited. You should review the Twitter Rules on platform manipulation and spam, and ensure that your service does not, and does not enable people to, violate our policies.
HTTP 420 is returned when you are being rate limited.
There is a https://publish.twitter.com/oembed
resource URL, that is neither rate limited nor requires authentication. I think it returns the same things that your program expects. You can use that if you pass a query parameter url
having the link to tweet. Try making the link like:
"https://publish.twitter.com/oembed?url=https://twitter.com/"+data.user.screen_name+"/statuses/"+data.id_str
For sample data returned by Twitter click here
As per pii_ke's response you should simply modify tweet_id
as follows:
var tweet_id = "https://publish.twitter.com/oembed?url=https://twitter.com/" + data.user.screen_name + "/statuses/" + data.id_str;
Full modified code you can copy paste:
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"});
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With