有时使用Twitter API会出现错误

11

我使用以下代码,有时可以工作,但不稳定。当我运行程序时,有时会出现错误 420,同时还会出现 JSON 解析错误,它并没有给你很多提示如何解决它。你有什么想法吗?

错误信息如下:

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

如果有一种方法可以在出现错误时忽略它并继续进行,因为现在进程已经停止。

更新:

在 Twitter 文档中有关于 HTTP 420 的信息,但不确定如何修复它...

2个回答

6

当您被限制访问时,会返回HTTP 420错误码。

有一个https://publish.twitter.com/oembed资源URL,它既不受速率限制,也不需要身份验证。我认为它返回的与您的程序期望的内容相同。如果您传递一个名为url的查询参数并将其设置为推文的链接,那么可以使用该URL。尝试创建以下链接:

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

点击这里可以查看 Twitter 返回的示例数据。


谢谢,但不确定如何使用您的示例来完成它,您能否提供完整的示例与我的代码? - 07_05_GuyT
我不怎么用Javascript编程。我可以看到你的代码中如何创建Twitterclient对象,但是我不确定requeststreamio对象的创建方式。如果你告诉我如何创建它们,我就可以测试一些东西。@shopiaT - pii_ke

3
根据pii_ke的回答,您应该按如下方式修改tweet_id:

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

谢谢,我尝试了,但是还是出现了相同的错误 :( ,还有其他想法吗? - 07_05_GuyT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接