This repository has been archived by the owner on Mar 16, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
flask_fullcontact.py
139 lines (125 loc) · 5.22 KB
/
flask_fullcontact.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import mongoengine
import simplejson
from flask import Flask, request, render_template, url_for
from bson import json_util
from forms import ContactForm
from models import UserEmailData, UserPhoneData, UserTwitterData, UserFacebookData
from fullcontact import aggregate_data, batch_lookup, emails_from_file
app = Flask(__name__)
mongoengine.connect('fullcontact')
@app.route('/')
@app.route('/get-data/')
def get_home():
form = ContactForm()
return render_template('get.html', form=form, in_get=True)
@app.route('/request-data/')
def post_home():
form = ContactForm()
return render_template('post.html', form=form, in_post=True)
@app.route('/result/', methods=['GET', 'POST'])
def result():
if request.method == 'GET':
form = ContactForm(request.args)
if form.validate():
query = []
if form.email:
query.append(('email', form.email.data))
if form.phone:
query.append(('phone', form.phone.data.replace('+','')))
if form.twitter:
query.append(('twitter', form.twitter.data))
if form.facebook:
query.append(('facebookUsername', form.facebook.data))
userdata = aggregate_data(query)
return render_template('results/get_results.html', ud=userdata)
elif request.method == 'POST':
if request.files.get('file'):
# get emails from file, if one was uploaded
batch_data = emails_from_file(request.files.get('file'))
else:
batch_data = request.form.get('batch_data')
if batch_data:
batch_data = batch_data.replace('facebook', 'facebookUsername').split(',')
for i in range(len(batch_data)):
batch_data[i] = tuple(batch_data[i].split(':'))
if batch_data:
response = batch_lookup(batch_data, request.url_root + url_for('webhook')[1:])
else:
response = ["Nothing to process"]
return render_template('results/post_results.html', response=response)
@app.route('/webhook/', methods=['POST'])
def webhook():
if request.method == 'POST':
contacttype, contact = request.form['webhookId'].split(':')
contact = contact.strip()
data_dict = simplejson.loads(request.form.get('result'))
if app.debug:
print 'RECEIVED ', contacttype, ':', contact
if contacttype == 'email':
try:
userdata = UserEmailData.objects.get(email=contact)
except UserEmailData.DoesNotExist:
userdata = UserEmailData(email=contact)
elif contacttype == 'phone':
try:
userdata = UserPhoneData.objects.get(phone=contact)
except UserPhoneData.DoesNotExist:
userdata = UserPhoneData(phone=contact)
elif contacttype == 'twitter':
try:
userdata = UserTwitterData.objects.get(twitter=contact)
except UserTwitterData.DoesNotExist:
userdata = UserTwitterData(twitter=contact)
elif contacttype == 'facebookUsername':
try:
userdata = UserFacebookData.objects.get(facebookUsername=contact)
except UserFacebookData.DoesNotExist:
userdata = UserFacebookData(facebookUsername=contact)
userdata.data_dict = data_dict
userdata.save()
if app.debug:
print 'Account (%s): %s' % (contacttype, contact)
print 'Status:', data_dict.get('status')
return "Thanks a lot"
@app.route('/api/', methods=['GET', 'POST'])
def api():
"""
Return the aggregated result for data sent in GET request or
send a request to Full Contact API for POST request.
"""
if request.method == 'POST':
# request data from Full Contact API
data_list = request.json.get('data')
logs = batch_lookup(data_list, request.url_root + url_for('webhook')[1:])
return simplejson.dumps(logs)
elif request.method == 'GET' and request.args.items():
data_list = request.args.items()
# split the arguments of the same type (separated by comma in GET request)
for i in range(len(data_list)):
if len(data_list[i][1].split(',')) > 1:
data_type = data_list[i][0]
for data_value in data_list[i][1].split(','):
data_list.append((data_type, data_value))
data_list.pop(i)
# aggregate the results and return
userdata = aggregate_data(data_list)
if userdata:
return simplejson.dumps(userdata.data_dict, default=json_util.default)
return '{}' # empty dictionary
@app.route('/api/get-list/', methods=['POST'])
def get_list():
"""
Get a list of contact data sets (JSON) in POST message and return the
aggregated results for each set.
"""
print 'RECEIVED', request.json.get('data')
data_lists = request.json.get('data')
userdata = []
for data_list in data_lists:
userdata.append(aggregate_data(data_list).data_dict)
if userdata:
return simplejson.dumps(userdata, default=json_util.default)
return '[]' # empty list
if __name__ == '__main__':
app.debug = True
app.run(host='127.0.0.1')