forked from zmyao88/Twitter_Hack
/
stream_api.py
104 lines (87 loc) · 2.97 KB
/
stream_api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import os
from pymongo import MongoClient
import sys
import settings
from textwrap import TextWrapper
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
import socket
import tweepy
try:
import simplejson as json
except:
import json
consumer_key = settings.CONSUMER_KEY
consumer_secret = settings.CONSUMER_SECRET
access_token = settings.ACCESS_TOKEN
access_token_secret = settings.ACCESS_TOKEN_SECRET
client = MongoClient('localhost', 27017)
db = client['twitter-hack']
collection = db['nyc']
sock_loc = "/tmp/twitter_socket"
if os.path.exists(sock_loc):
os.remove(sock_loc)
s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
s.bind(sock_loc)
print "connected to %s" % sock_loc
ne = {'lat' : 40.92285206859968, 'lon' : -73.66264343261719}
sw = {'lat' : 40.558156335842106, 'lon' : -74.27444458007812}
class StdOutListener(StreamListener):
''' Handles data received from the stream. '''
def on_error(self, status_code):
print('Got an error with status code: ' + str(status_code))
return True # To continue listening
def on_timeout(self):
print('Timeout...')
return True # To continue listening
def on_data(self, data):
try:
data = json.loads(data)
if data['user']['geo_enabled'] and data['coordinates']:
coor = data['coordinates']
text = data['text']
user = data['user']
data_insert = {
'coordinates' : coor,
'text' : text,
'user' : user
}
ne = [40.92285206859968, -73.66264343261719]
sw = [40.558156335842106, -74.27444458007812]
if _check_bounds(coor, ne, sw):
send_data = json.dumps(data_insert)
send_to_socket(send_data)
print "message sent!"
collection.insert(data_insert)
print "inserted: %s" % text
except KeyboardInterrupt:
print '\nciao for now'
sys.exit(0)
except BaseException, e:
print 'failed on_data: %s' % str(e)
def _check_bounds(coordinates, ne, sw):
lon, lat = coordinates['coordinates']
if sw[1] < lon < ne[1]:
if sw[0] < lat < ne[0]:
return True
return False
def send_to_socket(data):
client = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
client.connect(sock_loc)
client.send(data)
client.close()
def run(track_list):
listener = StdOutListener()
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, listener)
stream.filter(track=track_list)
#stream.filter(track=track_list)
if __name__ == '__main__':
try:
track_list = sys.argv[1:]
run(track_list)
except KeyboardInterrupt:
print '\nciao for now'
sys.exit(0)