【问题标题】:How can I create a Twitter stream using Node.js and Websockets?如何使用 Node.js 和 Websockets 创建 Twitter 流?
【发布时间】:2011-11-02 17:12:02
【问题描述】:

几个月前(2011 年 8 月)我成功创建了一个 node.js websockets 服务器,它使用基本的 HTTP 用户/密码身份验证连接到 Twitter 的 Streaming API。为此,我使用了 Andre Goncalves 的 twitter-nodejs-websocket 库。

自从创建这个工作实现以来,Twitter 已经取消了通过基本 HTTP 身份验证访问流 API 的权限,转而支持 OAuth。在这个转变之后,我使用了 Ciaran Jessup 的 node-oauth 库,它成功地让我再次访问了 Streaming API(当我运行服务器时,我成功地通过 console.log(tweet) 输出了推文——见下文)。

现在的问题是我的 websockets 服务器不再工作。当我从命令行运行服务器并从浏览器访问客户端网页时,会立即触发 websocket“onclose”事件。

我已经尝试了所有我能想到的方法来让它发挥作用。任何帮助将不胜感激!

server.js

var sys    = require('sys'),
    http   = require('http'),
    ws     = require("./vendor/ws"),
    base64 = require('./vendor/base64'),
    arrays = require('./vendor/arrays')

var OAuth = require('./oauth/oauth').OAuth;

var consumer_key        = '[...]'; //removed for obvious security reasons...
var consumer_secret     = '[...]';
var access_token        = '[...]';
var access_token_secret = '[...]';

oa = new OAuth("https://twitter.com/oauth/request_token",
                "https://twitter.com/oauth/access_token", 
                consumer_key,
                consumer_secret,
                "1.0A",
                null,
                "HMAC-SHA1");

var request = oa.get("https://stream.twitter.com/1/statuses/filter.json?track=google", access_token, access_token_secret );

// Response Parsing -------------------------------------------- //

var clients = [];
var message = "";

request.addListener('response', function (response) {

    response.setEncoding('utf8');

    response.addListener("data", function (chunk) {

        message += chunk;

        var newlineIndex = message.indexOf('\r');
        // response should not be sent until message includes '\r'.
        // Look at the section titled "Parsing Responses" in Twitter's documentation.
        if (newlineIndex !== -1) {
            var tweet = message.slice(0, newlineIndex);

            clients.forEach(function(client){
                // Send response to all connected clients
                client.write(tweet);
            });

            // this just tests if we are receiving tweets -- we are: terminal successfully outputs stream //
            var pt = JSON.parse(tweet);
            console.log('tweet: ' + pt.text);
        }
        message = message.slice(newlineIndex + 1);
    });

});
request.end();

// Websocket TCP server

ws.createServer(function(websocket){
  clients.push(websocket);
  websocket.addListener("connect", function(resource){
    // emitted after handshake
    sys.debug("connect: " + resource);
  }).addListener("close", function(){
    // emitted when server or client closes connection
    clients.remove(websocket);
    sys.debug("close");
  });
}).listen(8081);


// This basic http server works, so we know this port is open.
//
// var http = require('http');
// http.createServer(function (req, res) {
//   res.writeHead(200, {'Content-Type': 'text/plain'});
//   res.end('Hello World\n');
// }).listen(8081);

客户端代码

<script type="text/javascript" charset="utf-8">
    ws = new WebSocket("ws://ec2-67-202-6-10.compute-1.amazonaws.com:8081");
    ws.onmessage = function(evt) {
        console.log('tweet')
    };
    ws.onclose = function() {
        console.log("socket closed");
    };
    ws.onopen = function() {
        console.log("connected...");
    };
</script>

【问题讨论】:

    标签: node.js twitter oauth websocket


    【解决方案1】:

    也许您更新了浏览器? websocket 规范正在迅速变化。无论如何,我建议使用socket.io,因为如果浏览器已过时或 websockets 再次不兼容或糟糕的代理阻止 websockets 工作,它甚至仍然可以使用后备。

    【讨论】:

    • 我正在考虑使用 socket.io,但我无法弄清楚如何实现它。也许这只是 WebSockets 规范更改的问题,但我希望使用过这些或类似库的人能够发现我的实现存在问题。谢谢你的建议!
    • @Squirkle:github.com/LearnBoost/socket.io#readme 上的例子对你来说太难理解了吗?
    • 在我看来,socket.io 的安装说明有点稀疏(他们向您展示了一行 npm install,但是一旦安装了它,如何在客户端是 myurl.com/socket.io/socket.io.js 应该指向一个实际的脚本,正如他们建议的那样?),我很难弄清楚如何让 socket.io 处理我的节点请求对象......
    • @Squirkle:只需在您的网络服务器上调用io.listen,它就会自动响应对该脚本的请求并接受网络套接字连接和所有这些东西。
    • @Squirkle: var io = require('socket.io').listen(someServerObject)
    【解决方案2】:

    查看来自 twitter 流的示例事件流(它使用服务器发送的事件):

    https://github.com/chovy/nodejs-stream

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 2012-02-04
      • 2013-04-05
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多