Мне 34, я был в 67 странах, и у меня есть для вас лайфхак (часть 2)
Это не опечатка. Фото из последней поездки есть на обложке статьи. С момента написания прошлой статьи — за 2 месяца, я успел совершить большой тур по США и Мексике благодаря своему боту (на моём месте могли быть и вы). Так что в первую очередь почитайте о боте в первой части «Мне 34, я был в 65 странах и у меня есть для вас лайфхак».
Как я сел в лужу, но поднялся и переписал бота
Для понимания контекста сначала поделюсь, как выглядят сообщения после подписки через мой Telegram-бот:
Моя ошибка номер один — я не учёл антиспам-блокировками Telegram.
Когда в бот начали приходить пользователи, оказалось, что сообщения по клиентскому протоколу MtProto можно отправлять с интервалом, иначе отправку сообщений блокируют на несколько минут (на сколько времени точно — тоже неизвестно). Соответственно, пользователи начали жаловаться, что кому‑то доходят сообщения, а кому‑то нет.
Решением этой проблемы стало архитектурное — теперь Python-часть приложения отвечает только за чтение, а пересылает сообщения Telegram-бот. Из-за этого появилась вторая проблема.
Она заключается в том, что я изначально плохо продумал модели в системе. Хотелось сделать как можно проще, поэтому логика приложения была завязана на одну единственную таблицу:
create table subscriptions (
subscription_id serial primary key,
subscriber varchar not null,
subscription varchar not null,
keyword varchar not null,
unique(subscriber, subscription, keyword)
)
Чем плох подход с таким кодом:
-
Subscriber должен быть отдельной сущностью, так как в итоге нам для общения с ботом нужно хранить ещё Telegram Chat ID. Да и, вероятно, появятся ещё характеристики, например, заблокированный юзер, возможно, какие-то платные функции или что-то подобное.
-
Subscription тоже должен быть отдельной сущностью. Как минимум, чтобы хранить последнее обработанное сообщение от группы, чтобы при перезагрузке приложения не пропустить сообщения и начать с того места, на котором мы остановились.
-
Keyword, как ни странно, тоже сущность. Она уже напрашивалась, когда я добавил возможность искать по двум словам, указав их через пробел. Чуть позже напишу, какие идеи появились для расширения keyword.
Дополнительная проблема, которая вытекает из первой — я не собирал Telegram Chat ID, чтобы пересылкой сообщений занимался бот.
По логину через bot API нельзя отправлять сообщения. Это нужно, чтобы бот мог писать только тем, кто ему уже писал. Для этого пришлось сделать отдельную команду, запоминающую Telegram Chat ID.
В итоге пришлось сильно переписывать приложение и делать миграции баз данных, так как пользователи уже есть и ищут ботом. Также пришлось переделать и процесс подписки.
Выводы, которые я сделал из ошибок в боте
-
Даже в пет-проекте хорошо подумайте над моделями в приложении.
-
Если работаете с внешней системой, хорошо её протестируйте на разные варианты использований, в том числе под нагрузкой.
Киллер-фичи из версии 2.0
Как я уже рассказывал, я использую бот для путешествий и поиска билетов. И если уже сейчас у меня запросы в духе «а не поехать ли мне в самостоятельный тур по Кении, Танзании и Эфиопии», то в разные моменты жизни у меня были другие запросы. Например, год назад я страдал от разбитого сердца и хотел поехать куда угодно за сумму не больше 40 000 рублей (просто развеяться). Лет 5 назад я работал в компании, где отпуск строго согласовывался заранее, и мой запрос был — полететь куда‑нибудь в январе.
Мой бот для этого мало подходит, потому что есть поиск только по ключевым словам. А сумма и дата — вещь гибкая. Поэтому я добавил поиск по сумме (даты по тексту оказалось совсем нетривиально искать — ещё покумекаю и попробую доработать этот момент).
Вот как теперь можно поискать что угодно по сумме:
Ещё я добавил команду /changelog, чтобы можно было посмотреть, что нового появилось:
Как люди ищут в боте Dyson, сантехника и мометы футбольных матчей
В прошлой статье я написал что то, как пользоваться ботом, решать и придумывать вам. Чаще всего пользователи мониторят, конечно же, путешествия, билеты и туры. А ещё другие юзеры придумали искать:
-
Стажировки, курсы, вакансии и обучение
-
Билеты на концерты (на конкретный концерт или по исполнителю)
-
Вещи с барахолок (привет, Dyson, но не только — ищут Apple, Oculus и т. д.)
-
Квартиры или услуги для релокантов
-
Моменты во время трансляции спортивного матча
-
Скидки и распродажи
И для визуалов я выгрузил из моего бота рейтинг Telegram-каналов по количеству подписок на них:
Здесь этот же список текстом (ну вдруг захотите вступить или настроить бот)
Название группы |
Описание |
samokatus (https://t.me/samokatus) |
Группа для поиска авиабилетов и отелей |
vandroukiru (https://t.me/vandroukiru) |
Группа о путешествиях и выгодных предложениях для путешественников |
baraholka_ge (https://t.me/baraholka_ge) |
Барахолка для пользователей из Грузии |
travelradar (https://t.me/travelradar) |
Канал для путешественников о путешествиях |
baraholka_batumi_home (https://t.me/baraholka_batumi_home) |
Барахолка для аренды и продажи недвижимости в Батуми |
piratesru (https://t.me/piratesru) |
Выгодные предложения и скидки на авиабилеты и туры |
loukoster_com (https://t.me/loukoster_com) |
Информация о лоукостерах и дешёвых авиабилетах |
vandrouki_ru (https://t.me/vandrouki_ru) |
Российская версия группы о выгодных предложениях и путешествиях |
fly2trip (https://t.me/fly2trip) |
Полезные советы и лайфхаки для путешественников |
ticketskz (https://t.me/ticketskz) |
Выгодные предложения на билеты в Казахстане |
aero_tur (https://t.me/aero_tur) |
Туры и авиабилеты по выгодным ценам |
vandroukikz (https://t.me/vandroukikz) |
Группа о путешествиях и выгодных предложениях для Казахстана |
aviatickets_kz (https://t.me/aviatickets_kz) |
Авиабилеты по выгодным ценам в Казахстане |
charterticketsme (https://t.me/charterticketsme) |
Предложения на чартерные рейсы и авиабилеты |
hotprice (https://t.me/hotprice) |
Горящие предложения и скидки на разные товары и услуги |
halyavshikitravel (https://t.me/halyavshikitravel) |
Бесплатные и супервыгодные предложения для любителей путешествовать |
nachemodanah (https://t.me/nachemodanah) |
Канал выгодных туров, билетов и предложений для путешествий |
rabotakastingi (https://t.me/rabotakastingi) |
Предложения о работе и кастинги |
travel_from_siberia (https://t.me/travelfromsiberia) |
Путешествия и туры из Сибири |
tbank_education (https://t.me/tbankeducation) |
Образование и курсы |
p2plightning (https://t.me/p2plightning) |
Группа для обсуждения P2P и криптовалютных технологий |
aviasales_uz (https://t.me/aviasales_uz) |
Предложения на авиабилеты в Узбекистане |
charteraviabilet (https://t.me/charteraviabilet) |
Чартерные рейсы и авиабилеты |
balichatmarket (https://t.me/balichatmarket) |
Рынок и барахолка для пользователей из Бали |
aaaviasaleskz (https://t.me/aaaviasaleskz) |
Авиабилеты по выгодным ценам в Казахстане |
myeventhunters (https://t.me/myeventhunters) |
Организация мероприятий и охота за выгодными билетами на мероприятия |
step2traveltours (https://t.me/step2traveltours) |
Туристические предложения и туры |
westwindcap (https://t.me/westwindcap) |
Инвестиции и финансовые консультации |
eventhuntertalk (https://t.me/eventhuntertalk) |
Общение и обсуждение мероприятий |
pepperru (https://t.me/pepperru) |
Скидки и акции на различные товары и услуги |
luckywings (https://t.me/luckywings) |
Выгодные авиабилеты и туры |
biletnizhniynovgorod (https://t.me/biletnizhniynovgorod) |
Выгодные предложения на билеты в Нижнем Новгороде |
nerdsmedia (https://t.me/nerdsmedia) |
Медиа, технологии и IT новости |
gogetajob (https://t.me/gogetajob) |
Предложения работы и вакансии |
ezmoddev (https://t.me/ezmoddev) |
Обсуждение разработки и программирования |
travel_tema (https://t.me/travel_tema) |
Темы, советы и новости для путешественников |
alikzbs_aliexpress (https://t.me/alikzbs_aliexpress) |
Выгодные предложения и скидки на AliExpress в Казахстане |
fa_electronics (https://t.me/fa_electronics) |
Электроника и гаджеты |
travelbelka (https://t.me/travelbelka) |
Путешествия и выгодные предложения на туры |
slivaker_it (https://t.me/slivaker_it) |
Секреты и инсайды из мира IT |
onlinetour (https://t.me/onlinetour) |
Онлайн-туры и виртуальные путешествия |
vandroukitours (https://t.me/vandroukitours) |
Путешествия и туры по всему миру |
travelsandal (https://t.me/travelsandal) |
Туристические предложения и лайфхаки для путешествий |
bombila_dpr (https://t.me/bombila_dpr) |
Вакансии и предложения о работе для водителей (бомбил) в Донецкой Народной Республике |
Вы тоже можете развить вашу фантазию и найти свой вариант применения бота.
Ещё ко мне пришёл человек за сотрудничеством на тему аналитики брендов. Ему хотелось в профильных группах реагировать на комментарии, относящиеся к конкретной компании, то есть сделать аналог Brand analytics. Так что бизнес‑кейсы применения моего бота тоже возможны.
Какие ещё фичи я планирую добавить
-
Вступление в приватные каналы. Тут проблема в том, что аккаунт могут заблокировать или пожаловаться в поддержку, и Telegram заблокирует бот. Вариант использования: я замьютил рабочий чат (ах ты лентяй) и хочу реагировать только на ссылку в Jira по моей задаче.
-
Поиск по датам. Тут фича сложна тем, что в тексте сложно искать даты. Кроме того, что они могут быть в разных форматах, сообщение может быть типа «Бали в январе». И как с этим быть? Искать в каких‑то интервалах? Не совсем понятно, как человек будет это использовать — искать конкретную дату, интервал, одну дату или несколько — вылет и прилёт. Вариант использования — я хочу всё равно куда, но в даты отпуска.
Я открыт для предложений. Пишите в комментарии, если есть вопросы или что‑то не работает.
Полезные ссылки
-
Базовый репозиторий проекта (в нём ссылки на Git‑модули частей проекта).
-
TestBackendForwarderBot — бот для подписки.
-
lashnag — мой Telegram, если возникнут срочные вопросы.
Пишите, как ещё можно доработать мой бот и для каких случаев использовать. До встречи в следующих статьях!
Автор: lexus1990