Skip to content

Commit bb88478

Browse files
committed
Major update
Major update
1 parent 1f3cdc1 commit bb88478

File tree

9 files changed

+202
-197
lines changed

9 files changed

+202
-197
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ If you want to run it with Nginx and uwsgi
3131

3232
## How to run
3333

34-
python2.7 twintelligence.py
34+
python twintelligence.py
3535

3636
## Changelog
3737

38+
### 0.2
39+
* python-twitter & API model update
40+
3841
### 0.1
3942
* Initial alpha release
4043

deployment/nginx/twintelligence

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
server {
2+
listen 80;
3+
server_name twintelligence.io;
4+
5+
location / {
6+
include uwsgi_params;
7+
uwsgi_pass unix:/home/dev/Twintelligence/twintelligence.sock;
8+
}
9+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[Unit]
2+
Description=uWSGI instance to serve Twintelligence
3+
After=network.target
4+
5+
[Service]
6+
User=dev
7+
Group=www-data
8+
WorkingDirectory=/home/dev/Twintelligence
9+
Environment="PATH=/home/dev/twintelligence-env/bin"
10+
ExecStart=/home/dev/twintelligence-env/bin/uwsgi --ini twintelligence.ini
11+
12+
[Install]
13+
WantedBy=multi-user.target
14+

templates/report.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
1212
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
1313

14-
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDnABto1zDq_oSDSXZodb9pn0FhlCQ0pjQ&sensor=false"></script>
14+
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAubUpj84r3OyVZoPI4pMjohVfBJQ_NG1g&sensor=false"></script>
1515

1616
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
1717
<script type="text/javascript">

twintelligence.ini

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[uwsgi]
2+
module = wsgi:app
3+
4+
master = true
5+
processes = 5
6+
7+
socket = twintelligence.sock
8+
chmod-socket = 660
9+
vacuum = true
10+
11+
die-on-term = true

twintelligence.py

Lines changed: 159 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#
44
# Twintelligence is a free Twitter OSINT tool
55
#
6-
# Author: @Jipe_
6+
# Author: @Jipe_
77
#
88

99
import twitter
@@ -18,170 +18,181 @@
1818

1919
app = Flask(__name__)
2020

21+
2122
class Data(object):
22-
def __init__(self, g, l, h):
23-
self.g = g
24-
self.l = l
25-
self.h = h
23+
24+
def __init__(self, g, l, h):
25+
self.g = g
26+
self.l = l
27+
self.h = h
28+
2629

2730
def getstatuses(twapi, userid, twnumber):
28-
""" Get the list of Tweets"""
29-
30-
totalitems = 0
31-
items = None
32-
gpscoordinates = []
33-
langs = {}
34-
hours = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
35-
maxid = 0
36-
37-
print("[D] Retrieving the list of tweets (it might take a while...)")
38-
39-
try:
40-
items = twapi.GetUserTimeline(user_id=userid, count=200) #Can't request more than 200 items at a time
41-
except twitter.TwitterError as e:
42-
print(u"[-] ERROR: (" + e[0] + ")")
43-
return(Data(0,0,0))
44-
45-
while len(items) > 0 and totalitems < twnumber:
46-
if maxid == items[-1].id:
47-
break
48-
maxid = items[-1].id
49-
for item in items:
50-
if totalitems >= twnumber:
51-
break
52-
53-
if item.coordinates:
54-
gpscoordinates.append({'created_at' : item.created_at, 'lat' : item.coordinates['coordinates'][1], 'lng' : item.coordinates['coordinates'][0]})
55-
56-
if item.lang in langs:
57-
langs[item.lang] += 1
58-
else:
59-
langs[item.lang] = 1
60-
61-
hours[datetime.strptime(item.created_at, "%a %b %d %H:%M:%S +0000 %Y").hour] += 1
62-
63-
totalitems += 1
64-
print("[D] [" + str(totalitems) + "] - "+ str(item.id) + " (" + item.created_at + ") - lang: " + item.lang + " added")
65-
#print(item)
66-
67-
try:
68-
items = twapi.GetUserTimeline(user_id=userid, count=200, max_id=maxid)
69-
except twitter.TwitterError as e:
70-
print(u"[-] ERROR: (" + e[0] + ")")
71-
return(Data(0,0,0))
72-
73-
print("[D] Got " + str(totalitems) + " tweets")
74-
75-
print gpscoordinates
76-
77-
langscountries = []
78-
langsnumbers = []
79-
langsdata = []
80-
81-
for key in langs.keys():
82-
langscountries.append(key)
83-
langsnumbers.append(langs[key])
84-
85-
langsdata.append(langscountries)
86-
langsdata.append(langsnumbers)
87-
88-
return(Data(gpscoordinates, langsdata, hours))
31+
""" Get the list of Tweets"""
32+
33+
totalitems = 0
34+
items = None
35+
gpscoordinates = []
36+
langs = {}
37+
hours = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
38+
maxid = 0
39+
40+
print("[D] Retrieving the list of tweets (it might take a while...)")
41+
42+
try:
43+
items = twapi.GetUserTimeline(user_id=userid, count=200) # Can't request more than 200 items at a time
44+
except twitter.TwitterError as e:
45+
print(u"[-] ERROR: (" + e[0] + ")")
46+
return(Data(0, 0, 0))
47+
48+
while len(items) > 0 and totalitems < twnumber:
49+
if maxid == items[-1].id:
50+
break
51+
maxid = items[-1].id
52+
for item in items:
53+
if totalitems >= twnumber:
54+
break
55+
56+
if item.coordinates:
57+
gpscoordinates.append({'created_at' : item.created_at, 'lat' : item.coordinates['coordinates'][1], 'lng' : item.coordinates['coordinates'][0]})
58+
59+
if item.lang in langs:
60+
langs[item.lang] += 1
61+
else:
62+
langs[item.lang] = 1
63+
64+
hours[datetime.strptime(item.created_at, "%a %b %d %H:%M:%S +0000 %Y").hour] += 1
65+
66+
totalitems += 1
67+
print("[D] [" + str(totalitems) + "] - "+ str(item.id) + " (" + item.created_at + ") - lang: " + item.lang + " added")
68+
# print(item)
69+
70+
try:
71+
items = twapi.GetUserTimeline(user_id=userid, count=200, max_id=maxid)
72+
except twitter.TwitterError as e:
73+
print(u"[-] ERROR: (" + e[0] + ")")
74+
return(Data(0, 0, 0))
75+
76+
print("[D] Got " + str(totalitems) + " tweets")
77+
78+
print gpscoordinates
79+
80+
langscountries = []
81+
langsnumbers = []
82+
langsdata = []
83+
84+
for key in langs.keys():
85+
langscountries.append(key)
86+
langsnumbers.append(langs[key])
87+
88+
langsdata.append(langscountries)
89+
langsdata.append(langsnumbers)
90+
91+
return(Data(gpscoordinates, langsdata, hours))
92+
8993

9094
@app.route("/")
9195
def index():
92-
return render_template("index.html")
96+
return render_template("index.html")
97+
9398

9499
@app.route("/contact")
95100
def contact():
96-
return render_template("contact.html")
101+
return render_template("contact.html")
102+
97103

98104
@app.route("/about")
99105
def about():
100-
return render_template("about.html")
106+
return render_template("about.html")
107+
101108

102109
@app.route("/fail")
103110
def fail():
104-
return render_template("fail.html")
111+
return render_template("fail.html")
112+
105113

106114
@app.route("/report", methods=['GET', 'POST'])
107115
def report():
108-
try:
109-
if request.method == 'POST':
110-
twapi = twitter.Api(consumer_key=YOUR_APP_CONSUMER_KEY,
111-
consumer_secret=YOUR_APP_CONSUMER_SECRET,
112-
access_token_key=YOUR_ACCESS_TOKEN,
113-
access_token_secret=YOUR_ACCESS_TOKEN_SECRET)
114-
115-
userid = twapi.GetUser(screen_name=request.form['screen_name']).GetId()
116-
117-
if request.form['nbtweets'] != "":
118-
nbtweets = int(request.form['nbtweets'])
119-
if nbtweets > 2000: nbtweets = 2000
120-
else:
121-
nbtweets = 1000
122-
123-
print('[D] Trying to get [' + str(nbtweets) + '] tweets')
124-
125-
userdetails = {}
126-
userdetails['screen_name'] = '@' + twapi.GetUser(userid).GetScreenName()
127-
userdetails['name'] = twapi.GetUser(userid).GetName()
128-
userdetails['created_at'] = twapi.GetUser(userid).GetCreatedAt()
129-
userdetails['location'] = twapi.GetUser(userid).GetLocation()
130-
userdetails['utcoffset'] = str(twapi.GetUser(userid).GetUtcOffset())
131-
userdetails['tz'] = twapi.GetUser(userid).GetTimeZone()
132-
userdetails['lang'] = twapi.GetUser(userid).GetLang()
133-
userdetails['nbtweets'] = nbtweets
134-
135-
firstfollowers = []
136-
firstfriends = []
137-
138-
print('[D] Trying to get the followers')
139-
followersid = twapi.GetFollowerIDs(user_id=userid)
140-
if len(followersid) <= 20:
141-
firstfollowersid = followersid
142-
else:
143-
firstfollowersid = followersid[-21:-1]
144-
145-
#print('[D] Got ' + str(len(followers)) + ' followers')
146-
147-
print('[D] Trying to get the friends')
148-
149-
friendsid = twapi.GetFriendIDs(user_id=userid)
150-
if len(friendsid) <= 20:
151-
firstfriendsid = friendsid
152-
else:
153-
firstfriendsid = friendsid[-21:-1]
154-
155-
if firstfollowersid:
156-
firstfollowers = twapi.UsersLookup(user_id=firstfollowersid)
157-
158-
if firstfriendsid:
159-
firstfriends = twapi.UsersLookup(user_id=firstfriendsid)
160-
161-
userdetails['firstfollowers'] = reversed([ x.screen_name for x in firstfollowers])
162-
userdetails['firstfriends'] = reversed([ x.screen_name for x in firstfriends])
163-
164-
print userdetails['firstfollowers']
165-
print userdetails['firstfriends']
166-
167-
# print('[D] Joined Friends/Followers')
168-
# for f in fff:
169-
# print('[D] ' + f.screen_name)
170-
171-
print('[D] Trying to get [' + str(nbtweets) + '] tweets')
172-
returneddata = getstatuses(twapi, userid, nbtweets)
173-
174-
return render_template("report.html",
175-
userdetails = userdetails,
176-
gpsdata = returneddata.g,
177-
langsbarchartdata = returneddata.l,
178-
hoursbarchartdata = returneddata.h)
179-
else:
180-
return redirect("/")
181-
except twitter.TwitterError as e:
182-
print e #[0]["message"]
183-
return render_template("fail.html",
184-
error = e[0])
116+
try:
117+
if request.method == 'POST':
118+
twapi = twitter.Api(consumer_key=YOUR_APP_CONSUMER_KEY,
119+
consumer_secret=YOUR_APP_CONSUMER_SECRET,
120+
access_token_key=YOUR_ACCESS_TOKEN,
121+
access_token_secret=YOUR_ACCESS_TOKEN_SECRET)
122+
123+
target_user = twapi.GetUser(screen_name=request.form['screen_name'])
124+
userid = target_user.id
125+
126+
if request.form['nbtweets'] != "":
127+
nbtweets = int(request.form['nbtweets'])
128+
if nbtweets > 2000:
129+
nbtweets = 2000
130+
else:
131+
nbtweets = 1000
132+
133+
print('[D] Trying to get [' + str(nbtweets) + '] tweets')
134+
135+
userdetails = {}
136+
userdetails['screen_name'] = target_user.screen_name
137+
userdetails['name'] = target_user.name
138+
userdetails['created_at'] = target_user.created_at
139+
userdetails['location'] = target_user.location
140+
userdetails['utcoffset'] = str(target_user.utc_offset)
141+
userdetails['tz'] = target_user.time_zone
142+
userdetails['lang'] = target_user.lang
143+
userdetails['nbtweets'] = nbtweets
144+
145+
firstfollowers = []
146+
firstfriends = []
147+
148+
print('[D] Trying to get the followers')
149+
followersid = twapi.GetFollowerIDs(user_id=userid)
150+
if len(followersid) <= 20:
151+
firstfollowersid = followersid
152+
else:
153+
firstfollowersid = followersid[-21:-1]
154+
155+
#print('[D] Got ' + str(len(followers)) + ' followers')
156+
157+
print('[D] Trying to get the friends')
158+
159+
friendsid = twapi.GetFriendIDs(user_id=userid)
160+
if len(friendsid) <= 20:
161+
firstfriendsid = friendsid
162+
else:
163+
firstfriendsid = friendsid[-21:-1]
164+
165+
if firstfollowersid:
166+
firstfollowers = twapi.UsersLookup(user_id=firstfollowersid)
167+
168+
if firstfriendsid:
169+
firstfriends = twapi.UsersLookup(user_id=firstfriendsid)
170+
171+
userdetails['firstfollowers'] = reversed([x.screen_name for x in firstfollowers])
172+
userdetails['firstfriends'] = reversed([x.screen_name for x in firstfriends])
173+
174+
# print userdetails['firstfollowers']
175+
# print userdetails['firstfriends']
176+
177+
# print('[D] Joined Friends/Followers')
178+
# for f in fff:
179+
# print('[D] ' + f.screen_name)
180+
181+
print('[D] Trying to get [' + str(nbtweets) + '] tweets')
182+
returneddata = getstatuses(twapi, userid, nbtweets)
183+
184+
return render_template("report.html",
185+
userdetails = userdetails,
186+
gpsdata = returneddata.g,
187+
langsbarchartdata = returneddata.l,
188+
hoursbarchartdata = returneddata.h)
189+
else:
190+
return redirect("/")
191+
except twitter.TwitterError as e:
192+
print e # [0]["message"]
193+
return render_template("fail.html",
194+
error = e[0])
195+
185196

186197
if __name__ == "__main__":
187-
app.run(debug=True)
198+
app.run()

0 commit comments

Comments
 (0)