import csv
import json
import sys
import time
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
def_9xx = dict()
zone_t = dict()
number_info = []
def russia_num(phone: str):
if phone[0:1] in ["8", "7"] and phone[1:2] == "9":
zone_find(phone[1:4], phone[4:], phone)
elif phone[0:1] == "+" and phone[2:3] == "9":
zone_find(phone[2:5], phone[5:], phone)
else:
number_info.append(f'{phone}: "---"')
def zone_find(zone: str, number: str, phone: str):
global def_9xx, zone_t, number_info
for zn in def_9xx:
if zone == zn:
for rng in def_9xx[zn]:
if int(number) in range(int(rng.split(",")[0]), int(rng.split(",")[1])):
try:
print(f'\n[+] Информация о номере: {phone}:\n - Провайдер (ОпСоС): '
f'{def_9xx[zn][rng].split(",")[0].strip()}\n '
f'- Регион: {def_9xx[zn][rng].split(",")[1].strip()}\n - Часовой пояс: '
f'{zone_t[def_9xx[zn][rng].split(",")[1].strip()]}')
number_info.append(f'{phone}: {def_9xx[zn][rng].split(",")[0].strip()}')
return
except KeyError:
print(f'\n[+] Информация о номере: {phone}:\n - Провайдер (ОпСоС): '
f'{def_9xx[zn][rng].split(",")[0].strip()}\n '
f'- Регион: {def_9xx[zn][rng].split(",")[1].strip()}')
number_info.append(f'{phone}: {def_9xx[zn][rng].split(",")[0].strip()}')
return
number_info.append(f'{phone}: "---"')
def conv():
global def_9xx
with open(Path.cwd() / 'guides' / 'DEF-9xx.csv', "r", encoding='utf-8') as f:
readers = csv.reader(f, delimiter="\t")
for num, line in enumerate(readers):
if num != 0:
ln = line[0].split(";")
if ln[0] not in def_9xx:
def_9xx[ln[0]] = dict()
opsos = f'{ln[4]}, {ln[5]}'
rng = f'{ln[1]},{ln[2]}'
def_9xx[ln[0]].update({rng: opsos})
def main():
global zone_t, number_info
if not (Path.cwd() / 'guides' / 'zone.json').exists():
print("Отсутствует справочник с временными зонами 'zone.json'")
sys.exit(0)
with open(Path.cwd() / 'guides' / 'zone.json', 'r', encoding='utf-8') as f:
zone_t.update(json.load(f))
if not (Path.cwd() / 'guides' / 'DEF-9xx.csv').exists():
print("Отсутствует справочник с диапазонами номеров операторов 'DEF-9xx.csv'")
sys.exit(0)
conv()
path = input("Введите путь к файлу с номерами: ")
t = time.monotonic()
if not Path(path).exists() or not Path(path).is_file() or not path:
print("Введенного пути не существует")
sys.exit(0)
print('\n* ИНФОРМАЦИЯ О НОМЕРЕ ТЕЛЕФОНА. РЕГИОН, ОПЕРАТОР И ЧАСОВОЙ ПОЯС *\n')
with open(path, 'r', encoding='utf-8') as file:
with ThreadPoolExecutor(max_workers=5) as executor:
for phone in file.readlines():
phone = phone.replace("-", "").replace("(", "").replace(")", "").replace(" ", "").strip()
if phone[0:1] == "+":
if phone[1:2] == "7":
executor.submit(russia_num, phone=phone)
elif phone[0:1] == "7":
executor.submit(russia_num, phone=phone)
elif phone[0:1] == "8":
executor.submit(russia_num, phone=phone)
else:
number_info.append(f'{phone}: "---"')
if number_info:
with open('numbers_find.txt', 'w', encoding='utf-8') as fl:
for item in number_info:
fl.write(f'{item}\n')
print(f'\nВремя поиска номеров: '
f'{(int(time.monotonic() - t) // 3600) % 24:d} ч. '
f'{(int(time.monotonic() - t) // 60) % 60:02d} м. '
f'{int(time.monotonic() - t) % 60:02d} с.')
print(time.monotonic() - t)
if __name__ == "__main__":
main()