• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Получаем общедоступные данные по номеру телефона с помощью Python

Можно ли по номеру телефона узнать местоположение абонента? Безусловно, да. Тут нужно правильно задать вопрос: «Кому это можно сделать?» К сожалению, ответ для нас с вами не особо утешителен.

- Есть варианты за деньги, то есть оплачиваешь тарифный план и пользуешься. Как правило, такие сервисы предоставляют данные на основе HLR-запросов.
- Есть вариант хакнуть сеть сигнализации SS7. Но, тут уж как звезды сойдутся. Да и не получиться это сделать у любого человека с улицы. У вас должен быть выход в эту сеть, плюс к тому возможность формировать любые сообщения сигнализации, а также в сети не должно быть фильтрации некорректных или подозрительных сообщений SS7.
- И как вариант, запрос правоохранительных органов.

Если вы не нашли своего состояния в данных описаниях, то скорее всего просто так получить данные у вас не получиться.

000.png



Получение местонахождения мобильного телефона

Первый – это получение примерного местонахождения с помощью HLR-запроса отправленного в СМС-центр. Подробнее о данном способе можно поискать информацию в интернете, да и наверняка вы видели рекламу сервисов предоставляющих эту услугу. Здесь есть подводные камни. Не всегда можно получить данные с высокой точностью. Вернее даже, о точности тут речь не ведется. Если город достаточно крупный, то возможно у вас получиться улучшить результаты. Если же нет, тут уж как повезет. У многих операторов коммутаторы расположены не в тех городах, где находиться абонент, а где-нибудь в другом городе, откуда данный коммутатор и обслуживает всех абонентов. Ведь вспомните, когда вы разрешаете сервисам геолокации определить ваше местонахождение, то есть без использования GPS, то ваше местоположение зачастую определяется неправильно. У меня, например, всегда разные результаты.

А вот в Европе с этим получше. Там коммутаторы установлены в каждом областном центре и крупном городе. А потому, информация, полученная с данных коммутаторов будет намного выше и позволит даже отследить перемещение телефона из соты в соту.

Второй способ – каким-то чудесным образом получить IP-адрес сотового телефона. В этом может помочь сниффер. Но такой способ тоже полон недостатков. Для начала, этот способ поможет получить город, но не точное местоположение. Ну и потом, те сервисы, что предоставляют информацию, не всегда обладают достаточно полной базой, чтобы определить геопозицию по IP.

Еще один способ, получить ваше местоположение с помощью технологии HTML5 Geolocation. Тут уже точность повыше. Так как используется как вычисление до положения на основе близости от вышки оператора, так и получение GPS-координат. Так же возможно получение местоположения, если вы подключены к какому-либо из публичных Wi-Fi. Тут все зависит от того, есть ли Wi-Fi на общедоступной карте размещения роутеров. Ну и используется также получение местоположения по IP. То есть, некая совокупность способов. Однако, это доступно для телефона. А не для человека, который просто запросил данные по номеру.

Лучше всего вас могут найти сотовые операторы, которые вычисляют ваше местоположение методом триангуляции. Здесь уже точность обнаружения может варьироваться до 50-ти метров. Этими же данными пользуются правоохранительные органы, которые запрашивают их у операторов.

Ну и еще один способ – банальный обман пользователя. Если вы зададитесь целью и поищете, то найдете массу сервисов подобного толка. Здесь вам будет предлагаться ввести номер телефона и протестировать данную услугу. Вот только не думайте, что это можно проделать несколько раз. Если бы все было так просто, то этими сервисами пользовались бы все. И нужды в особых услугах не было бы. Но, тут, специально для вас изобразят бурный поиск данных, после чего определят примерное местонахождение, которое в лучшем случае покажет область регистрации телефона. Все остальные данные будут якобы доступны после регистрации и оплаты тарифного плана. Но, увы, это не так. Главное здесь, заставить вас заплатить. А все остальное – это уже ваши проблемы.

А что же с питоном? Можно ли с его помощью установить местонахождение? Тут все довольно просто. Конечно же, если вы ОпСоС, то вам возможно все. В пределах вашей сети, конечно. А то и дальше. Но, нам, простым смертным доступно не так много опций. Давайте напишем небольшой скрипт, который будет получать те данные, которые есть в общем доступе. А вот что для этого понадобиться, об этом немного ниже.

Возможно, что особо практической пользы данный скрипт не несет, кроме общеобразовательных целей и практики. Ну и может пригодиться, если вам на скорую руку нужно узнать оператора и регион звонившего. Ну и да, для работы скрипта не требуется интернет при работе с российскими номерами. А вот те, что прогоняются через стороннюю библиотеку, тут уж да, интернет будет не лишним.


Что понадобиться?

Установить библиотеку phonenumbers. Делается это просто. Запустите терминал и введите команду:

pip install phonenumbers

В принципе, эта библиотека не особо нужна. Но, для обработки номеров отличных от российских она вполне пригодиться. Далее нужно скачать справочник Роснумерации. Лежит он в открытом доступе, но на момент написания статьи был недоступен. . Написано было, что проводятся технические работы. Поэтому я еще немного поискал и нашел данный справочник . На данной странице нас интересует «Выписка по диапазону 9xx», то есть, мобильных операторов связи. Предоставляется она в формате csv, а потому, я ее даже не стал переименовывать, а работал с тем, что скачалось. Ну и небольшой файлик в формате json, который я уже скомпоновал сам, из того, что было. В нем содержаться регионы и их часовые пояса. Для совместимости со справочником Роснумерации названия регионов такие же, как в нем. Я его выложу в прикрепленных файлах. А если не позволит размер, то размещу на Яндекс.Диске и дам ссылку на загрузку.


А теперь давайте писать код

Для начала импортируем все, что понадобиться в скрипте:

Python:
import csv
import json

from phonenumbers.phonenumberutil import NumberParseException
from phonenumbers import parse
from phonenumbers import geocoder
from phonenumbers import timezone
from phonenumbers import carrier

Из нестандартного тут только библиотека phonenumbers, из которой пришлось импортировать модули по отдельности, но только лишь исключительно ради удобства. Давайте сегодня начнем с функции main(). В ней происходит начало действа с номерами телефонов.

Для начала печатается строка в которой говориться, что тут вообще происходит. Далее запрашивается номер телефона пользователя, который приводиться в нужный вид путем замещения всяких «лишних» символов. Впрочем, все предусмотреть невозможно. Если только поместить в список всю клавиатуру и заменять все, что не соответствует номеру телефона ))

Затем проверяется первый символ. Если это плюс, то смотрим дальше второй символ. И если это 7, то тогда вызываем функцию обработки российских номеров. Ну и так же для первого символа 8. Если же это не так, работу с номером передаем в цепкие лапы phonenumbers.

Python:
def main():
    print('\n* ИНФОРМАЦИЯ О НОМЕРЕ ТЕЛЕФОНА. РЕГИОН, ОПЕРАТОР И ЧАСОВОЙ ПОЯС *\n')
    phone = input('Введите номер >>> ').replace("-", "").replace("(", "").replace(")", "").replace(" ", "")
    if phone[0:1] == "+":
        if phone[1:2] == "7":
            russia_num(phone)
        else:
            phnum_parse(phone)
    elif phone[0:1] == "8":
        russia_num(phone)
    else:
        phnum_parse(phone)

Следующей будет функция обработки российских номеров. Я назвал ее russia_num(phone) и на вход она принимает номер телефона. Тут идет проверка первого и третьего символа в случае с плюсом и первого и второго в случае с восьмеркой. Нужно это для того, чтобы разделить номер телефона на части, которые и будут участвовать в проверке.

Дело в том, что номер телефона, после +7 или 8, что является кодом страны, содержит в себе еще и зону нумерации, которая состоит из трех цифр. Как раз таки вот эти вот 913, 905 и прочие. А дальше идет собственно сам номер телефона. Вот их то и будет проверять.

Структура загруженного справочника такова, что в нем содержится в первом столбце зона нумерации, во втором и третьем диапазон номеров для данной зоны. Дальше идет емкость, которая нам не нужна, а после оператор, регион и ИНН оператора. Вот оператора и регион мы будем забирать. Итак, из данного справочника необходимо забрать зону нумерации, диапазон, оператора и регион.

screenshot5.png

Вернемся к коду. На основании плюса или восьмерки забираем зону нумерации. Здесь еще делается проверка на то, идет после 7-ки или 8-ки девятка. Так как в Казахстане, к примеру, номера так же могут начинаться на +7. Что приведет к ошибке. И если все в порядке, и девятка обнаружена, вызывается функция распарсивания csv. Если же нет, номер телефона передается библиотеке phonenumbers.

Python:
def russia_num(phone):
    if phone[0:1] == "+" and phone[2:3] == "9":
        num_one = phone[2:5]
        two_num = phone[5:]
        csv_read(num_one, two_num, phone)
    elif phone[0:1] == "8" and phone[1:2] == "9":
        num_one = phone[1:4]
        two_num = phone[4:]
        csv_read(num_one, two_num, phone)
    else:
        phnum_parse(phone)

Теперь код функции обработки номера с помощью библиотеки phonenumbers. Назвал функцию phnum_parse(phone). На вход она принимает номер телефона. Уж, почему у функции такое странное название не помню. Наверняка, на момент, когда я ее обзывал, оно что-то значило.

Для начала с помощью функции parse распарсиваем номер телефона. Справиться она может далеко не со всеми номерами. К примеру, вообще не работает с номерами Армении и еще какой-то страны, код которых начинается с 0. Но это частности. Тем не менее, функция падает в осадок, а потому надо этот осадок поймать. Заключаем распарсивание номера в блок try-except. Ну и если что-то не так, возвращаем принт о неправильном регионе и катапультируемся из функции вообще. Если же все в порядке, идем дальше. А дальше определяем часовой пояс с помощью timezone.time_zones_for_number, в которую передаем распарсенный номер телефона. Затем определяем регион или страну. Тут уже по-разному. В geocoder.description_for_number передаем номер телефона и указываем обязательный параметр – язык вывода результата. У меня стоит русский.

Определяем оператора carrier.name_for_number, в которого так же передаем распарсенный номер телефона и язык вывода. А дальше проверяем, не является ли одна из переменных с пустым значением, так как иногда оператор не определяется или другой параметр. Вместо них подставляем Unknown. Исключение пришлось сделать только для часового пояса, так как это значение заменить не получалось. Потому пришлось указать полный принт. После этого принта функция завершается. Если же нет, то переходит к принту уже с полными или замененными параметрами.

Python:
def phnum_parse(phone):
    try:
        ph_parse = parse(phone)
    except NumberParseException:
        print('[-] Неправильный регион')
        return
    ph_timezone = timezone.time_zones_for_number(ph_parse)
    ph_region = geocoder.description_for_number(ph_parse, 'ru')
    ph_prov = carrier.name_for_number(ph_parse, 'ru')
    if ph_prov == "":
        ph_prov = "Unknown"
    elif ph_region == "":
        ph_region = "Unknown"
    elif ph_timezone[0] == "":
        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
              f'- Регион: {ph_region}\n    - Часовой пояс: Unknown')
        return
    print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
          f'- Регион: {ph_region}\n    - Часовой пояс: {ph_timezone[0]}')

Ну и, собственно, распарсивание csv. Я так эту функцию и назвал csv_read(zone, number, phone). В нее передается зона нумерации, номер телефона и полный номер, который мы получили после ввода. Сначала я его передавать не хотел, а хотел собрать из того, что есть. А потом подумал, что так будет при печати покрасивее ))

Итак, поехали. Открываем и читаем файл json с часовыми поясами. Затем отрываем справочник Роснумерации и тоже читаем. В цикле пробегаемся по нему, где делаем проверки. Первая проверка это на нулевую строку. В ней содержаться заголовки. А они нам совершенно не нужны, потому мы их просто пропускаем. Затем пилим полученную строку по точке с запятой и забираем нулевой элемент. Если вы помните, то в справочнике здесь лежит зона нумерации. Сравниваем ее с той, что в номере телефона. Если не она, идем дальше. Ах, да, чуть не забыл. Здесь еще и проверяется одновременным условием and, входит ли номер в диапазон, если все же зона нумерации совпадает. Ну и так до самого совпадения. После чего в цикле забирается информация о часовом поясе, если она есть в json и все это добро печатается в терминал. С или без часового пояса.

Python:
def csv_read(zone, number, phone):
    with open('zone.json', 'r', encoding='utf-8') as f:
        zone_t = json.load(f)
    with open("DEF-9xx.csv", "r", encoding='utf-8') as f:
        reader = csv.reader(f, delimiter="\t")
        for i, line in enumerate(reader):
            if i != 0:
                if line[0].split(";")[0] == zone and \
                        [k for k in range(int(line[0].split(";")[1]), int(line[0].split(";")[2])) if int(number) == k]:
                    prov = line[0].split(";")[4]
                    region = line[0].split(";")[5].strip()
                    try:
                        for z in zone_t:
                            if region in z:
                                time_zone = z[region]
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}\n    - Часовой пояс: {time_zone}')
                        return
                    except KeyError:
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}')
                        return

Вот, в принципе и все. Как видите, информации не густо. И это то, что можно получить, не прибегая ни к каким уловкам. Все остальное, это уже проверки в базах утечек или в гетконтактах. Это немного не то. А вот именно та информация, которая общедоступная, по большей части вся. Ну да, тут еще можно было выкорчевать ИНН оператора. Но он, наверное, не нужен.

Понятно дело, что я мог что-то упустить или недоглядеть, так как не претендую на полноту информации. Если да, то подскажите. С удовольствием покопаю в этом направлении.

Python:
# pip install phonenumbers

import csv
import json

from phonenumbers.phonenumberutil import NumberParseException
from phonenumbers import parse
from phonenumbers import geocoder
from phonenumbers import timezone
from phonenumbers import carrier


def russia_num(phone):
    if phone[0:1] == "+" and phone[2:3] == "9":
        num_one = phone[2:5]
        two_num = phone[5:]
        csv_read(num_one, two_num, phone)
    elif phone[0:1] == "8" and phone[1:2] == "9":
        num_one = phone[1:4]
        two_num = phone[4:]
        csv_read(num_one, two_num, phone)
    else:
        phnum_parse(phone)


def csv_read(zone, number, phone):
    with open('zone.json', 'r', encoding='utf-8') as f:
        zone_t = json.load(f)
    with open("DEF-9xx.csv", "r", encoding='utf-8') as f:
        reader = csv.reader(f, delimiter="\t")
        for i, line in enumerate(reader):
            if i != 0:
                if line[0].split(";")[0] == zone and \
                        [k for k in range(int(line[0].split(";")[1]), int(line[0].split(";")[2])) if int(number) == k]:
                    prov = line[0].split(";")[4]
                    region = line[0].split(";")[5].strip()
                    try:
                        for z in zone_t:
                            if region in z:
                                time_zone = z[region]
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}\n    - Часовой пояс: {time_zone}')
                        return
                    except KeyError:
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}')
                        return


def phnum_parse(phone):
    try:
        ph_parse = parse(phone)
    except NumberParseException:
        print('[-] Неправильный регион')
        return
    ph_timezone = timezone.time_zones_for_number(ph_parse)
    ph_region = geocoder.description_for_number(ph_parse, 'ru')
    ph_prov = carrier.name_for_number(ph_parse, 'ru')
    if ph_prov == "":
        ph_prov = "Uncnown"
    elif ph_region == "":
        ph_region = "Uncnown"
    elif ph_timezone[0] == "":
        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
              f'- Регион: {ph_region}\n    - Часовой пояс: Uncnown')
        return
    print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
          f'- Регион: {ph_region}\n    - Часовой пояс: {ph_timezone[0]}')
  

def main():
    print('\n* ИНФОРМАЦИЯ О НОМЕРЕ ТЕЛЕФОНА. РЕГИОН, ОПЕРАТОР И ЧАСОВОЙ ПОЯС *\n')
    phone = input('Введите номер >>> ').replace("-", "").replace("(", "").replace(")", "").replace(" ", "")
    if phone[0:1] == "+":
        if phone[1:2] == "7":
            russia_num(phone)
        else:
            phnum_parse(phone)
    elif phone[0:1] == "8":
        russia_num(phone)
    else:
        phnum_parse(phone)
  

if __name__ == "__main__":
    main()

P.S.: Одно время ездил по вахтам и у меня много накопилось номеров телефонов. Да и так, самых разных, со временем. Когда сделал скрипт, сидел, баловался, определял регион и оператора :LOL:

Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезной
 

Вложения

  • zone.zip
    1,7 КБ · Просмотры: 1 146

And4R

One Level
05.01.2022
2
1
BIT
2
а номер +4..... польша этим скриптом проверить можно ,я ещё плохо в этом соображаю ... поможете. спасибо
 

Brute_al

New member
21.08.2022
2
0
BIT
0
Не совсем понятно куда вбивать диапазон и т.д. Можно привести пример с использованием российских номеров? Это было бы наглядней для новичков.
 

Johan Van

Green Team
13.06.2020
355
671
BIT
239
Не совсем понятно куда вбивать диапазон и т.д. Можно привести пример с использованием российских номеров? Это было бы наглядней для новичков.

Если честно, то не особо понял ваш вопрос про диапазон. Здесь, в принципе, работа и идет с российскими номерами. А библиотека phonenumbers как раз-таки для обработки не российских номеров. То есть, смотрите:

1. Пользователь вводит номер телефона.
2. Выполняется замена сопутствующих символов. так как номер можно ввести по разному, то есть, для примера: 8(920)0000000. Так вот скобочки надо убрать.
3. Затем проверяем, российский ли это номер. То есть, смотрим, есть ли в номере +. Если есть, смотрим дальше, есть ли в номере 7. Если да - номер российский. Передаем номер дальше в функцию разбивки на код страны, зону нумерации и номер. Если не российский - передаем для обработки с помощью библиотеки phonenumbers. Аналогично проверяем восьмерку в начале.
4. Если номер российский, передаем его в функцию russia_num(phone). Здесь мы просто отделяем код страны от зоны нумерации и номера. А так как количество символов в номере телефона может быть разное, ведь можно записать его как 8900, а можно +7900, тут и нужно проверять, какие символы идут в начале и далее. От того, насколько правильно мы получим зону нумерации, будет зависеть точность определения региона.
5. После того, как получена зона нумерации и номер, передаем их в фунукцию csv_read(num_one, two_num, phone).
6. В функции csv_read считываются два справочника. Один, полученный с сайта Роснумерации, и второй, который я составил сам. В нем просто записаны регионы и часовые пояса. Для начала считывается файл csv построчно. Берется первый элемент, именно в нем содержится зона нумерации и сравнивается с той зоной нумерации, что мы получили из телефона введенного пользователем. Если они равны, и номер телефона находиться в диапазоне номеров определенного региона, то забираем провайдера и регион. Затем ищем регион во втором справочнике и забираем оттуда часовой пояс. После чего выводим на экран полученную информацию.

Вот в принципе и все. Простой поиск в файлах. Это что касается российских номеров.

Если вам непонятно какое-то место в коде, укажите, какое именно и где, чтобы дать более точные пояснения.

Ну и если вам непонятно, про диапазон, то вот вам цитата из статьи:

Структура загруженного справочника такова, что в нем содержится в первом столбце зона нумерации, во втором и третьем диапазон номеров для данной зоны. Дальше идет емкость, которая нам не нужна, а после оператор, регион и ИНН оператора. Вот оператора и регион мы будем забирать. Итак, из данного справочника необходимо забрать зону нумерации, диапазон, оператора и регион.

То есть, вам надо открыть справочник и посмотреть, как там все расположено.
 

bigsky

Member
09.12.2020
8
0
BIT
0
@Johan Van, Здравствуйте.
Спасибо за полезную информацию.
Пожалуйста, подскажите, как для python 3 будет выглядеть готовый/полный скрипт ТОЛЬКО для определения российских операторов сотовой связи всего списка номеров на +7 из .txt файла?
 
Последнее редактирование:

Johan Van

Green Team
13.06.2020
355
671
BIT
239
@Johan Van, Здравствуйте.
Спасибо за полезную информацию.
Пожалуйста, подскажите, как для python 3 будет выглядеть готовый/полный скрипт ТОЛЬКО для определения российских операторов сотовой связи всего списка номеров на +7 из .txt файла?

Предположим, у вас есть текстовый документ numbers.txt со следующим содержимым:

Код:
+7(923)004-15-95
+7(923)091-07-95
+7(923)786-04-04
+7(923)054-26-47
+7(923)175-17-58
+7(923)267-94-65
+7(923)955-65-08
+7(923)554-57-28
+7(923)618-84-44
+7(923)304-49-05

Для того, чтобы получить информацию о всех номерах из файла, нужно этот файл открыть для чтения, проитерироваться по нему построчно и здесь же в цикле передавать в функцию определения операторов по одному номеру. То есть, необходимо слега изменить код main().


Python:
# pip install phonenumbers

import csv
import json

from phonenumbers.phonenumberutil import NumberParseException
from phonenumbers import parse
from phonenumbers import geocoder
from phonenumbers import timezone
from phonenumbers import carrier


def russia_num(phone):
    if phone[0:1] == "+" and phone[2:3] == "9":
        num_one = phone[2:5]
        two_num = phone[5:]
        csv_read(num_one, two_num, phone)
    elif phone[0:1] == "8" and phone[1:2] == "9":
        num_one = phone[1:4]
        two_num = phone[4:]
        csv_read(num_one, two_num, phone)
    else:
        phnum_parse(phone)


def csv_read(zone, number, phone):
    with open('zone.json', 'r', encoding='utf-8') as f:
        zone_t = json.load(f)
    with open("DEF-9xx.csv", "r", encoding='utf-8') as f:
        reader = csv.reader(f, delimiter="\t")
        for i, line in enumerate(reader):
            if i != 0:
                if line[0].split(";")[0] == zone and \
                        [k for k in range(int(line[0].split(";")[1]), int(line[0].split(";")[2])) if int(number) == k]:
                    prov = line[0].split(";")[4]
                    region = line[0].split(";")[5].strip()
                    try:
                        for z in zone_t:
                            if region in z:
                                time_zone = z[region]
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}\n    - Часовой пояс: {time_zone}')
                        return
                    except KeyError:
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}')
                        return


def phnum_parse(phone):
    try:
        ph_parse = parse(phone)
    except NumberParseException:
        print('[-] Неправильный регион')
        return
    ph_timezone = timezone.time_zones_for_number(ph_parse)
    ph_region = geocoder.description_for_number(ph_parse, 'ru')
    ph_prov = carrier.name_for_number(ph_parse, 'ru')
    if ph_prov == "":
        ph_prov = "Uncnown"
    elif ph_region == "":
        ph_region = "Uncnown"
    elif ph_timezone[0] == "":
        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
              f'- Регион: {ph_region}\n    - Часовой пояс: Uncnown')
        return
    print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
          f'- Регион: {ph_region}\n    - Часовой пояс: {ph_timezone[0]}')


def main():
    print('\n* ИНФОРМАЦИЯ О НОМЕРЕ ТЕЛЕФОНА. РЕГИОН, ОПЕРАТОР И ЧАСОВОЙ ПОЯС *\n')
    with open('numbers.txt', 'r', encoding='utf-8') as file:
        for phone in file.readlines():
            phone = phone.replace("-", "").replace("(", "").replace(")", "").replace(" ", "")
            if phone[0:1] == "+":
                if phone[1:2] == "7":
                    russia_num(phone)
                else:
                    phnum_parse(phone)
            elif phone[0:1] == "8":
                russia_num(phone)
            else:
                phnum_parse(phone)


if __name__ == "__main__":
    main()

ну и все файлы прикреплю к ответу, для примера.
Скриншот работы скрипта ниже:

screenshot1.png
 

Вложения

  • numbers.zip
    99,2 КБ · Просмотры: 193

bigsky

Member
09.12.2020
8
0
BIT
0
@Johan Van, Спасибо.
Мной несколько был переделан ваш код:
Python:
import csv
import json

def russia_num(phone):
    num_one = phone[1:4]
    two_num = phone[4:]
    csv_read(num_one, two_num, phone)

def csv_read(zone, number, phone):
    with open("DEF-9xx.csv", encoding='utf-8') as f:
        reader = csv.reader(f, delimiter="\t")
        for i, line in enumerate(reader):
            if i != 0:
                if line[0].split(";")[0] == zone and \
                        [k for k in range(int(line[0].split(";")[1]), int(line[0].split(";")[2])) if int(number) == k]:
                    prov = line[0].split(";")[4]
                    print(f'{prov}')

def main():
    with open('numbers.txt', encoding='utf-8') as file:
        for phone in file.readlines():
            russia_num(phone)

if __name__ == "__main__":
    main()
теперь код делает то, что мне нужно – из файла numbers.txt читает номера формата 79991112211.
Единственное НО – скорость получения результата очень низкая. Мне думалось, что Python будет справляться с этой задачей намного быстрее.
 

Johan Van

Green Team
13.06.2020
355
671
BIT
239
@Johan Van, Спасибо.
Мной несколько был переделан ваш код:
Python:
import csv
import json

def russia_num(phone):
    num_one = phone[1:4]
    two_num = phone[4:]
    csv_read(num_one, two_num, phone)

def csv_read(zone, number, phone):
    with open("DEF-9xx.csv", encoding='utf-8') as f:
        reader = csv.reader(f, delimiter="\t")
        for i, line in enumerate(reader):
            if i != 0:
                if line[0].split(";")[0] == zone and \
                        [k for k in range(int(line[0].split(";")[1]), int(line[0].split(";")[2])) if int(number) == k]:
                    prov = line[0].split(";")[4]
                    print(f'{prov}')

def main():
    with open('numbers.txt', encoding='utf-8') as file:
        for phone in file.readlines():
            russia_num(phone)

if __name__ == "__main__":
    main()
теперь код делает то, что мне нужно – из файла numbers.txt читает номера, начинающиеся на 7.
Единственное НО – скорость получения результата очень низкая. Мне думалось, что Python будет справляться с этой задачей намного быстрее.

если вы обрабатываете много файлов, имеет смысл перевести csv в json, то есть сформировать из имеющихся данных. а уже по нему итерироваться. итерация по csv, тем более по большим файлам не особо быстрая.
 

bigsky

Member
09.12.2020
8
0
BIT
0
Мудрая мысль.
Как в таком случае будет выглядеть код в Python и файл DEF-9xx.csv в .json?
 

Johan Van

Green Team
13.06.2020
355
671
BIT
239
Мудрая мысль.
Как в таком случае будет выглядеть код в Python и файл DEF-9xx.csv в .json?

нет. это не просто смена расширения. вам нужно данные из csv перенести в словарь, то есть, по сути, частично придется переписывать код
 

bigsky

Member
09.12.2020
8
0
BIT
0
Я нуб в этом деле. Это долгий процесс для такого профессионала, как вы?
 

bigsky

Member
09.12.2020
8
0
BIT
0
Спасибо. Это будет благородно с вашей стороны.
Думаю, я многому у вас научусь.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!