Skip to content

Instantly share code, notes, and snippets.

@mizchi
Created August 17, 2011 00:31
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save mizchi/1150523 to your computer and use it in GitHub Desktop.
Save mizchi/1150523 to your computer and use it in GitHub Desktop.
node.jsでuserstream
sys = require 'sys'
events = require 'events'
util = require 'util'
OAuth = require('oauth').OAuth
class TwitterUserstream extends events.EventEmitter
constructor: (args, initializer) ->
@consumerKey = args.consumerKey
@consumerSecret = args.consumerSecret
@accessToken = args.accessToken
@accessTokenSecret = args.accessTokenSecret
if initializer
initializer(this)
requestTokenUrl: 'https://twitter.com/oauth/request_token'
accessTokenUrl: 'https://twitter.com/oauth/access_token'
oauthVersion: '1.0a'
signatureMethod: 'HMAC-SHA1'
requestUri: 'https://userstream.twitter.com/2/user.json'
createClient: ->
new OAuth @requestTokenUrl, @accessTokenUrl, @consumerKey, @consumerSecret, @oauthVersion, null, @signatureMethod
createRequest: ->
client = @createClient()
client.get @requestUri, @accessToken, @accessTokenSecret
parseResponse: (chunk) ->
elements = chunk.toString().split("\r").map((str) -> if str == "\n" then "" else str)
lastIndex = elements.length - 1
residue = @residue
if residue
elements[0] = residue + elements[0]
@residue = elements[lastIndex]
elements.slice(0, lastIndex).filter((str) -> str && str != "\n")
parseEvent: (eventText) ->
try
return JSON.parse(eventText)
catch e
@emit("parseError", e, eventText)
dispatchEvent: (eventObject) ->
if eventObject.friends
@emit("friends", eventObject)
else if eventObject.delete
@emit("delete", eventObject)
else if (eventObject.event == "follow")
@emit("follow", eventObject)
else if (eventObject.event == "favorite")
@emit("favorite", eventObject)
else
@emit("tweet", eventObject)
start: ->
request = @createRequest()
request.on "response", (response) =>
response.on "data", (chunk) =>
eventObjects = @parseResponse(chunk)
eventObjects.forEach (evt) =>
obj = @parseEvent(evt)
@dispatchEvent(obj)
response.on "end", =>
@emit("end")
request.end();
exports.TwitterUserstream = TwitterUserstream
#!/usr/bin/env coffee
# git clone git://github.com/cesare/twitter-userstream.git
# cd twitter-userstream
# cake build
# npm install . -g
# npm link twitter-userstream
TwitterUserstream = require('twitter-userstream').TwitterUserstream
sys = require 'sys'
util = require 'util'
tokens =
consumerKey: ""
consumerSecret: ""
accessToken: ""
accessTokenSecret: ""
us = new TwitterUserstream tokens, (us) ->
show = (title, data) ->
sys.puts "--- " + title + " ---"
sys.puts util.inspect(data, false, null)
sys.puts ""
us.on "friends", (data) ->
sys.puts "--- friends ---"
sys.puts "Total " + data.friends.length + " friends"
sys.puts ""
us.on "tweet", (tweet) -> show "tweet", tweet
us.on "follow", (data) -> show "follow", data
us.on "delete", (data) -> show "delete", data
us.start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment