First add your twitter username and password, then:
bundle install
ruby server [optional term]
open websocket.html
You should see some tweets appear. If not take a look at the javascript console.
| twitter.json |
| source 'http://rubygems.org' | |
| gem 'eventmachine', '0.12.10' | |
| gem 'em-websocket', '0.1.4' | |
| gem 'em-http-request', '0.2.13' | |
| gem 'json', '1.4.6' |
| GEM | |
| remote: http://rubygems.org/ | |
| specs: | |
| addressable (2.2.1) | |
| em-http-request (0.2.13) | |
| addressable (>= 2.0.0) | |
| eventmachine (>= 0.12.9) | |
| em-websocket (0.1.4) | |
| addressable (>= 2.1.1) | |
| eventmachine (>= 0.12.9) | |
| eventmachine (0.12.10) | |
| json (1.4.6) | |
| PLATFORMS | |
| ruby | |
| DEPENDENCIES | |
| em-http-request (= 0.2.13) | |
| em-websocket (= 0.1.4) | |
| eventmachine (= 0.12.10) | |
| json (= 1.4.6) |
| require 'em-http' | |
| require 'json' | |
| class LanguageDetector | |
| URL = "http://www.google.com/uds/GlangDetect" | |
| include EM::Deferrable | |
| def initialize(text) | |
| request = EM::HttpRequest.new(URL).get({ | |
| :query => {:v => "1.0", :q => text} | |
| }) | |
| # This is called if the request completes successfully (whatever the code) | |
| request.callback { | |
| begin | |
| if request.response_header.status == 200 | |
| info = JSON.parse(request.response)["responseData"] | |
| if info['isReliable'] | |
| self.succeed(info['language']) | |
| else | |
| self.fail("Language could not be reliably determined") | |
| end | |
| else | |
| self.fail("Call to fetch language failed") | |
| end | |
| rescue | |
| puts request.response | |
| self.fail | |
| end | |
| } | |
| # This is called if the request totally failed | |
| request.errback { | |
| self.fail("Error making API call") | |
| } | |
| end | |
| end |
| require 'rubygems' | |
| require 'eventmachine' | |
| require 'em-websocket' | |
| require 'twitter_stream' | |
| require 'language_detector' | |
| unless File.exist?(auth_file = File.dirname(__FILE__) + "/twitter.json") | |
| puts 'Getting started guide.' | |
| puts 'Create twitter.json file:' | |
| puts ' cp twitter.json.example twitter.json' | |
| exit | |
| end | |
| auth = JSON.parse(File.read(auth_file)) | |
| TWITTER_USERNAME = auth['username'] | |
| TWITTER_PASSWORD = auth['password'] | |
| TWITTER_TERM = ARGV[0] || 'twitter' | |
| EM.run { | |
| websocket_connections = [] | |
| EM::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws| | |
| ws.onopen { | |
| puts "Websocket connection opened" | |
| websocket_connections << ws | |
| } | |
| ws.onclose { | |
| puts "Websocket connection closed" | |
| websocket_connections.delete(ws) | |
| } | |
| end | |
| stream = TwitterStream.new(TWITTER_USERNAME, TWITTER_PASSWORD, TWITTER_TERM) | |
| stream.ontweet { |tweet| | |
| LanguageDetector.new(tweet).callback { |lang| | |
| puts "New tweet in #{lang}: #{tweet}" | |
| websocket_connections.each do |socket| | |
| socket.send(JSON.generate({ | |
| :lang => lang, | |
| :tweet => tweet | |
| })) | |
| end | |
| } | |
| } | |
| } |
| {"username":"USERNAME","password":"PASSWORD"} |
| require 'em-http' | |
| require 'json' | |
| class TwitterStream | |
| URL = 'http://stream.twitter.com/1/statuses/filter.json' | |
| def initialize(username, password, term) | |
| @username, @password = username, password | |
| @term = term | |
| @callbacks = [] | |
| @buffer = "" | |
| listen | |
| end | |
| def ontweet(&block) | |
| @callbacks << block | |
| end | |
| private | |
| def listen | |
| http = EventMachine::HttpRequest.new(URL).post({ | |
| :head => { 'Authorization' => [@username, @password] }, | |
| :query => { "track" => @term } | |
| }) | |
| http.stream do |chunk| | |
| @buffer += chunk | |
| process_buffer | |
| end | |
| end | |
| def process_buffer | |
| while line = @buffer.slice!(/.+\r\n/) | |
| tweet = JSON.parse(line) | |
| @callbacks.each { |c| c.call(tweet['text']) } | |
| end | |
| end | |
| end |
| <!DOCTYPE html> | |
| <head> | |
| <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| var container = $('.container'); | |
| var addTweetToPage = function(language, tweet) { | |
| var id = 'tweet' + language; | |
| if ($('#'+id).length == 0) { | |
| container.append('<div id="'+id+'"><h1>'+language+'</h1></div>') | |
| } | |
| $('#'+id).append('<div class="tweet">'+tweet+'</div>'); | |
| }; | |
| var socket = new WebSocket('ws://0.0.0.0:8080/'); | |
| socket.onopen = function() { | |
| console.log("Socket opened"); | |
| }; | |
| socket.onmessage = function(message) { | |
| var info = JSON.parse(message.data); | |
| console.log(info.lang, info.tweet); | |
| addTweetToPage(info.lang, info.tweet); | |
| }; | |
| socket.onclose = function() { | |
| console.log("Socket closed"); | |
| }; | |
| }) | |
| </script> | |
| </head> | |
| <body> | |
| <div class="container"></div> | |
| </body> |