Это не опечатка. Фото из последней поездки есть на обложке статьи. С момента написания прошлой статьи — за 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
Если вы пользуетесь чатом из моей первой статьи, перейдите на версию 2.0

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

Новый процесс создания подписки на рассылки от бота по ключевым словам
Новый процесс создания подписки на рассылки от бота по ключевым словам

Выводы, которые я сделал из ошибок в боте

  • Даже в пет-проекте хорошо подумайте над моделями в приложении.

  • Если работаете с внешней системой, хорошо её протестируйте на разные варианты использований, в том числе под нагрузкой.

Киллер-фичи из версии 2.0

Как я уже рассказывал, я использую бот для путешествий и поиска билетов. И если уже сейчас у меня запросы в духе «а не поехать ли мне в самостоятельный тур по Кении, Танзании и Эфиопии», то в разные моменты жизни у меня были другие запросы. Например, год назад я страдал от разбитого сердца и хотел поехать куда угодно за сумму не больше 40 000 рублей (просто развеяться). Лет 5 назад я работал в компании, где отпуск строго согласовывался заранее, и мой запрос был — полететь куда‑нибудь в январе.

Мой бот для этого мало подходит, потому что есть поиск только по ключевым словам. А сумма и дата — вещь гибкая. Поэтому я добавил поиск по сумме (даты по тексту оказалось совсем нетривиально искать — ещё покумекаю и попробую доработать этот момент).

Вот как теперь можно поискать что угодно по сумме:

Ищем билеты по максимальной сумме в Telegram-канале
Ищем билеты по максимальной сумме в Telegram-канале

Ещё я добавил команду /changelog, чтобы можно было посмотреть, что нового появилось:

Удобный способ посмотреть список обновлений бота
Удобный способ посмотреть список обновлений бота

Как люди ищут в боте Dyson, сантехника и мометы футбольных матчей

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

  • Стажировки, курсы, вакансии и обучение

  • Билеты на концерты (на конкретный концерт или по исполнителю)

  • Вещи с барахолок (привет, Dyson, но не только — ищут Apple, Oculus и т. д.)

  • Квартиры или услуги для релокантов

  • Моменты во время трансляции спортивного матча

  • Скидки и распродажи

И для визуалов я выгрузил из моего бота рейтинг Telegram-каналов по количеству подписок на них:

Путешествия и правда на первом месте, следом идёт тематика барахолок и (неожиданно) кастинги и крипта
Путешествия и правда на первом месте, следом идёт тематика барахолок и (неожиданно) кастинги и крипта
Ещё пользователи мониторят вакансии всех видов, секретики из IT и мира финансов
Ещё пользователи мониторят вакансии всех видов, секретики из IT и мира финансов
Здесь этот же список текстом (ну вдруг захотите вступить или настроить бот)

Название группы

Описание

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 по моей задаче.

  • Поиск по датам. Тут фича сложна тем, что в тексте сложно искать даты. Кроме того, что они могут быть в разных форматах, сообщение может быть типа «Бали в январе». И как с этим быть? Искать в каких‑то интервалах? Не совсем понятно, как человек будет это использовать — искать конкретную дату, интервал, одну дату или несколько — вылет и прилёт. Вариант использования — я хочу всё равно куда, но в даты отпуска.

Я открыт для предложений. Пишите в комментарии, если есть вопросы или что‑то не работает.

Полезные ссылки


Пишите, как ещё можно доработать мой бот и для каких случаев использовать. До встречи в следующих статьях!

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


  1. HOSTile28
    04.02.2025 11:55

    Бот пушка

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


  1. Anchovis
    04.02.2025 11:55

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


    1. lexus1990 Автор
      04.02.2025 11:55

      Для этого придется выпускать отдельную серию, начав с кругосветки на пол года)) Можно пока посмотреть список стран https://scratchmymap.com/m/aleksey.lashnev.1626848745470


    1. anna_ovzyak
      04.02.2025 11:55

      А как в такую кругосветку еще вписалась вторая половинка с ее графиком отпуска или работой?


      1. lexus1990 Автор
        04.02.2025 11:55

        Надо отдать должное моей бывшей жене - она бросила работу ради этого. Да и я в кругосветке не работал почти - был на договоре


  1. xsevenbeta
    04.02.2025 11:55

    Третья часть статьи будет про монетизацию?)


    1. lexus1990 Автор
      04.02.2025 11:55

      Пока этого в планах нет - делалось на альтруизме


    1. Anchovis
      04.02.2025 11:55

      Опасная идея, так автор провозгласит себя стартапом и забросит Джаву с Питоном)


      1. xsevenbeta
        04.02.2025 11:55

        Не спойлери, это на 4 сезон статью)


  1. anna_ovzyak
    04.02.2025 11:55

    64 страны это с рождения? Или с возраста 18+?


    1. lexus1990 Автор
      04.02.2025 11:55

      Первый раз я был заграницей в 14 в Турции (в которой был еще 7 раз за жизнь). А основные путешествия начались с совершеннолетия.


      1. anna_ovzyak
        04.02.2025 11:55

        То есть за 16 лет, вы посетили 67 стран, это в год пример 4-5 стран. При работе с отпуском 28 дней, как у вас это получилось, если один отпуск должен быть 14 дней, остальные уже как получится?


        1. lexus1990 Автор
          04.02.2025 11:55

          Кругосветка, донорство, праздники, удалёнка, университет


        1. petsernik
          04.02.2025 11:55

          Если работать на удалёнке, разве есть разница где находиться?


  1. sosed_totoro
    04.02.2025 11:55

    Я так понимаю 67 стран автор посетил без использования бота, что же будет с ботом? Облетит всю галактику?


    1. lexus1990 Автор
      04.02.2025 11:55

      Прогрессии уже не будет. Осталось труднодоступное


  1. trikot
    04.02.2025 11:55

    Помимо телеграмм бота надо иметь кучу времени и денег. Гостиницы ведь никто не отменял, да и питаться тоже надо. Можно конечно под кустом ночевать, но я такое не люблю.


    1. lexus1990 Автор
      04.02.2025 11:55

      Ну, в дорогих странах есть хостелы / каучсерфинг (например, в Австралии я спокойно пожил в хостелах). Питаться всегда можно в супермаркетах, в том числе готовой едой. А про страны типа Индии или Азии - реально главное долететь. Хотя для комфорта, конечно, деньги приличные нужны


      1. trikot
        04.02.2025 11:55

        Ну я себя люблю, и в общаге жить не готов. Или гостиница, или airbnb. Последнее предпочтительнее. В Индию ни ногой, там даже в маке отравиться можно.

        Я за количеством стран не гонюсь. Люблю старушку Европу. Правда в последнее время сложно и дорого, но я работаю над этим.


        1. lexus1990 Автор
          04.02.2025 11:55

          В азии есть недорогие чистые места подальше от туризма классического. В латинской америке тоже недорого.


          1. trikot
            04.02.2025 11:55

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

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


            1. lexus1990 Автор
              04.02.2025 11:55

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


              1. trikot
                04.02.2025 11:55

                К 34 годам уже надо определиться :))