|
3 | 3 | #
|
4 | 4 | # Twintelligence is a free Twitter OSINT tool
|
5 | 5 | #
|
6 |
| -# Author: @Jipe_ |
| 6 | +# Author: @Jipe_ |
7 | 7 | #
|
8 | 8 |
|
9 | 9 | import twitter
|
|
18 | 18 |
|
19 | 19 | app = Flask(__name__)
|
20 | 20 |
|
| 21 | + |
21 | 22 | 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 | + |
26 | 29 |
|
27 | 30 | 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 | + |
89 | 93 |
|
90 | 94 | @app.route("/")
|
91 | 95 | def index():
|
92 |
| - return render_template("index.html") |
| 96 | + return render_template("index.html") |
| 97 | + |
93 | 98 |
|
94 | 99 | @app.route("/contact")
|
95 | 100 | def contact():
|
96 |
| - return render_template("contact.html") |
| 101 | + return render_template("contact.html") |
| 102 | + |
97 | 103 |
|
98 | 104 | @app.route("/about")
|
99 | 105 | def about():
|
100 |
| - return render_template("about.html") |
| 106 | + return render_template("about.html") |
| 107 | + |
101 | 108 |
|
102 | 109 | @app.route("/fail")
|
103 | 110 | def fail():
|
104 |
| - return render_template("fail.html") |
| 111 | + return render_template("fail.html") |
| 112 | + |
105 | 113 |
|
106 | 114 | @app.route("/report", methods=['GET', 'POST'])
|
107 | 115 | 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 | + |
185 | 196 |
|
186 | 197 | if __name__ == "__main__":
|
187 |
| - app.run(debug=True) |
| 198 | + app.run() |
0 commit comments