代理推特流通过socket.io

Proxy twitter stream via socket.io

本文关键字:socket io 代理      更新时间:2023-09-26

我已经用node.js设置了socket.io。我的场景是用户/客户端提供一个twitter屏幕名称,然后我需要使用提供的屏幕名称订阅该twitter流(出于某种原因,API需要user_id而不是屏幕名称)。

我遇到了一个序列问题,在我知道screen_name(以及随后的user_id)之前,我必须订阅流:

var tweetStream;
io.sockets.on('connection', function connect( socket )
{
  socket.on('subscribe', function(data)
  {
    twitter.get(
      'statuses/user_timeline',
      { "screen_name": data.screen_name },
      function getTweets( err , tweets )
      {
        // …
        // var user_id …
        tweetStream = twitter.stream('statuses/filter', { "follow": user_id });
        console.log(''n','tweetStream: ', tweetStream, ''n');
        tweetStream.on('tweet', function onTweet(tweet)
        {
          console.log( ''ntweetStream -> new tweet: ', tweet, ''n' );
          io.sockets.in( data.screen_name ).emit('tweets', tweet );
        });
      }
    );
  });
}

以上内容未订阅tweetstream,也不会产生错误。如果我把tweetStream代码移到socket.io之外,并硬编码一个user_id(因为它在其他方面不可用),它就起作用了:

var tweetStream;
io.sockets.on('connection', function connect( socket )
{
  …
}
tweetStream = twitter.stream('statuses/filter', { "follow": 6253282 });
console.log(''n','tweetStream: ', tweetStream, ''n');
tweetStream.on('tweet', function onTweet(tweet)
{
  console.log( ''ntweetStream -> new tweet: ', tweet, ''n' )
  io.sockets.in( tweet.user.screen_name ).emit('tweets', data );
});

编辑

两种情况下的tweetStream对象是相同的(通过FileMerge进行比较)。

这是一个包含完整代码的Gist。

问题是twitter实例需要在套接字内实例化。on('subscribe')回调:

// …
var io      = require('socket.io').listen(server);
var Twit    = require('twit');
io.sockets.on('connection', function connect( socket )
{
    //…
    socket.on('subscribe', function subscribe( data )
    {
        var twitter = new Twit({ … });
        // …
    });
    //…
});