#!/usr/bin/env python import base import vault import os import re import sys import tweepy import requests from collections import Counter from termcolor import colored # Control whether the module is enabled or not ENABLED = True class style: BOLD = '\033[1m' END = '\033[0m' def banner(): print colored(style.BOLD + '\n[+] Getting information from Twitter\n' + style.END, 'blue') def twitterdetails(username): twitter_consumer_key = vault.get_key('twitter_consumer_key') twitter_consumer_secret = vault.get_key('twitter_consumer_secret') twitter_access_token = vault.get_key('twitter_access_token') twitter_access_token_secret = vault.get_key('twitter_access_token_secret') auth = tweepy.OAuthHandler(twitter_consumer_key, twitter_consumer_secret) auth.set_access_token(twitter_access_token, twitter_access_token_secret) # preparing auth api = tweepy.API(auth) userdetails = {} activitydetails = {} try: userinfo = api.get_user(screen_name=username) except Exception as e: if e.message[0]['code'] == 63: print colored(style.BOLD + '[!] Error: ' + str(e.message[0]['message']) + style.END, 'red') pass return activitydetails, userdetails userdetails['Followers'] = userinfo.followers_count userdetails['Following'] = userinfo.friends_count userdetails['Geolocation Enabled'] = userinfo.geo_enabled try: userdetails['Homepage'] = userinfo.entities['url']['urls'][0]['display_url'] except KeyError: pass userdetails['Language'] = userinfo.lang userdetails['Number of Tweets'] = userinfo.statuses_count userdetails['Profile Description'] = userinfo.description.encode('utf8') userdetails['Profile Set Location'] = userinfo.location userdetails['Time Zone'] = userinfo.time_zone userdetails['User ID'] = userinfo.id userdetails['UTC Offset'] = userinfo.utc_offset userdetails['Verified Account'] = userinfo.verified f = open("temptweets.txt", "w+") # writing tweets to temp file- last 1000 for tweet in tweepy.Cursor(api.user_timeline, id=username).items(1000): f.write(tweet.text.encode("utf-8")) f.write("\n") # extracting hashtags f = open('temptweets.txt', 'r') q = f.read() strings = re.findall(r'(?:\#+[\w_]+[\w\'_\-]*[\w_]+)', q) tusers = re.findall(r'(?:@[\w_]+)', q) f.close() os.remove("temptweets.txt") hashlist = [] userlist = [] for item in strings: item = item.strip('#') item = item.lower() hashlist.append(item) for itm in tusers: itm = itm.strip('@') itm = itm.lower() userlist.append(itm) activitydetails = { 'Hashtag Interactions': hashlist[:10], 'User Interactions': userlist[:10] } return activitydetails, userdetails def main(username): twitter_consumer_key = vault.get_key('twitter_consumer_key') twitter_consumer_secret = vault.get_key('twitter_consumer_secret') twitter_access_token = vault.get_key('twitter_access_token') twitter_access_token_secret = vault.get_key('twitter_access_token_secret') if twitter_consumer_key != None and twitter_consumer_secret != None and twitter_access_token != None and twitter_access_token_secret != None: r = requests.get("https://twitter.com/%s" % username) if r.status_code == 200: activitydetails, userdetails = twitterdetails(username) return [activitydetails, userdetails] else: return None else: return [False, "INVALID_API"] def output(data, username=""): if data[1] == "INVALID_API": print colored( style.BOLD + '\n[-] Twitter API Keys not configured. Skipping Twitter search.\nPlease refer to http://datasploit.readthedocs.io/en/latest/apiGeneration/.\n' + style.END, 'red') else: if data and data[0]: hashlist = data[0]['Hashtag Interactions'] userlist = data[0]['User Interactions'] userdetails = data[1] for k,v in userdetails.iteritems(): try: print k + ": " + str(v) except UnicodeEncodeError as e: print colored(style.BOLD + '[!] Error: ' + str(e) + style.END, 'red') print "\n" count = Counter(hashlist).most_common() print "Top Hashtag Occurrence for user " + username + " based on last 1000 tweets" for hash, cnt in count: print "#" + hash + " : " + str(cnt) print "\n" # counting user occurrence countu = Counter(userlist).most_common() print "Top User Occurrence for user " + username + " based on last 1000 tweets" for usr, cnt in countu: print "@" + usr + " : " + str(cnt) else: print "No Associated Twitter account found." if __name__ == "__main__": try: username = sys.argv[1] banner() result = main(username) output(result, username) except Exception as e: print e print "Please provide a username as argument"