66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
import socket, time, urllib, urllib2, random, json, struct
|
|
from datetime import datetime
|
|
|
|
def get_datetime(tweet):
|
|
return datetime.strptime(tweet['created_at'][:-6],
|
|
'%a, %d %b %Y %H:%M:%S')
|
|
|
|
class DalekTwitter(object):
|
|
api_url = 'http://search.twitter.com/search.json'
|
|
def __init__(self, options, *a, **kw):
|
|
self.options = options
|
|
self.last_tid = self.read_last_tid()
|
|
self.ua = 'adenozynotrojfosforan'
|
|
def read_last_tid(self):
|
|
try:
|
|
with open(self.options.last_id_file, 'r') as f:
|
|
return int(f.readline())
|
|
except (ValueError, IOError):
|
|
return 0
|
|
def write_last_tid(self, tid):
|
|
if tid:
|
|
with open(self.options.last_id_file, 'w') as f:
|
|
f.write(str(tid))
|
|
def rua(self):
|
|
l = list(self.ua)
|
|
random.shuffle(l)
|
|
self.ua = ''.join(l)
|
|
def poll_twitter(self):
|
|
args = urllib.urlencode({
|
|
'q': self.options.twitter_query,
|
|
'since_id': self.last_tid
|
|
})
|
|
self.rua()
|
|
req = urllib2.Request(self.api_url + '?' + args, None,
|
|
{ 'User-Agent': self.ua })
|
|
r = urllib2.urlopen(req)
|
|
return json.load(r)
|
|
def dalek_write(self, m):
|
|
um = m.encode('utf-8')
|
|
s = socket.socket()
|
|
s.connect((self.options.host, self.options.port))
|
|
s.send('m' + struct.pack('!I', len(um)) + um)
|
|
def format_tweet(self, tweet):
|
|
return '\n%s %s: %s\n' % \
|
|
(get_datetime(tweet).strftime('%d/%m/%y %H:%M'),
|
|
tweet['from_user'], tweet['text'])
|
|
def start(self):
|
|
try:
|
|
while True:
|
|
print 'refreshing'
|
|
reply = self.poll_twitter()
|
|
self.last_tid = reply['max_id']
|
|
print 'last id:', self.last_tid
|
|
self.write_last_tid(self.last_tid)
|
|
for tweet in reply['results']:
|
|
will_write = self.format_tweet(tweet)
|
|
print 'Will send:\n', will_write
|
|
self.dalek_write(will_write)
|
|
time.sleep(self.options.twitter_refresh)
|
|
except KeyboardInterrupt:
|
|
self.write_last_tid(self.last_tid)
|
|
|
|
if __name__ == '__main__':
|
|
import options
|
|
DalekTwitter(options).start()
|