簡體   English   中英

如何使用Node.js和Websockets創建Twitter流?

[英]How can I create a Twitter stream using Node.js and Websockets?

幾個月前(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)成功輸出了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>

也許您更新了瀏覽器? Websocket規范正在迅速變化。 無論如何,我建議使用socket.io,因為如果瀏覽器過時或websockets再次不兼容,或者糟糕的代理阻止了websockets的工作,它甚至仍然可以使用回退。

看一下來自Twitter流的此示例事件流(它使用服務器發送的事件):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM