@ -1,11 +1,17 @@
""" Sherlock: Find Usernames Across Social Networks Module
This module contains the main logic to search for usernames at social
networks .
"""
import requests
import json
import os
import sys
import re
import argparse
DEBUG = False
module_name = " Sherlock: Find Usernames Across Social Networks "
__version__ = " 0.1.0 "
# TODO: fix tumblr
@ -19,35 +25,22 @@ def print_error(err, errstr, var, debug = False):
else :
print ( f " \033 [37;1m[ \033 [91;1m- \033 [37;1m] \033 [91;1m { errstr } \033 [93;1m { var } " )
def make_request ( url , headers , error_type , social_network ):
def make_request ( url , headers , error_type , social_network , verbose = False ):
try :
r = requests . get ( url , headers = headers )
if r . status_code :
return r , error_type
except requests . exceptions . HTTPError as errh :
print_error ( errh , " HTTP Error: " , social_network , DEBUG )
print_error ( errh , " HTTP Error: " , social_network , verbose )
except requests . exceptions . ConnectionError as errc :
print_error ( errc , " Error Connecting: " , social_network , DEBUG )
print_error ( errc , " Error Connecting: " , social_network , verbose )
except requests . exceptions . Timeout as errt :
print_error ( errt , " Timeout Error: " , social_network , DEBUG )
print_error ( errt , " Timeout Error: " , social_network , verbose )
except requests . exceptions . RequestException as err :
print_error ( err , " Unknown error: " , social_network , DEBUG )
print_error ( err , " Unknown error: " , social_network , verbose )
return None , " "
def sherlock ( username ) :
# Not sure why, but the banner messes up if i put into one print function
print ( " \033 [37;1m . \" \" \" -. " )
print ( " \033 [37;1m / \\ " )
print ( " \033 [37;1m ____ _ _ _ | _..-- ' -. " )
print ( " \033 [37;1m/ ___|| |__ ___ _ __| | ___ ___| |__ >.`__.- \" \" \ ; \" ` " )
print ( " \033 [37;1m \ ___ \ | ' _ \ / _ \ ' __| |/ _ \ / __| |/ / / /( ^ \\ " )
print ( " \033 [37;1m ___) | | | | __/ | | | (_) | (__| < ' -`) =|-. " )
print ( " \033 [37;1m|____/|_| |_| \ ___|_| |_| \ ___/ \ ___|_| \ _ \ /`--. ' -- ' \ .-. " )
print ( " \033 [37;1m . ' `-._ `. \ | J / " )
print ( " \033 [37;1m / `--.| \ __/ \033 [0m " )
print ( )
def sherlock ( username , verbose = False ) :
fname = username + " .txt "
if os . path . isfile ( fname ) :
@ -58,7 +51,7 @@ def sherlock(username):
raw = open ( " data.json " , " r " , encoding = " utf-8 " )
data = json . load ( raw )
# User agent is needed because some sites does not
# User agent is needed because some sites does not
# return the correct information because it thinks that
# we are bot
headers = {
@ -79,24 +72,24 @@ def sherlock(username):
print ( " \033 [37;1m[ \033 [91;1m- \033 [37;1m] \033 [92;1m {} : \033 [93;1m Illegal User Name Format For This Site! " . format ( social_network ) )
continue
r , error_type = make_request ( url = url , headers = headers , error_type = error_type , social_network = social_network )
r , error_type = make_request ( url = url , headers = headers , error_type = error_type , social_network = social_network , verbose = verbose )
if error_type == " message " :
error = data . get ( social_network ) . get ( " errorMsg " )
# Checks if the error message is in the HTML
if not error in r . text :
print ( " \033 [37;1m[ \033 [92;1m+ \033 [37;1m] \033 [92;1m {} : \033 [0m " . format ( social_network ) , url )
write_to_file ( url , fname )
write_to_file ( url , fname )
else :
print ( " \033 [37;1m[ \033 [91;1m- \033 [37;1m] \033 [92;1m {} : \033 [93;1m Not Found! " . format ( social_network ) )
elif error_type == " status_code " :
# Checks if the status code of the repsonse is 404
if not r . status_code == 404 :
print ( " \033 [37;1m[ \033 [92;1m+ \033 [37;1m] \033 [92;1m {} : \033 [0m " . format ( social_network ) , url )
write_to_file ( url , fname )
else :
print ( " \033 [37;1m[ \033 [91;1m- \033 [37;1m] \033 [92;1m {} : \033 [93;1m Not Found! " . format ( social_network ) )
@ -114,15 +107,52 @@ def sherlock(username):
print ( " \033 [1;92m[ \033 [0m \033 [1;77m* \033 [0m \033 [1;92m] Saved: \033 [37;1m {} \033 [0m " . format ( username + " .txt " ) )
return
if __name__ == " __main__ " :
parser = argparse . ArgumentParser ( )
parser . add_argument ( ' username ' , help = ' check services with given username ' )
parser . add_argument ( " -d " , ' --debug ' , help = " enable debug mode " , action = " store_true " )
from argparse import ArgumentParser , RawDescriptionHelpFormatter
import platform
version_string = f " %(prog)s { __version__ } \n " + \
f " { requests . __description__ } : { requests . __version__ } \n " + \
f " Python: { platform . python_version ( ) } "
parser = ArgumentParser ( formatter_class = RawDescriptionHelpFormatter ,
description = f " { module_name } (Version { __version__ } ) "
)
parser . add_argument ( " --version " ,
action = " version " , version = version_string ,
help = " Display version information and dependencies. "
)
parser . add_argument ( " --verbose " , " -v " , " -d " , " --debug " ,
action = " store_true " , dest = " verbose " , default = False ,
help = " Display extra debugging information. "
)
parser . add_argument ( " --quiet " , " -q " ,
action = " store_false " , dest = " verbose " ,
help = " Disable debugging information (Default Option). "
)
parser . add_argument ( " username " ,
nargs = ' + ' , metavar = ' USERNAMES ' ,
action = " store " ,
help = " One or more usernames to check with social networks. "
)
args = parser . parse_args ( )
if args . debug :
DEBUG = True
if args . username :
sherlock ( args . username )
#Banner
print (
""" \033 [37;1m . \" \" \" -.
\033 [ 37 ; 1 m / \\
\033 [ 37 ; 1 m ____ _ _ _ | _ . . - - ' -.
\033 [ 37 ; 1 m / ___ | | | __ ___ _ __ | | ___ ___ | | __ > . ` __ . - \" \" \ ; \" `
\033 [ 37 ; 1 m \___ \| ' _ \ / _ \ ' __ | | / _ \ / __ | | / / / / ( ^ \\
\033 [ 37 ; 1 m ___ ) | | | | __ / | | | ( _ ) | ( __ | < ' -`) =|-.
\033 [ 37 ; 1 m | ____ / | _ | | _ | \___ | _ | | _ | \___ / \___ | _ | \_ \ / ` - - . ' -- ' \ . - .
\033 [ 37 ; 1 m . ' `-._ `. \ | J /
\033 [ 37 ; 1 m / ` - - . | \__ / \033 [ 0 m """ )
#Run report on all specified users.
for username in args . username :
print ( )
sherlock ( username , verbose = args . verbose )