Это первая статья из будущей серии статей о том, как я возродил однажды ушедшую в историю идею в коде. В этой статье я опишу реализацию регистрации в части места жительства.
Предыстория
Впервые о Ленинградском телефонном эфире я прочитал в одной художественной книге. Потом я начал искать информацию об этом в сети. Меня поразило и воодушевило то, как баг привел к такому уникальному социально-техническому явлению. По сути это первый публичный чат, социальная сеть, называйте как хотите, но просто представьте себе что это было в СССР! Для того времени и социального режима это было нечто невообразимое.
Что это такое? Если можно, попроще
Статей на данную тему в сети много, раз, два, но я попытаюсь объяснить просто.
АТС того времени имели баг — при звонках на определенные несуществующие номера люди попадали в групповой разговор, еще это называется аудиоконференция или же «Телефонный эфир». Для того времени это было насколько круто и не обычно, что «тема зашла».
Чем все закончилось
Конечно же были попытки взять это под контроль, но данные феномены возникали по всему Союзу и это было проблематично. Но время и модернизация АТС таки заставили «Телефонный эфир» уйти в историю.
Некоторые идеи хочется возродить
Т.к. я тоже
Результатом моего труда стал симбиоз идеи «Телефонного эфира», VoIP PBX Asterisk и Telegram.
Если Вам интересно пощупать как это работает, воспользуйтесь ссылкой.
Реализация регистрации. База городов
Можно и даже нужно реализовывать подобного рода боты с минимальным количеством данных, которые пользователи вводят при регистрации. Например в моем боте, около 20% пользователей не завершили процесс регистрации. Все эти данные я запрашиваю для будущих
фич которые будут внедрены при наличии большего количества пользователей, например
- Эфиры по городам, станам, темам (для этого при регистрации пользователю предлагается указать место жительства)
- Знакомства по фильтрам (для этого при регистрации пользователю предлагается указать пол, возраст)
Эти данные в боте можно изменить в любое время через меню настройки, никто не мешает указать любое значение. Я специально не стал реализовывать определение места жительства через кнопку отправить геолокацию дабы не смущать пользователей и сберечь их анонимность.
В этой статье я решил поделиться самым сложным моментом реализации регистрации — выбор места жительства.
В идеальном случае для реализации регистрации в части указания места жительства нужно иметь базу данных всех городов мира, что подразумевает наличие нескольких проблем:
- Найти такую базу либо создать ее самому.
Бесплатно найти такую базу не так уж просто, создать еще сложнее. - Гарантировать ее актуальность. Особенно актуально при переименовании городов.
- Желательно реализовать максимальное удобство для пользователя. Пользователь должен иметь возможность ввести место жительства с ошибками или используя старые названия населенных пунктов.
- Размер базы. База РЕАЛЬНО ВСЕХ населенных пунктов мира будет иметь размер минимум в 1,5 — 2 GB. Не всегда это хорошо, если Вы используете vps, скорость работы самой базы и т.д.
И вообще, зачем хранить города Зимбабве если Ваш контент предназначен для стран СНГ?
Все базы которые я нешел в открытом доступе не удовлетворяли ни один из перечисленных пунктов.
Поэтому я
Базу я решил создавать сам. Также, сделать механизм дальнейшего заполнения в автоматическом режиме данными, которых нет в базе.
Я прочитал несколько статей об аудитории telegram и решил сделать актуальную базу в полу ручном режиме для стран Россия, Украина, Белоруссия, Узбекистан и США.
Как я это делал?
Для указанных стран я взял данные с Википедии о больших городах, сохранил в csv файл и пропустил каждое значение через чудную библиотеку geopy. Результаты сохранял в SQLite базу.
Делюсь базой с сообществом. Надеюсь кому-то она сохранит время.
Пользователь имет возможность ввести место жительства с ошибками или используя старые названия населенных пунктов благодаря использованию мной библиотеки geopy. Введенные пользователем данные я пропускаю через geopy, далее проверяю наличие соответствующей записи в базе. Если запись в базе существует — я присваиваю пользователю идентификатор населенного пункта, если же нет — я записываю в базу новый населенный пункт и опять же таки присваиваю его идентификатор пользователю.
Таким образом я не храню кучу ненужных населенных пунктов в базе.
В упрощенном виде, алгоритм выбора места жительства клиентом во время регистрации выглядит следующим образом:
Вот такой получилась моя гибридная схема.
При этом на хостинге база занимает всего 512 KB и динамически наполняется самими пользователями.