На самом деле первоисточником этой информации является Федеральное агентство связи Россвязь, которое выкладывает информацию о текущей нумерации телефонов. Называются эти файлы так, чтобы даже поисковики, отягощенные зачатками искусственного интеллекта, не смогли выдать эту волшебную страницу по типовым поисковым фразам искателей перечня действующих телефонных кодов — «Выписка из реестра Российской системы и плана нумерации».
Я предполагаю, что ныне ведомства обязаны делиться открытой информацией, поэтому данные файлы вынужденно выкладываются агентством в открытый доступ, но привычка чиновников «помогать индивидуально» обеспеченным гражданам и ведущим компаниям порождает и то, что наткнуться на эти файлы не так просто, и то, что телефонные коды всех населенных пунктов РФ в этом файле — трехзначные, т.е. состоят ровно из 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)
Ctacfs
05.09.2017 18:56Не знаю, как у Вашего оператора, а у нашего есть таблица с тарифами, где не только стоимость звонков в разные города, но и коды этих городов и даже операторы, которым принадлежат диапазоны номеров.
Тут ещё еподалёку был пост про определение оператора перенесенных номеров с помощью сервиса мегафона. Для определения города мобильного.
MaxxxZ
06.09.2017 06:39очень сложно воспринимать формат хранения данных в тексте. Вы бы пару скринов с форматом исходной таблицы и отличиями имен НП от КЛАДР Выложили…
orsgen Автор
06.09.2017 07:00Умер диск с этой последовательностью запросов и всеми данными. Поэтому будет небольшая пауза, а потом приведу примеры. Контекстные различия там есть по всем 3 сущностям — регион, район, населенный пункт.
remzalp
06.09.2017 08:30Держите пример данных
В поле "Регион" может быть:
- Область — "Удмуртская Республика"
- Город, область — "г. Ижевск|Республика Удмуртская"
- Район, без области — "Лысьвенский р-н"
- Город, район, область — "пгт. Нижнеангарск|р-н Северо-Байкальский|Республика Бурятия"
- Такое вот безумие — "г. Москва (Новомосковский)|г. Москва (Новомосковский)"
Причем даже в пределах одного файла может быть "обл.", "область" для одного региона:
"г. Тюмень|Тюменская обл."
"НПС-2 НП Пурпе-Самотлор р-н Пуровский|Тюменская область"
Я лично с кладром не работаю, мне требуется сверять корректность начислений за межгород, так что ограничиваюсь областью, но тоже есть проблемы :)
Подозреваю, что всё потому что нет единой точки
отказаполучения абсолютно точной и надёжной информации о названии географических объектов, которая явно прописана где-то в федеральном законе, к примеру.orsgen Автор
06.09.2017 09:36Есть официальные названия у каждого региона, района и населенного пункта. Просто никто пока не додумался вчинять иски Агентству связи за искаженное представление в этих файлах существующих официальных названий, ибо предприимчивость юристов администраций сфокусирована пока в ином векторе, но, наверняка, найдется пионер и среди них.
Ибо это не просто файлы «внутренней техдокументации агентства», а официальный документ, в котором недопустимо искаженное представление официальных названий…
chumpa
06.09.2017 07:00телефонные коды всех населенных пунктов РФ в этом файле — трехзначные, т.е. состоят ровно из 3 цифр
Я посмотрел в файлы, вы ошибаетесь — там корректно приведён зональный код ABC а не «код населённого пункта» которого не существует. Например какой код н.п. Москва — 499, 495 или что?orsgen Автор
06.09.2017 07:16Верно, отчасти. У Москвы оба телефонных кода и 495, и 499. Традиционно, большинство пользователей считает, что понятие код населенного пункта существует. Это отражено, практически, во всех системах для работы пользователей. В этом факте можно легко убедиться посмотрев wordstat того же Яндекса. Число запросов «телефонный код города N» можно сравнить с числом запросов «зональный трехзначный код» и его вариациями.
Поэтому, если Агентство связи решило, что теперь чего-то не существует к чему все привыкли, то должно пройти лет так 30, чтобы оно стало неактуальным в реальной жизни.
Хотя, с формальной точки зрения, если ситуация такова, вы сможете выиграть в суде у заказчика, что реализация системы с трехзначными зональными кодами соответствует ТЗ, если в нем этот момент был сформулирован не детализировано…BoogieMan75
06.09.2017 09:03Поэтому, если Агентство связи решило, что теперь чего-то не существует к чему все привыкли, то должно пройти лет так 30, чтобы оно стало неактуальным в реальной жизни.
Вы вот это сейчас серьезно ?! Этому реестру лет 10+. Он всегда был в таком формате. Да, понятие нумерации связистов и обывателей не совсем совпадает. Кстати, а вас не напрягает что мобильник 10(12) значный?orsgen Автор
06.09.2017 09:18Как вы считаете, почему все говорят — «солнце взошло», «солнце село», хотя давно известно, что земля вращается вокруг солнца, а закат — это следствие вращения земли?
Возможно, реестру и лет 10+, но на страничке есть пояснение, что файлы выкладываются в соответствии с ФЗ 10-, насколько я помню. Ранее на сайтах региональных телекомов присутствовали файлы с кодами населенных пунктов. Предполагаю, что еще можно найти живой сайт одного из таких телекомов с устаревшими данными о телефонных кодах населенных пунктов.
orsgen Автор
06.09.2017 09:29Мобильники мне известны 10-значные. И на многих ресурсах они представлены в форме (905) 123-45-67, что, интуитивно подразумевает 905 — код Билайна, 913 — код МТС и т.п., а не в варианте +1123456789021, как в США, например, где, вероятно, изначально не было практики привязки кода к населенному пункту и/или возможности звонков внутри региона по коротким номерам.
Кстати, фактическое наличие кода города подтверждает и само действующее оборудование связи, которое пока «не выполнило приказа» и в городах с 4-значным кодом выполняет местные звонки по 6-значным городским номерам и отказывается выполнять звонки по 7-значным, которые можно получить отбрасыванием того самого мифического трехзначного зонального кода, существующего в представленных файлах и головах сотрудников Агентства связи…BoogieMan75
06.09.2017 09:45У сотовиков с выходом на местную связь все несколько по другому обстоит. Вопрос настройки местного коммутатора, который скорее всего стоит в городе с 6-ти знаком и поэтому все городские они подгоняют под него.
Кстати, по десятизначному АОН звонится всегда отлично, хотя как то давно в Москве был прикол — мне позвонили, и входящий АОН почему то пришел без +7 и я на автомате перезвонил… на какой то московский номер начинавшийся на 474.
И вот глобально подойдя к вопросу. Вот реально надо настолько детально расписывать все населенные пункты? Такое критично, когда вы являетесь мега оператором и имеете кучу стыков с разными городами. В остальных случаях хватит ABC для идентификации направления. (последний абзац основан исключительно на личном опыте)
Andy_U
По строке поиска «коды abc def» в Google требуемая страничка Россвязи — 4-я сверху.
remzalp
По запросу "телефонный код города", которая приходит в голову не-связистам почему-то чаще — хоть как-то способна помочь разве что ссылка на статью в википедии "Телефонный план нумерации России", откуда можно попасть по ссылке на источник у минкомсвязи.
В своё время хотел просто отпарсить один из сайтов, которые публикуют (без ссылки на источник) коды городов, но нашел противоречия у нескольких сервисов и стал искать более официальную информацию.