From 777a2eb962775ff1a9fd260a632b028dfd5f533c Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 7 Nov 2018 11:18:46 +0100 Subject: [PATCH 1/9] Color codes --- .gitignore | 1 + phoneinfoga.py | 42 ++++++++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 485dee6..757eb70 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea +.buildconfig diff --git a/phoneinfoga.py b/phoneinfoga.py index 7e08cb3..ce05ef3 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -55,6 +55,11 @@ if args.update: scanners = ['any', 'all', 'numverify', 'ovh', 'whosenumber'] +code_info = '\033[97m[*] ' +code_warning = '\033[93m(!) ' +code_result = '\033[1;32m[+] ' +code_error = '\033[91m[!] ' + def parseInput(file): print 'parse' @@ -74,23 +79,24 @@ def formatNumber(number): return PhoneNumber def searchCountryCode(number): + print code_info + 'Searching for country in format...' #parse code #check in json - print '\033[1;32m[+] Country found : France (FR)' + print code_result + 'Country found : France (FR)' #check for area code - print '\033[1;32m[+] Areas found (approximate) : Bordeaux, Limoges' + print code_result + 'Areas found (approximate) : Bordeaux, Limoges' #check for carrier #print '\033[1;32m[+] Carrier found: France Sfr Mobile' - print '\033[93m[i] This is most likely a landline, or a fixed VoIP.' + print code_info + 'This is most likely a landline, or a fixed VoIP.' def numverifyScan(PhoneNumber): if not args.scanner == 'numverify' and not args.scanner == 'all': return -1 - print '\033[93m[i] Running Numverify scan...' + print code_info + 'Running Numverify scan...' requestSecret = '' resp = requests.get('https://numverify.com/') @@ -107,41 +113,41 @@ def numverifyScan(PhoneNumber): response = requests.get("https://numverify.com/php_helper_scripts/phone_api.php?secret_key=" + apiKey + "&number=" + PhoneNumber) if response.content == "Unauthorized" or response.status_code != 200: - print("[i] An error occured while calling the API (bad request or wrong api key).") + print(code_error + "An error occured while calling the API (bad request or wrong api key).") sys.exit() data = json.loads(response.content) if data["valid"] == False: - print("\033[91m[!] Error: Please specify a valid phone number. Example: +6464806649\033[94m") + print(code_error + "Error: Please specify a valid phone number. Example: +6464806649") sys.exit() - print "\033[1;32mNumber: (" + data["country_prefix"] + ") " + data["local_format"] - print("Country: %s (%s)") % (data["country_name"],data["country_code"]) - print("Location: %s") % data["location"] - print("Carrier: %s") % data["carrier"] - print("Line type: %s \033[94m") % data["line_type"] + print(code_result + "Number: (%s) %s") % (data["country_prefix"],data["local_format"]) + print(code_result + "Country: %s (%s)") % (data["country_name"],data["country_code"]) + print(code_result + "Location: %s") % data["location"] + print(code_result + "Carrier: %s") % data["carrier"] + print(code_result + "Line type: %s") % data["line_type"] def ovhScan(number): if not args.scanner == 'ovh' and not args.scanner == 'all': return -1 - print '\033[93m[i] Running OVH scan...' - print '(!) OVH API credentials missing. Skipping.\033[94m' + print code_info + 'Running OVH scan...' + print code_warning + 'OVH API credentials missing. Skipping.' def whosenumberScan(number): if not args.scanner == 'whosenumber' and not args.scanner == 'all': return -1 - print '\033[93m[i] Running Whosenumber scan...\033[94m' + print code_info + 'Running Whosenumber scan...' def scanNumber(number): PhoneNumber = formatNumber(number) - print "\033[93m[!] ---- Fetching informations for " + PhoneNumber + " ---- [!]" + print "\033[1m\033[93m[!] ---- Fetching informations for " + PhoneNumber + " ---- [!]" if not isNumberValid(PhoneNumber): - print("\033[91mError: number " + number + " is not valid. Skipping.") + print(code_error + "Error: number " + number + " is not valid. Skipping.") sys.exit() #check dial code @@ -155,7 +161,7 @@ def scanNumber(number): # Verify scanner if not args.scanner in scanners: - print("\033[91mError: scanner doesn't exists.") + print(code_error + "Error: scanner doesn't exists.") sys.exit() if args.number: @@ -167,4 +173,4 @@ elif args.input: if args.output: args.output.write("Hello World") - args.output.close() \ No newline at end of file + args.output.close() From 53563e814977860069c16452bff0c1b80a7fc556 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 7 Nov 2018 18:52:43 +0100 Subject: [PATCH 2/9] Requirements --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4c6373c..c0e12c9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ requests -sys hashlib json argparse -re \ No newline at end of file +re +ovh \ No newline at end of file From 56500d6cc7a36f19368f9490142a3aa45bd5f1b7 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 7 Nov 2018 18:54:01 +0100 Subject: [PATCH 3/9] Formatting number & carrier lookup scan --- phoneinfoga.py | 158 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 137 insertions(+), 21 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index ce05ef3..b1e32e3 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -26,7 +26,7 @@ parser = argparse.ArgumentParser(description= usage='%(prog)s -n [options]') parser.add_argument('-n', '--number', metavar='number', type=str, - help='The phone number to scan (E164 and International format)') + help='The phone number to scan (E164 or international format)') parser.add_argument('-i', '--input', metavar="input_file", type=file, help='Phone number list to scan (one per line)') @@ -53,7 +53,7 @@ if args.update: print 'update' sys.exit() -scanners = ['any', 'all', 'numverify', 'ovh', 'whosenumber'] +scanners = ['any', 'all', 'numverify', 'ovh', 'whosenumber', 'freecarrier', '411'] code_info = '\033[97m[*] ' code_warning = '\033[93m(!) ' @@ -75,28 +75,57 @@ def isNumberValid(PhoneNumber): return True def formatNumber(number): - PhoneNumber = number.replace("+", "").replace("\n", "").replace(" ", "") + PhoneNumber = dict(); + + PhoneNumber['full'] = number.replace("+", "").replace("\n", "").replace(" ", "") + + if re.match(r'(?:1){1}[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{6}', PhoneNumber['full']): + countryCodeRegex = r'[0-9]{10}$' + elif len(PhoneNumber['full']) == 13: + countryCodeRegex = r'[0-9]{11}$' + elif len(PhoneNumber['full']) == 12: + countryCodeRegex = r'[0-9]{10}$' + elif len(PhoneNumber['full']) == 11: + countryCodeRegex = r'[0-9]{9}$' + elif len(PhoneNumber['full']) == 10: + countryCodeRegex = r'[0-9]{8}$' + else: + countryCodeRegex = r'[0-9]{7}$' + + PhoneNumber['countryCode'] = re.sub(countryCodeRegex, '', PhoneNumber['full']) + PhoneNumber['number'] = PhoneNumber['full'].replace(PhoneNumber['countryCode'], '') + return PhoneNumber -def searchCountryCode(number): +def searchCountryCode(countryCode): print code_info + 'Searching for country in format...' - #parse code - #check in json - print code_result + 'Country found : France (FR)' + with open('./data/country_codes.json') as CountryCodesFile: + country_codes = json.load(CountryCodesFile) + for country in country_codes: + if country['dial_code'] == '+' + countryCode: + print code_result + 'Country code: +' + countryCode + print code_result + 'Country found: %s (%s)' % (country['name'],country['code']) + with open('./data/area_codes.json') as AreaCodesFile: + area_codes = json.load(AreaCodesFile) + for area_country in area_codes: + if area_country['CountryCode'] == country['code']: + for area in area_country['AreaCodes']: + if area == "10": + print 'y' #check for area code - print code_result + 'Areas found (approximate) : Bordeaux, Limoges' + #print code_result + 'Areas found (approximate) : Bordeaux, Limoges' #check for carrier #print '\033[1;32m[+] Carrier found: France Sfr Mobile' - print code_info + 'This is most likely a landline, or a fixed VoIP.' + #print code_info + 'This is most likely a landline, or a fixed VoIP.' def numverifyScan(PhoneNumber): if not args.scanner == 'numverify' and not args.scanner == 'all': return -1 - print code_info + 'Running Numverify scan...' + print code_info + 'Running Numverify.com scan...' requestSecret = '' resp = requests.get('https://numverify.com/') @@ -110,7 +139,22 @@ def numverifyScan(PhoneNumber): apiKey.update(PhoneNumber + requestSecret) apiKey = apiKey.hexdigest() - response = requests.get("https://numverify.com/php_helper_scripts/phone_api.php?secret_key=" + apiKey + "&number=" + PhoneNumber) + headers = { + 'host': "numverify.com", + 'connection': "keep-alive", + 'content-length': "49", + 'accept': "application/json, text/javascript, */*; q=0.01", + 'origin': "https://numverify.com", + 'x-requested-with': "XMLHttpRequest", + 'user-agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", + 'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", + 'referer': "https://numverify.com/", + 'accept-encoding': "gzip, deflate, br", + 'accept-language': "en-US,en;q=0.9,fr;q=0.8,la;q=0.7,es;q=0.6,zh-CN;q=0.5,zh;q=0.4", + 'cache-control': "no-cache" + } + + response = requests.request("GET", "https://numverify.com/php_helper_scripts/phone_api.php?secret_key=" + apiKey + "&number=" + PhoneNumber, data="", headers=headers) if response.content == "Unauthorized" or response.status_code != 200: print(code_error + "An error occured while calling the API (bad request or wrong api key).") @@ -122,42 +166,114 @@ def numverifyScan(PhoneNumber): print(code_error + "Error: Please specify a valid phone number. Example: +6464806649") sys.exit() + InternationalNumber = '('+data["country_prefix"]+')' + data["local_format"] + print(code_result + "Number: (%s) %s") % (data["country_prefix"],data["local_format"]) print(code_result + "Country: %s (%s)") % (data["country_name"],data["country_code"]) print(code_result + "Location: %s") % data["location"] print(code_result + "Carrier: %s") % data["carrier"] print(code_result + "Line type: %s") % data["line_type"] -def ovhScan(number): +def ovhScan(country, number): if not args.scanner == 'ovh' and not args.scanner == 'all': return -1 print code_info + 'Running OVH scan...' - print code_warning + 'OVH API credentials missing. Skipping.' -def whosenumberScan(number): + querystring = {"country":country} + + headers = { + 'accept': "application/json", + 'cache-control': "no-cache" + } + + response = requests.request("GET", "https://api.ovh.com/1.0/telephony/number/detailedZones", data="", headers=headers, params=querystring) + + data = json.loads(response.content) + +def whosenumberScan(countryCode, number): if not args.scanner == 'whosenumber' and not args.scanner == 'all': return -1 print code_info + 'Running Whosenumber scan...' + print 'https://whosenumber.info/' + countryCode + number + +def repScan(countryCode, number): + if not args.scanner == '411' and not args.scanner == 'all': + return -1 + + print code_info + 'Running 411.com scan...' + print 'https://www.411.com/phone/%s-%s' % (countryCode,number) + +def freecarrierlookupScan(countryCode, number): + if not args.scanner == 'freecarrier' and not args.scanner == 'all': + return -1 + + print code_info + 'Running freecarrierlookup.com scan...' + + payload = "phonenum=%s&cc=%s" % (number,countryCode) + headers = { + 'host': "freecarrierlookup.com", + 'connection': "keep-alive", + 'content-length': "48", + 'accept': "application/json, text/javascript, */*; q=0.01", + 'origin': "https://freecarrierlookup.com", + 'x-requested-with': "XMLHttpRequest", + 'user-agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", + 'content-type': "application/x-www-form-urlencoded", + 'referer': "https://freecarrierlookup.com/", + 'accept-encoding': "gzip, deflate, br", + 'accept-language': "en-US,en;q=0.9,fr;q=0.8,la;q=0.7,es;q=0.6,zh-CN;q=0.5,zh;q=0.4", + 'cookie': "PHPSESSID=cdifm9u3ch2mqscdnj2pjqjfuq", + 'cache-control': "no-cache", + 'postman-token': "c81a7bb0-f338-c2e5-5f32-e1b94726cce5" + } + + response = requests.request("POST", "https://freecarrierlookup.com/getcarrier.php", data=payload, headers=headers) + + print response.content + + data = json.loads(response.content) + + if not data["status"] == "success": + print code_error + '0 result found.' + return -1 + + soup = BeautifulSoup(response.content, "html5lib") + tags = soup.find_all("p") + + print code_result + 'Phone Number: ' + tags[0].string.replace('<\/p>\\n <\/div>\\n', '') + print code_result + 'Carrier: ' + tags[1].string.replace('<\/p>\\n <\/div>\\n', '') + print code_result + 'Is Wireless:' + print code_result + 'SMS Gateway Address: ' + print code_result + 'MMS Gateway Address: ' def scanNumber(number): PhoneNumber = formatNumber(number) - print "\033[1m\033[93m[!] ---- Fetching informations for " + PhoneNumber + " ---- [!]" + print "\033[1m\033[93m[!] ---- Fetching informations for (0)" + PhoneNumber['number'] + " ---- [!]" - if not isNumberValid(PhoneNumber): + print code_info + 'Parsing informations from format...' + + print code_result + 'Local format: (0)' + PhoneNumber['number'] + + if not isNumberValid(PhoneNumber['full']): print(code_error + "Error: number " + number + " is not valid. Skipping.") sys.exit() - #check dial code - searchCountryCode(PhoneNumber) + # Check dial code + searchCountryCode(PhoneNumber['countryCode']) + #check area code by country #if found in area codes -> landline - numverifyScan(PhoneNumber) - ovhScan(PhoneNumber) - whosenumberScan(PhoneNumber) + numverifyScan(PhoneNumber['full']) + ovhScan('fr', PhoneNumber['full']) + freecarrierlookupScan(PhoneNumber['countryCode'], PhoneNumber['number']) + #whosenumberScan(PhoneNumber['countryCode'], PhoneNumber['number']) + #repScan(PhoneNumber['countryCode'], PhoneNumber['number']) + + print '\n' # Verify scanner if not args.scanner in scanners: From 2ef629346d51df1dc72a3585e533018f3869f466 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 7 Nov 2018 18:54:41 +0100 Subject: [PATCH 4/9] Todo list --- todo.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 todo.md diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..465271a --- /dev/null +++ b/todo.md @@ -0,0 +1,7 @@ +# Todo list + +- Input feature +- Output feature +- OVH scanner +- Update feature +- Offline scan From a1790c7bea6f3fe6dc09f1902276331b7a1db7b2 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 7 Nov 2018 18:55:19 +0100 Subject: [PATCH 5/9] Delete secrets file --- secrets.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 secrets.py diff --git a/secrets.py b/secrets.py deleted file mode 100644 index 2e13cba..0000000 --- a/secrets.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python - -# Instanciate an OVH Client. -# You can generate new credentials with full access to your account on -# the token creation page -client = ovh.Client( - endpoint='ovh-eu', # Endpoint of API OVH Europe (List of available endpoints) - application_key='xxxxxxxxxx', # Application Key - application_secret='xxxxxxxxxx', # Application Secret - consumer_key='xxxxxxxxxx', # Consumer Key -) \ No newline at end of file From 053f065efd3f96efb9fa7657d2f8e33fb66cf38a Mon Sep 17 00:00:00 2001 From: sundowndev Date: Tue, 13 Nov 2018 13:29:04 +0100 Subject: [PATCH 6/9] Requirements --- requirements.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index c0e12c9..1ff83f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ requests -hashlib json argparse re -ovh \ No newline at end of file +ovh +bs4 +html5lib From 99944001106e79158431c78be3a5466311284aa0 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Tue, 13 Nov 2018 13:30:05 +0100 Subject: [PATCH 7/9] Regex formats --- phoneinfoga.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index b1e32e3..7dc9c1c 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -81,38 +81,33 @@ def formatNumber(number): if re.match(r'(?:1){1}[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{6}', PhoneNumber['full']): countryCodeRegex = r'[0-9]{10}$' - elif len(PhoneNumber['full']) == 13: - countryCodeRegex = r'[0-9]{11}$' - elif len(PhoneNumber['full']) == 12: + elif re.match(r'(?:\+)?[0-9]{3}(?:0)?[0-9]{10}', PhoneNumber['full']): countryCodeRegex = r'[0-9]{10}$' - elif len(PhoneNumber['full']) == 11: + elif re.match(r'(?:\+)?[0-9]{3}(?:0)?[0-9]{9}', PhoneNumber['full']): countryCodeRegex = r'[0-9]{9}$' - elif len(PhoneNumber['full']) == 10: + elif re.match(r'(?:\+)?[0-9]{3}(?:0)?[0-9]{8}', PhoneNumber['full']): countryCodeRegex = r'[0-9]{8}$' + elif re.match(r'(?:\+)?[0-9]{1}(?:0)?[0-9]{10}', PhoneNumber['full']): + countryCodeRegex = r'[0-9]{10}$' else: - countryCodeRegex = r'[0-9]{7}$' + print code_error + 'Unable to identify format. Ignore this scan.' + countryCodeRegex = r'[0-9]{9}$' PhoneNumber['countryCode'] = re.sub(countryCodeRegex, '', PhoneNumber['full']) PhoneNumber['number'] = PhoneNumber['full'].replace(PhoneNumber['countryCode'], '') return PhoneNumber -def searchCountryCode(countryCode): +def searchCountryCode(countryCode, number): print code_info + 'Searching for country in format...' with open('./data/country_codes.json') as CountryCodesFile: country_codes = json.load(CountryCodesFile) for country in country_codes: if country['dial_code'] == '+' + countryCode: + print code_result + 'Local format: (0)' + number print code_result + 'Country code: +' + countryCode print code_result + 'Country found: %s (%s)' % (country['name'],country['code']) - with open('./data/area_codes.json') as AreaCodesFile: - area_codes = json.load(AreaCodesFile) - for area_country in area_codes: - if area_country['CountryCode'] == country['code']: - for area in area_country['AreaCodes']: - if area == "10": - print 'y' #check for area code #print code_result + 'Areas found (approximate) : Bordeaux, Limoges' @@ -251,18 +246,16 @@ def freecarrierlookupScan(countryCode, number): def scanNumber(number): PhoneNumber = formatNumber(number) - print "\033[1m\033[93m[!] ---- Fetching informations for (0)" + PhoneNumber['number'] + " ---- [!]" + print "\033[1m\033[93m[!] ---- Fetching informations for (+)" + PhoneNumber['full'] + " ---- [!]" print code_info + 'Parsing informations from format...' - print code_result + 'Local format: (0)' + PhoneNumber['number'] - if not isNumberValid(PhoneNumber['full']): print(code_error + "Error: number " + number + " is not valid. Skipping.") sys.exit() # Check dial code - searchCountryCode(PhoneNumber['countryCode']) + searchCountryCode(PhoneNumber['countryCode'], PhoneNumber['number']) #check area code by country #if found in area codes -> landline From 518004f3483785ddc7fc7a8874ce01995f8dc88e Mon Sep 17 00:00:00 2001 From: sundowndev Date: Tue, 13 Nov 2018 23:49:16 +0100 Subject: [PATCH 8/9] Requirements --- requirements.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1ff83f7..582be52 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,5 @@ requests -json -argparse -re ovh bs4 html5lib +phonenumbers From 1dd679acfad054f0dd18173443bc6c22a1cc206a Mon Sep 17 00:00:00 2001 From: sundowndev Date: Tue, 13 Nov 2018 23:51:44 +0100 Subject: [PATCH 9/9] Import/use phonenumbers lib --- phoneinfoga.py | 109 ++++++++++++++++++++----------------------------- 1 file changed, 44 insertions(+), 65 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index 7dc9c1c..7ca9179 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -1,13 +1,5 @@ #!/usr/bin/env python -import requests -import sys -import hashlib -import json -import argparse -from bs4 import BeautifulSoup -import re - __version__ = '0.3-dev' print "\n \033[92m" @@ -21,6 +13,18 @@ print " PhoneInfoga Ver. %s " % __v print " Coded by Sundowndev " print "\033[94m\n" +import requests +import sys +import hashlib +import json +import argparse +from bs4 import BeautifulSoup +import re +import phonenumbers +from phonenumbers import carrier +from phonenumbers import geocoder +from phonenumbers import timezone + parser = argparse.ArgumentParser(description= "Advanced information gathering tool for phone numbers (https://github.com/sundowndev/PhoneInfoga) version %s" % __version__, usage='%(prog)s -n [options]') @@ -60,61 +64,42 @@ code_warning = '\033[93m(!) ' code_result = '\033[1;32m[+] ' code_error = '\033[91m[!] ' -def parseInput(file): - print 'parse' - -def saveToOutput(): +def saveToOutput(output): print 'save' -def isNumberValid(PhoneNumber): - if len(PhoneNumber) < 9 and len(PhoneNumber) > 13: - return False - elif not re.match("^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$", PhoneNumber): - return False - else: - return True +def localScan(number): + print code_info + 'Running local scan...' -def formatNumber(number): PhoneNumber = dict(); - PhoneNumber['full'] = number.replace("+", "").replace("\n", "").replace(" ", "") + FormattedPhoneNumber = number.replace("\n", "").replace("-", "").replace(" ", "") - if re.match(r'(?:1){1}[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{6}', PhoneNumber['full']): - countryCodeRegex = r'[0-9]{10}$' - elif re.match(r'(?:\+)?[0-9]{3}(?:0)?[0-9]{10}', PhoneNumber['full']): - countryCodeRegex = r'[0-9]{10}$' - elif re.match(r'(?:\+)?[0-9]{3}(?:0)?[0-9]{9}', PhoneNumber['full']): - countryCodeRegex = r'[0-9]{9}$' - elif re.match(r'(?:\+)?[0-9]{3}(?:0)?[0-9]{8}', PhoneNumber['full']): - countryCodeRegex = r'[0-9]{8}$' - elif re.match(r'(?:\+)?[0-9]{1}(?:0)?[0-9]{10}', PhoneNumber['full']): - countryCodeRegex = r'[0-9]{10}$' + try: + PhoneNumberObject = phonenumbers.parse(FormattedPhoneNumber, None) + except: + return False else: - print code_error + 'Unable to identify format. Ignore this scan.' - countryCodeRegex = r'[0-9]{9}$' + if not phonenumbers.is_valid_number(PhoneNumberObject): + return False - PhoneNumber['countryCode'] = re.sub(countryCodeRegex, '', PhoneNumber['full']) - PhoneNumber['number'] = PhoneNumber['full'].replace(PhoneNumber['countryCode'], '') + PhoneNumber['full'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace('+', '') + PhoneNumber['countryCode'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL).split(' ')[0] + PhoneNumber['number'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(PhoneNumber['countryCode'], '') - return PhoneNumber + print code_result + 'Local format: (0)' + PhoneNumber['number'] + print code_result + 'Country code: ' + PhoneNumber['countryCode'] + print code_result + 'Location: %s' % geocoder.description_for_number(PhoneNumberObject, "en") + print code_result + 'Carrier: %s' % carrier.name_for_number(PhoneNumberObject, 'en') + print code_result + 'Area: %s' % geocoder.description_for_number(PhoneNumberObject, 'en') + #print '\033[1;32m[+] Timezone: %s, %s' % (timezone.time_zones_for_number(PhoneNumberObject)[0],timezone.time_zones_for_number(PhoneNumberObject)[1]) + #print code_info + 'This is most likely a landline, or a fixed VoIP.' -def searchCountryCode(countryCode, number): - print code_info + 'Searching for country in format...' + if phonenumbers.is_possible_number(PhoneNumberObject): + print code_info + 'The number is valid and possible.' + else: + print code_warning + 'The number is valid but might not be possible.' - with open('./data/country_codes.json') as CountryCodesFile: - country_codes = json.load(CountryCodesFile) - for country in country_codes: - if country['dial_code'] == '+' + countryCode: - print code_result + 'Local format: (0)' + number - print code_result + 'Country code: +' + countryCode - print code_result + 'Country found: %s (%s)' % (country['name'],country['code']) - - #check for area code - #print code_result + 'Areas found (approximate) : Bordeaux, Limoges' - - #check for carrier - #print '\033[1;32m[+] Carrier found: France Sfr Mobile' - #print code_info + 'This is most likely a landline, or a fixed VoIP.' + return PhoneNumber def numverifyScan(PhoneNumber): if not args.scanner == 'numverify' and not args.scanner == 'all': @@ -244,31 +229,25 @@ def freecarrierlookupScan(countryCode, number): print code_result + 'MMS Gateway Address: ' def scanNumber(number): - PhoneNumber = formatNumber(number) + print "\033[1m\033[93m[!] ---- Fetching informations for %s ---- [!]" % number - print "\033[1m\033[93m[!] ---- Fetching informations for (+)" + PhoneNumber['full'] + " ---- [!]" + print code_info + 'Parsing informations...' - print code_info + 'Parsing informations from format...' + PhoneNumber = localScan(number) - if not isNumberValid(PhoneNumber['full']): + if not PhoneNumber: print(code_error + "Error: number " + number + " is not valid. Skipping.") sys.exit() - # Check dial code - searchCountryCode(PhoneNumber['countryCode'], PhoneNumber['number']) - - #check area code by country - #if found in area codes -> landline - numverifyScan(PhoneNumber['full']) - ovhScan('fr', PhoneNumber['full']) - freecarrierlookupScan(PhoneNumber['countryCode'], PhoneNumber['number']) + ovhScan('fr', PhoneNumber['full']) # TODO: replace 1st parameter to be dynamic + #freecarrierlookupScan(PhoneNumber['countryCode'], PhoneNumber['number']) #whosenumberScan(PhoneNumber['countryCode'], PhoneNumber['number']) #repScan(PhoneNumber['countryCode'], PhoneNumber['number']) print '\n' -# Verify scanner +# Verify scanner option if not args.scanner in scanners: print(code_error + "Error: scanner doesn't exists.") sys.exit()