Как определить оператора и регион по номеру телефона / Хабр

А можно разобрать номер «дадатой»

Еще вариант — отдать номер телефона «Дадате», сервис вытащит из него полезное.

Как определить оператора и регион по номеру телефона / Хабр
Распозна́ем оператора, исправим опечатки в номере, покажем страну, регион и часовой пояс. Наконец, отделим стационарник от мобильного

База данных перенесенных номеров

Если нужно точно определять оператора, тогда не обойтись без Базы Данных Перенесенных Номеров, оператором которой является

ЦНИИC

. Процедуру подключения к базе можно найти у них на сайте:

Как определять абонентов


Самое очевидное решение этой задачи: посмотреть на слово

«диапазон»

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

Но есть более оригинальный и универсальный способ реализации, сложность которого – константа, независимо от размера данных. Этот метод предполагает использование масок номеров.

Крупные компании

Самый крупные и популярные компании тоже имеют свои телефоны для связи, и люди ищут их довольно часто. Мы собрали для вас самые необходимые номера телефонов из различных сфер бизнеса.


Больше информации о компаниях, организациях, их филиалах и используемых ими мобильных, городских и федеральных номерах телефонов вы найдете на странице конкретного номера.

Маска номера

Маска номера – это строка состоящая из цифр и спецсимвола со значением «wildcard одиночного символа» (“?”), который говорит, что на его месте может быть любая цифра. Причем после знака вопроса может стоять только знак вопроса.

Таким образом, один из диапазонов Билайн в Москве «79031000000 – 79031999999», в виде маски будет записан как «79031??????».

С такими масками очень удобно работать, например, задавать их вручную в конфигурации. Кроме того, представление диапазонов в виде масок дает возможность использовать более эффективные методы хранения и простые алгоритмы поиска.

Найти оператора по номеру телефона, заглянув в план нумерации

Главный российский документ, согласно которому операторы получают телефонные номера, — это план нумерации Россвязи. В нем ясно прописали все расклады: какие коды и номера каким операторам в каких регионах принадлежат. Что приятно, справочник Россвязи свободно лежит на странице

Получить доступ к базе перенесенных номеров

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

Номера, сменившие оператора, хранят в базе данных перенесенных абонентских номеров (БДПН). Ее оператор — уже не Россвязь, но Центральный научно-исследовательский институт связи.

Проблема в том, что получить доступ к БДПН очень непросто. Конечно, если вы не мобильный оператор, субъект национальной платежной системы, силовая структура или другое ведомство.

Как определить оператора и регион по номеру телефона / Хабр
Все, что может рядовой пользователь — вручную проверить конкретный номер

Мы получили доступ к БДПН в далеком 2022 году как «иная организация». Но с тех пор правила, похоже, ужесточили. Даже бланк заявления сильно изменился, свежий лежит на сайте Института связи. Поэтому посоветовать здесь ничего не могу, увы.

UPD. В комментариях пишут, что с доступом все не так сурово: «Работал в энергосбытовой компании, без проблем за несколько дней получил доступ к бдпн. <…> заполнил заявление, подписал директором, поставил печать и отправил по электронике. Потом созвонился для верности».

Популярные коды

Префиксное дерево


Гораздо более эффективный по производительности метод – построение

из масок, который будет опираться на то, что номера состоят из цифр. Каждая нода этого дерева сможет иметь до 10 цифровых нод-потомков (0-9) и одной wildcard-ноды. Wildcard-нода может иметь только wildcard-потомков. При добавлении очередной маски в дерево, каждый символ маски последовательно превратится в ноду. Таким образом, фактически мы представляем все имеющиеся у нас маски в виде одного дерева.

Алгоритм поиска в дереве, думаю, уже понятен: берем по порядку каждую цифру из искомого номера и последовательно спускаемся по дереву начиная с корня. В первую очередь спускаемся по цифровым нодам, если цифровых нод нет, то смотрим есть ли “?”-нода. Если есть, то в конечном итоге проверяем длину маски, и если она соответствует номеру, то оператор найден.

Проверить, не ушел ли номер к другому оператору


Если получили доступ к официальной базе перенесенных номеров, дальше легко. Проверяем, не поменял ли абонент оператора, сбросив оковы «мобильного рабства».

Институт связи выкладывает БДПН на SFTP-сервер, в три папки.

Как определить оператора и регион по номеру телефона / Хабр
В первой папке лежит полный справочник. Во второй — инкрементальные обновления. А третья хранит номера, вернувшиеся «владельцам»

Внутри папок данные по всем операторам всех регионов хранят без деления по файлам. Файлы нужны, чтобы различать обновления.

Как определить оператора и регион по номеру телефона / Хабр
В название инкрементов вставляют дату и время обновления. Если хотите максимально срочно получать перенесенные номера — вот, пожалуйста. Если срочности нет, проще раз в сутки загружать полный справочник

Формат файлов — CSV, сжатые в ZIP. Внутри — проще некуда.

Как определить оператора и регион по номеру телефона / Хабр
В файлах справочника три поля: номер, оператор и количество строк. Причем третье поле заполняют только для первой строки — изящное решение

Историю в БДПН не хранят: каждый день на сервер выкладывают все перенесенные номера. Если телефона нет в полном справочнике или в инкрементах за день, значит, он подчиняется плану Россвязи. Поэтому для наших целей папка с вернувшимися номерами — ReturnIncrementNew — не нужна.

Каждый день мы загружаем с сервера свежую БДПН. Для этого годится любой SFTP-клиент: на Windows подойдет WinSCP или FileZilla FTP Client, на Ubuntu — Nautilus. Классическая ошибка при этом: оставить в настройках дефолтный FTP вместо положенного SFTP.

Когда справочник перенесенных номеров под рукой, осталось поискать в нем исследуемый номер. Варианта два:


Вот и вся премудрость.

Разбить телефонный номер на части

Первое, что нужно сделать, — разобрать телефон на три части:

Как определить оператора и регион по номеру телефона / ХабрКод зоны нумерации у мобильного номера всегда состоит из трех цифр. У стационарного — из трех, четырех или пяти. Чтобы определить регион по номеру телефона, в любом случае достаточно трех первых цифр

Если не знать, какая часть номера из каких цифр состоит, дальше будет непросто. Выход — поставить маску, чтобы пользователи сразу вводили номера по частям. Или разбирать уже после, с задачей справится библиотека Google для работы с телефонами.

Россвязь

Свой номер телефона мы получаем когда заключаем договор на обслуживание с оператором связи. В свою очередь, распределением диапазонов номеров между операторами связи, а также стандартизацией и общим контролем за услугами связи занимаются соответствующие государственные и международные организации. В России такой организацией является Федеральное агентство связи (Россвязь).

Телефонные коды мобильных операторов

Чтобы узнать, к какому оператору и региону относится интересующий мобильный номер, введите его в поле:

Хеш-таблица

Например, один из таких алгоритмов это хранение соответствий «маска-оператор» в хеш-таблице (или любом другом key-value хранилище). Суть алгоритма в следующем: все подобные маски складываются в хеш-таблицу, где они являются ключами. Значениями в таблице являются объекты-операторы с регионами.

Работу поиска нагляднее всего объяснить на примере. Скажем, мы ищем информацию по номеру: 7(903)100-1234, и у нас есть маска 79031?????? – Билайн, Москва.

Сперва ищем в таблице запись по ключу в точности как исходный номер: 79031001234.Если не найдено, то меняем последнюю цифру номера на “?” и ищем по ключу 7903100123?.

Если опять ничего не нашли, то снова меняем последнюю цифру на “?” и ищем по 790310012??, и так далее.

В конце концов мы сделаем поиск по ключу 79031?????? и обнаружим, что номер относится к оператору Билайн, Москва.

Видно, что в данном случае сложность алгоритма равна сложности нескольких взятий из хеш-таблицы, что при правильной реализации обычно равно константе. Сложность поиска в таком дереве зависит от длины телефонных номеров, которая по рекомендации ITU-T E.164 не превышает 15 символов.

Этот же алгоритм можно применить и к портированным номерам – их можно просто добавить в ту же самую хеш-таблицу.

Заключение

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

При поиске сначала смотреть в таблице, а если в ней ничего не найдено, то искать в дереве. Разделение хранилищ в первую очередь удобно для их автообновления, т.е. если изменилась БДПН (а она меняется постоянно), то совсем необязательно перечитывать диапазоны Россвязи.

Для максимальной производительности можно хранить всю информацию прямо в оперативной памяти. В моей реализации на Java, дерево масок Россвязи занимает не более 20-30Мб, хеш-таблица с масками портированных номеров: около 500-600 Мб. Если же портированные номера хранить в префиксном дереве, то из-за того, что ноды дерева получаются очень разреженные, памяти потребуется примерно в 1.5 раза больше. Но зато, это дает достаточно весомый прирост производительности.

Спасибо за внимание!

→ Весь исходный код доступен на github.

Читайте про операторов:  Как контакты с iPhone перенести на СИМ-карту: 3 способа

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *