Многим приложениям требуются актуальные данные о телефонных кодах российских городов. Поиск в интернете приводит к следующим печальным итогам: есть масса сомнительных ресурсов, где выложены коды городов, но их актуальность и достоверность оставляет желать лучшего, либо неизвестно. Есть онлайн-сервисы, которые предоставляют коды по конкретному городу. Этим можно было бы воспользоваться, но проделывать несколько десятков тысяч запросов вручную — удовольствие доступное не каждому.

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

Я предполагаю, что ныне ведомства обязаны делиться открытой информацией, поэтому данные файлы вынужденно выкладываются агентством в открытый доступ, но привычка чиновников «помогать индивидуально» обеспеченным гражданам и ведущим компаниям порождает и то, что наткнуться на эти файлы не так просто, и то, что телефонные коды всех населенных пунктов РФ в этом файле — трехзначные, т.е. состоят ровно из 3 цифр!

Вторым недостатком этих файлов является то, что названия населенных пунктов России выдуманы самими связистами и не имеют стопроцентного совпадения с вариантами названий, используемыми почтовой службой (известная многим база КЛАДР). Вероятно, существуют еще какие-то источники именования населенных пунктов, но я опирался на данные КЛАДР. По этой причине, при совмещении этих данных с вашим списком городов придется немного попотеть, прописывая конкретные несовпадения вручную.

Так как результирующие данные мне надо было получить в виде mysql-таблиц, то я написал код на Mysql для получения требуемых мне данных.

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

Сначала импортируем данные из файлов (команда LOAD DATA INFILE).

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

Каждая строка файла кроме трехзначного кода города содержит диапазон семизначных номеров, юрлицо, которому он выделен и населенный пункт. Известно, что число цифр в требуемом коде от 3 до 6. Также известно, что одному населенному пункту не выделялось более 2 телефонных кодов.

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

Поясню эту формулировку подробнее на примере. Если код города Бердск, Новосибирской области содержит 5 цифр — 38341, то при представлении всех телефонных номеров этого города в семизначном виде первыми двумя цифрами всегда будут 2 цифры — 41. А вот третья цифра будет уже содержать более одного варианта (от 3 вариантов и более, в предположении, что у города может быть 2 телефонных кода)!

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

Подводные камни


Перед этим запросом у меня производится запрос по очистке данных от мусора, т.к. одинаковые регионы, районы и населенные пункты в файлах агентства не всегда полностью контекстно идентичны. Где-то присутствуют симвоы табуляции. Где-то пропущено название района и т.п. Например, по файлу с кодами, начинающимися на цифру 3 — мой запрос содержит порядка 20 строк, поэтому вылов всех этих ситуаций не сложен.

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

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

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

Заключение


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

P.S. В рамках своей задачи я сделал подобные запросы для международных кодов. Но приводить порядок действий бессмысленно, так как эти данные я не смог найти в открытом доступе и получил «по знакомству» dial-планы одного из операторов ip-телефонии. Из его пояснений следовало, что у иного оператора связи будут свои dial-планы и, соответственно, свои нюансы вычленения кодов.

Комментарии (13)


  1. Andy_U
    05.09.2017 15:53

    По строке поиска «коды abc def» в Google требуемая страничка Россвязи — 4-я сверху.


    1. remzalp
      06.09.2017 08:35

      По запросу "телефонный код города", которая приходит в голову не-связистам почему-то чаще — хоть как-то способна помочь разве что ссылка на статью в википедии "Телефонный план нумерации России", откуда можно попасть по ссылке на источник у минкомсвязи.


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


  1. Ctacfs
    05.09.2017 18:56

    Не знаю, как у Вашего оператора, а у нашего есть таблица с тарифами, где не только стоимость звонков в разные города, но и коды этих городов и даже операторы, которым принадлежат диапазоны номеров.
    Тут ещё еподалёку был пост про определение оператора перенесенных номеров с помощью сервиса мегафона. Для определения города мобильного.


  1. MaxxxZ
    06.09.2017 06:39

    очень сложно воспринимать формат хранения данных в тексте. Вы бы пару скринов с форматом исходной таблицы и отличиями имен НП от КЛАДР Выложили…


    1. orsgen Автор
      06.09.2017 07:00

      Умер диск с этой последовательностью запросов и всеми данными. Поэтому будет небольшая пауза, а потом приведу примеры. Контекстные различия там есть по всем 3 сущностям — регион, район, населенный пункт.


    1. remzalp
      06.09.2017 08:30

      Держите пример данных
      image


      В поле "Регион" может быть:


      1. Область — "Удмуртская Республика"
      2. Город, область — "г. Ижевск|Республика Удмуртская"
      3. Район, без области — "Лысьвенский р-н"
      4. Город, район, область — "пгт. Нижнеангарск|р-н Северо-Байкальский|Республика Бурятия"
      5. Такое вот безумие — "г. Москва (Новомосковский)|г. Москва (Новомосковский)"

      Причем даже в пределах одного файла может быть "обл.", "область" для одного региона:
      "г. Тюмень|Тюменская обл."
      "НПС-2 НП Пурпе-Самотлор р-н Пуровский|Тюменская область"


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


      Подозреваю, что всё потому что нет единой точки отказа получения абсолютно точной и надёжной информации о названии географических объектов, которая явно прописана где-то в федеральном законе, к примеру.


      1. orsgen Автор
        06.09.2017 09:36

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


  1. chumpa
    06.09.2017 07:00

    телефонные коды всех населенных пунктов РФ в этом файле — трехзначные, т.е. состоят ровно из 3 цифр

    Я посмотрел в файлы, вы ошибаетесь — там корректно приведён зональный код ABC а не «код населённого пункта» которого не существует. Например какой код н.п. Москва — 499, 495 или что?


    1. orsgen Автор
      06.09.2017 07:16

      Верно, отчасти. У Москвы оба телефонных кода и 495, и 499. Традиционно, большинство пользователей считает, что понятие код населенного пункта существует. Это отражено, практически, во всех системах для работы пользователей. В этом факте можно легко убедиться посмотрев wordstat того же Яндекса. Число запросов «телефонный код города N» можно сравнить с числом запросов «зональный трехзначный код» и его вариациями.
      Поэтому, если Агентство связи решило, что теперь чего-то не существует к чему все привыкли, то должно пройти лет так 30, чтобы оно стало неактуальным в реальной жизни.
      Хотя, с формальной точки зрения, если ситуация такова, вы сможете выиграть в суде у заказчика, что реализация системы с трехзначными зональными кодами соответствует ТЗ, если в нем этот момент был сформулирован не детализировано…


      1. BoogieMan75
        06.09.2017 09:03

        Поэтому, если Агентство связи решило, что теперь чего-то не существует к чему все привыкли, то должно пройти лет так 30, чтобы оно стало неактуальным в реальной жизни.
        Вы вот это сейчас серьезно ?! Этому реестру лет 10+. Он всегда был в таком формате. Да, понятие нумерации связистов и обывателей не совсем совпадает. Кстати, а вас не напрягает что мобильник 10(12) значный?


        1. orsgen Автор
          06.09.2017 09:18

          Как вы считаете, почему все говорят — «солнце взошло», «солнце село», хотя давно известно, что земля вращается вокруг солнца, а закат — это следствие вращения земли?
          Возможно, реестру и лет 10+, но на страничке есть пояснение, что файлы выкладываются в соответствии с ФЗ 10-, насколько я помню. Ранее на сайтах региональных телекомов присутствовали файлы с кодами населенных пунктов. Предполагаю, что еще можно найти живой сайт одного из таких телекомов с устаревшими данными о телефонных кодах населенных пунктов.


        1. orsgen Автор
          06.09.2017 09:29

          Мобильники мне известны 10-значные. И на многих ресурсах они представлены в форме (905) 123-45-67, что, интуитивно подразумевает 905 — код Билайна, 913 — код МТС и т.п., а не в варианте +1123456789021, как в США, например, где, вероятно, изначально не было практики привязки кода к населенному пункту и/или возможности звонков внутри региона по коротким номерам.
          Кстати, фактическое наличие кода города подтверждает и само действующее оборудование связи, которое пока «не выполнило приказа» и в городах с 4-значным кодом выполняет местные звонки по 6-значным городским номерам и отказывается выполнять звонки по 7-значным, которые можно получить отбрасыванием того самого мифического трехзначного зонального кода, существующего в представленных файлах и головах сотрудников Агентства связи…


          1. BoogieMan75
            06.09.2017 09:45

            У сотовиков с выходом на местную связь все несколько по другому обстоит. Вопрос настройки местного коммутатора, который скорее всего стоит в городе с 6-ти знаком и поэтому все городские они подгоняют под него.
            Кстати, по десятизначному АОН звонится всегда отлично, хотя как то давно в Москве был прикол — мне позвонили, и входящий АОН почему то пришел без +7 и я на автомате перезвонил… на какой то московский номер начинавшийся на 474.

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