2017-02-15 51 views
11

Tôi sử dụng mã sau hoạt động đôi khi nhưng không ổn định, khi tôi chạy chương trình đôi khi tôi gặp lỗi 420 với lỗi phân tích cú pháp json không cung cấp cho bạn nhiều gợi ý cách giải quyết. bất kỳ ý tưởng những gì tôi đang làm sai?Sử dụng API twitter thỉnh thoảng gặp lỗi

Lỗi này là:

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

Có lẽ nếu có một cách mà khi lỗi được xảy ra lờ nó đi và tiến hành kể từ bây giờ quá trình này được dừng lại.

Cập nhật:

Trong tài liệu twitter có thông tin về HTTP 420 nhưng không chắc chắn làm thế nào để sửa chữa nó ...

Trả lời

3

Theo pii_ke 's trả lời bạn chỉ nên sửa đổi tweet_id như sau:

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

Full sửa đổi mã bạn có thể sao chép dán:

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

Cảm ơn tôi đã thử nhưng tôi đã có cùng một erorr :(, bất kỳ ý tưởng nào khác? –

6

HTTP 420 is returned when you are being rate limited.

Có một https://publish.twitter.com/oembed resource URL, đó không phải là giới hạn tốc độ cũng không yêu cầu xác thực. Tôi nghĩ nó trả về những điều tương tự mà chương trình của bạn mong đợi. Bạn có thể sử dụng điều đó nếu bạn chuyển thông số truy vấn url có liên kết tới tweet. Cố gắng làm cho liên kết như:

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

Đối với dữ liệu mẫu được trả về bởi Twitter nhấp here

+0

Cảm ơn, nhưng không chắc chắn làm thế nào để làm điều đó với ví dụ của bạn, bạn có thể cung cấp các ví dụ complite với mã của tôi? –

+0

Tôi không lập trình Javascript nhiều. Tôi có thể thấy cách tạo các đối tượng 'Twitter' và' client' trong mã của bạn, nhưng tôi không chắc chắn về các đối tượng 'request',' stream' và 'io'. Nếu bạn nói cách tạo ra những thứ này thì tôi có thể kiểm tra điều gì đó. @shopiaT –

Các vấn đề liên quan