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 printNicely(grey('**************************************************************************************\n'))
140 print('Newest',SEARCH_MAX_RECORD
, 'tweet: \n')
142 draw(t
=rel
[i
],keyword
=g
['stuff'].strip())
143 printNicely(grey('**************************************************************************************\n'))
148 List of friend (following)
150 t
= Twitter(auth
=authen())
151 g
['friends'] = t
.friends
.ids()['ids']
152 for i
in g
['friends']:
153 screen_name
= t
.users
.lookup(user_id
=i
)[0]['screen_name']
154 user
= cycle_color('@'+screen_name
)
163 t
= Twitter(auth
=authen())
164 g
['followers'] = t
.followers
.ids()['ids']
165 for i
in g
['followers']:
166 screen_name
= t
.users
.lookup(user_id
=i
)[0]['screen_name']
167 user
= cycle_color('@'+screen_name
)
177 Hi boss! I'm ready to serve you right now!
178 ----------------------------------------------------
179 "tweet" at the beginning will tweet immediately
180 "s" and follow by any word will search and return 5 newest tweet
181 "fr" will list out your following people
182 "fl" will list out your followers
183 "h" will print this help once again
184 "c" will clear the terminal
186 ----------------------------------------------------
187 Have fun and hang tight!
190 sys
.stdout
.write(g
['decorated_name'])
204 os
.kill(g
['stream_pid'], signal
.SIGKILL
)
210 Process switch by start of line
220 }.get(cmd
,lambda: sys
.stdout
.write(g
['decorated_name']))
225 Listen to user's input
227 for line
in iter(stdin
.readline
, ''):
229 cmd
= line
.split()[0]
232 # Save cmd to global variable and call process
233 g
['stuff'] = ' '.join(line
.split()[1:])
242 args
= parse_arguments()
246 # These arguments are optional:
248 timeout
=args
.timeout
,
249 block
=not args
.no_block
,
250 heartbeat_timeout
=args
.heartbeat_timeout
)
254 if args
.track_keywords
:
255 query_args
['track'] = args
.track_keywords
258 stream
= TwitterStream(
260 domain
= 'userstream.twitter.com',
262 tweet_iter
= stream
.user(**query_args
)
264 # Iterate over the sample stream.
265 for tweet
in tweet_iter
:
267 printNicely("-- None --")
268 elif tweet
is Timeout
:
269 printNicely("-- Timeout --")
270 elif tweet
is HeartbeatTimeout
:
271 printNicely("-- Heartbeat Timeout --")
272 elif tweet
is Hangup
:
273 printNicely("-- Hangup --")
274 elif tweet
.get('text'):
283 p
= Process(target
= stream
)
285 g
['stream_pid'] = p
.pid