Skip to content

Instantly share code, notes, and snippets.

@joyrexus
Last active January 31, 2018 05:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save joyrexus/7471447 to your computer and use it in GitHub Desktop.
Save joyrexus/7471447 to your computer and use it in GitHub Desktop.
Twitter user stream listener

Simple client for listening to a Twitter user stream via version 1.1 of the streaming API.

Before running demo.coffee, place your app's OAuth keys in keys.json


This is basically a coffescript translation of @aivis' user-stream.

Listener = require './listen'
listen = new Listener(require 'keys')
listen.start()
listen.on 'data', (tweet) -> console.log tweet.text if tweet.text?
{ "consumerKey": "",
"consumerSecret": "",
"accessToken": "",
"accessTokenSecret": "" }
oauth = require 'oauth'
{EventEmitter} = require 'events'
class Listener extends EventEmitter
urls:
stream: 'https://userstream.twitter.com/1.1/user.json'
request: 'https://api.twitter.com/oauth/request_token'
access: 'https://api.twitter.com/oauth/access_token'
constructor: (@args) ->
@chunkSize = 0 # length of next data chunk for buffer
@buffer = ''
oauthArgs = [
@urls.request,
@urls.access,
@args.consumerKey,
@args.consumerSecret,
'1.0',
null,
'HMAC-SHA1',
null,
Accept: '*/*'
Connection: 'close'
'User-Agent': 'listen.js'
]
@oauth = new oauth.OAuth oauthArgs...
start: (args=with:'user') ->
args = {} if typeof args != 'object'
args.stall_warnings = 'true'
req = @oauth.post(
@urls.stream,
@args.accessToken,
@args.accessTokenSecret,
args
)
@destroy = -> req.abort()
stream = @
req.on 'response', (res) ->
if res.statusCode > 200
stream.emit 'error', {type: 'response', data: {code: res.statusCode}}
else
stream.emit 'connected'
res.setEncoding 'utf8'
res.on 'data', (data) -> stream.parse data
res.on 'error', (err) -> stream.emit('close', err)
res.on 'end', -> stream.emit('close', 'socket end')
res.on 'close', -> req.abort()
req.on 'error', (err) -> stream.emit('error', {type: 'request', data: err})
req.end()
# See ...
# https://dev.twitter.com/docs/streaming-apis/processing
# https://github.com/AvianFlu/ntwitter/blob/master/lib/parser.js
# https://github.com/aivis/user-stream/blob/master/lib/user-stream.js#L103
parse: (data) ->
for t in data.split('\r\n') when t
try
@emit 'data', JSON.parse(t)
catch err
@emit 'garbage', t
module.exports = Listener
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment