image

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

Предыстория


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

Что это такое? Если можно, попроще


Статей на данную тему в сети много, раз, два, но я попытаюсь объяснить просто.

АТС того времени имели баг — при звонках на определенные несуществующие номера люди попадали в групповой разговор, еще это называется аудиоконференция или же «Телефонный эфир». Для того времени это было насколько круто и не обычно, что «тема зашла». Эфиряне Люди знакомились, встречались, общались и даже заводили отношения, семьи в «Эфире». Вот это романтика!

Чем все закончилось


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

Некоторые идеи хочется возродить


Т.к. я тоже романтик работаю с АТС, VoIP, и программирую на python — я решил возродить идею в коде.

Результатом моего труда стал симбиоз идеи «Телефонного эфира», VoIP PBX Asterisk и Telegram.
Если Вам интересно пощупать как это работает, воспользуйтесь ссылкой.

Реализация регистрации. База городов


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

  • Эфиры по городам, станам, темам (для этого при регистрации пользователю предлагается указать место жительства)
  • Знакомства по фильтрам (для этого при регистрации пользователю предлагается указать пол, возраст)

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

В этой статье я решил поделиться самым сложным моментом реализации регистрации — выбор места жительства.

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

  1. Найти такую базу либо создать ее самому.

    Бесплатно найти такую базу не так уж просто, создать еще сложнее.
  2. Гарантировать ее актуальность. Особенно актуально при переименовании городов.
  3. Желательно реализовать максимальное удобство для пользователя. Пользователь должен иметь возможность ввести место жительства с ошибками или используя старые названия населенных пунктов.
  4. Размер базы. База РЕАЛЬНО ВСЕХ населенных пунктов мира будет иметь размер минимум в 1,5 — 2 GB. Не всегда это хорошо, если Вы используете vps, скорость работы самой базы и т.д.

И вообще, зачем хранить города Зимбабве если Ваш контент предназначен для стран СНГ?
Все базы которые я нешел в открытом доступе не удовлетворяли ни один из перечисленных пунктов.

Поэтому я поехал своим велосипедом пошел по своему гибридному пути.

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

Я прочитал несколько статей об аудитории telegram и решил сделать актуальную базу в полу ручном режиме для стран Россия, Украина, Белоруссия, Узбекистан и США.

Как я это делал?

Для указанных стран я взял данные с Википедии о больших городах, сохранил в csv файл и пропустил каждое значение через чудную библиотеку geopy. Результаты сохранял в SQLite базу.
Делюсь базой с сообществом. Надеюсь кому-то она сохранит время.

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

Таким образом я не храню кучу ненужных населенных пунктов в базе.

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



Вот такой получилась моя гибридная схема.

При этом на хостинге база занимает всего 512 KB и динамически наполняется самими пользователями.