使用 socket.io/node.js 在网页上显示流式 Twitter

Posted

技术标签:

【中文标题】使用 socket.io/node.js 在网页上显示流式 Twitter【英文标题】:Displaying streaming twitter on webpage with socket.io/node.js 【发布时间】:2013-05-01 21:05:07 【问题描述】:

我正在尝试使用 node.js socket.io 和 twit 构建 Twitter 流式 Web 应用程序。

var express = require('express')
  , app = express()
  , http = require('http')
  , server = http.createServer(app)
  ,Twit = require('twit')
  , io = require('socket.io').listen(server);

server.listen(8080);

// routing
app.get('/', function (req, res) 
  res.sendfile(__dirname + '/index.html');
);

var watchList = ['love', 'hate'];


io.sockets.on('connection', function (socket) 
  console.log('Connected');

  var T = new Twit(
    consumer_key:         ''
  , consumer_secret:      ''
  , access_token:         ''
  , access_token_secret:  ''
)
 T.stream('statuses/filter',  track: watchList ,function (stream) 

  stream.on('tweet', function (tweet) 

        io.sockets.emit('stream',tweet.text);
        console.log(tweet.text);

  );
 );
); 

这是我的客户端

 <script src="/socket.io/socket.io.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
  <script>
    $(function()
      var socket = io.connect('http://localhost:8080');
      socket.on('tweet', function(tweet) 
    $(
        '<div class="tweet">' + tweet.text + '</div>');
        ); 

  );

  </script>
</div>

当我运行 node app.js 并尝试连接到 localhost:8080 时,我只是得到一个空白页面,即使所有内容(soket.io、jquery、...)似乎都已正确加载。

这是服务器输出的示例:

info  - socket.io started
debug - served static content /socket.io.js
debug - client authorized
info  - handshake authorized pwH0dbx4WvBhzSQXihpu
debug - setting request GET /socket.io/1/websocket/pwH0dbx4WvBhzSQXihpu
debug - set heartbeat interval for client pwH0dbx4WvBhzSQXihpu
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::"name":"stream","args":["RT @mintycreative: Great to chat       today RT @SharonHolistic: Treatments available tomorrow http://t.co/5Poq3KU08u Book yours now #WestMidsHou…"]

调试 - websocket 写入 5:::"name":"stream","args":["RT @laurenpeikoff: #BREAKING @ScottsdalePD 确认 - 警方正在调查 Michael Beasley 涉嫌性侵犯。@12News @azcentr …"]

希望你能帮助我纠正我的错误。

【问题讨论】:

你有方便的控制台输出吗? 不应该io.sockets.emit 只是socket.emit io.sockets.emit 发送给所有人。 当我在流函数之前添加 io.sockets.on('connection',function(socket) 时,我失去了控制台日志输出 其实就是在等我访问 localhost:8080 来记录推文。我只是想把这些推文放到一个网页中 【参考方案1】:

问题解决了

这是没有任何错误的代码:(服务器端)

var express = require('express')
  , app = express()
  , http = require('http')
  , server = http.createServer(app)
  ,Twit = require('twit')
  , io = require('socket.io').listen(server);

server.listen(8080);

// routing
app.get('/', function (req, res) 
res.sendfile(__dirname + '/index.html');
);

var watchList = ['love', 'hate'];
 var T = new Twit(
    consumer_key:         ''
  , consumer_secret:      ''
  , access_token:         ''
  , access_token_secret:  ''
)

io.sockets.on('connection', function (socket) 
  console.log('Connected');


 var stream = T.stream('statuses/filter',  track: watchList )

  stream.on('tweet', function (tweet) 

    io.sockets.emit('stream',tweet.text);


  );
 );
); 

(客户端)

 <script src="/socket.io/socket.io.js"></script>
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
  <script>

        var socket = io.connect('http://localhost:8080');
        socket.on('stream', function(tweet)
        $('#tweetd').append(tweet+'<br>');
        );
  </script>
  <div id="tweetd"></div>
</div>

【讨论】:

太棒了!感谢您提供代码,对于那些复制和粘贴此代码的人,服务器端脚本在不需要的文件末尾有一个额外的); @maximeHeckel,你分享的很好的例子。我也在我的应用程序上尝试过同样的事情。但我需要一些用户而不是“关键字”。表示您提到了一些关键字(例如 watchList),但我想要朋友的推文。我也有相同的用户名。但我没有得到预期的结果。在这里我提出了问题。请检查这个***.com/questions/37965221/…你知道我错过了什么吗?或者你有什么例子可以从选定的高音扬声器的屏幕名称中获取实时推文?谢谢 推特流挂起时你是如何解决问题的 - 很长一段时间没有新的“心跳”事件【参考方案2】:

第一个问题是,每次打开套接字连接时,您都在构建一个新的 twitter 侦听器。你应该把它移到connection 事件之外。这可能并不理想。我不确定 twitter 模块是如何在内部处理的,但它实际上很可能是在每次 websocket 连接时创建一个到他们的 API 的新连接。

在客户端,你的 jQuery 可能有点不同。如果您只想在每次出现推文时向页面添加推文,请使用 $('body').append() 将新推文附加到正文元素

见this gist for reference.

【讨论】:

以上是关于使用 socket.io/node.js 在网页上显示流式 Twitter的主要内容,如果未能解决你的问题,请参考以下文章

通过 SSL 使用 Socket.io Node.js 出现网关错误

使用 Redis 在 PHP 和 socket.io/node.js 之间进行通信

在重新连接、socket.io、node.js 时重用套接字 id

简单的游戏循环 Socket.io + Node.js + Express

Node.js:socket.io 关闭客户端连接

格式化消息以从 python 客户端发送到 socket.io node.js 服务器