2 Colorful user's timeline stream
5 from __future__
import print_function
6 from multiprocessing
import Process
8 import os
, os
.path
, argparse
, sys
, time
, signal
10 from twitter
.stream
import TwitterStream
, Timeout
, HeartbeatTimeout
, Hangup
11 from twitter
.api
import *
12 from twitter
.oauth
import OAuth
, read_token_file
13 from twitter
.oauth_dance
import oauth_dance
14 from twitter
.util
import printNicely
15 from dateutil
import parser
22 def draw(t
,keyword
=None):
28 screen_name
= t
['user']['screen_name']
29 name
= t
['user']['name']
30 created_at
= t
['created_at']
31 date
= parser
.parse(created_at
)
32 time
= date
.strftime('%Y/%m/%d %H:%M:%S')
35 user
= cycle_color(name
) + grey(' ' + '@' + screen_name
+ ' ')
36 clock
= grey('[' + time
+ ']')
39 tweet
= map(lambda x
: grey(x
) if x
== 'RT' else x
, tweet
)
40 # Highlight screen_name
41 tweet
= map(lambda x
: cycle_color(x
) if x
[0] == '@' else x
, tweet
)
43 tweet
= map(lambda x
: cyan(x
) if x
[0:7] == 'http://' else x
, tweet
)
44 # Highlight search keyword
46 tweet
= map(lambda x
: on_yellow(x
) if ''.join(c
for c
in x
if c
.isalnum()).lower() == keyword
.lower() else x
, tweet
)
47 tweet
= ' '.join(tweet
)
50 line1
= u
"{u:>{uw}}:".format(
54 line2
= u
"{c:>{cw}}".format(
67 def parse_arguments():
71 parser
= argparse
.ArgumentParser(description
=__doc__
or "")
75 help='Timeout for the stream (seconds).')
78 '--heartbeat-timeout',
79 help='Set heartbeat timeout.',
85 help='Set stream to non-blocking.')
89 help='Search the stream for specific text.')
90 return parser
.parse_args()
95 authenticate with Twitter OAuth
97 # When using rainbow stream you must authorize.
98 twitter_credential
= os
.environ
.get(
102 '')) + os
.sep
+ '.rainbow_oauth'
103 if not os
.path
.exists(twitter_credential
):
104 oauth_dance("Rainbow Stream",
108 oauth_token
, oauth_token_secret
= read_token_file(twitter_credential
)
116 def get_decorated_name():
118 Beginning of every line
120 t
= Twitter(auth
=authen())
121 name
= '@' + t
.statuses
.user_timeline()[-1]['user']['screen_name']
122 g
['decorated_name'] = grey('[') + grey(name
) + grey(']: ')
129 t
= Twitter(auth
=authen())
130 t
.statuses
.update(status
=g
['stuff'])
137 t
= Twitter(auth
=authen())
138 rel
= t
.search
.tweets(q
='#' + g
['stuff'])['statuses']
139 h
, w
= os
.popen('stty size', 'r').read().split()
141 printNicely(grey('*'*int(w
)+'\n'))
142 print('Newest',SEARCH_MAX_RECORD
, 'tweet: \n')
144 draw(t
=rel
[i
],keyword
=g
['stuff'].strip())
145 printNicely(grey('*'*int(w
)+'\n'))
150 List of friend (following)
152 t
= Twitter(auth
=authen())
153 g
['friends'] = t
.friends
.ids()['ids']
154 for i
in g
['friends']:
155 screen_name
= t
.users
.lookup(user_id
=i
)[0]['screen_name']
156 user
= cycle_color('@'+screen_name
)
165 t
= Twitter(auth
=authen())
166 g
['followers'] = t
.followers
.ids()['ids']
167 for i
in g
['followers']:
168 screen_name
= t
.users
.lookup(user_id
=i
)[0]['screen_name']
169 user
= cycle_color('@'+screen_name
)
179 Hi boss! I'm ready to serve you right now!
180 ----------------------------------------------------
181 "tweet" at the beginning will tweet immediately
182 "s" and follow by any word will search and return 5 newest tweet
183 "fr" will list out your following people
184 "fl" will list out your followers
185 "h" will print this help once again
186 "c" will clear the terminal
188 ----------------------------------------------------
189 Have fun and hang tight!
192 sys
.stdout
.write(g
['decorated_name'])
206 os
.kill(g
['stream_pid'], signal
.SIGKILL
)
212 Process switch by start of line
222 }.get(cmd
,lambda: sys
.stdout
.write(g
['decorated_name']))
227 Listen to user's input
229 for line
in iter(stdin
.readline
, ''):
231 cmd
= line
.split()[0]
234 # Save cmd to global variable and call process
235 g
['stuff'] = ' '.join(line
.split()[1:])
244 args
= parse_arguments()
248 # These arguments are optional:
250 timeout
=args
.timeout
,
251 block
=not args
.no_block
,
252 heartbeat_timeout
=args
.heartbeat_timeout
)
256 if args
.track_keywords
:
257 query_args
['track'] = args
.track_keywords
260 stream
= TwitterStream(
262 domain
= 'userstream.twitter.com',
264 tweet_iter
= stream
.user(**query_args
)
266 # Iterate over the sample stream.
267 for tweet
in tweet_iter
:
269 printNicely("-- None --")
270 elif tweet
is Timeout
:
271 printNicely("-- Timeout --")
272 elif tweet
is HeartbeatTimeout
:
273 printNicely("-- Heartbeat Timeout --")
274 elif tweet
is Hangup
:
275 printNicely("-- Hangup --")
276 elif tweet
.get('text'):
285 p
= Process(target
= stream
)
287 g
['stream_pid'] = p
.pid