В этой статье я разберу своего телеграм бота который проверяет пароль по утекшим базам данных с помощью API have i been pwned. Начнем с того что я сделал кнопки, то есть пользователю не придется вводить унылые команды по типу /help или /scan

Часть кода написании кнопок:

def get_main_keyboard():
    return ReplyKeyboardMarkup(
        keyboard=[
            [KeyboardButton(text="Сгенерировать пароль")],
            [KeyboardButton(text="Как проверить свой пароль?")],
            [KeyboardButton(text="Почему бот иногда не работает?")],
        ],
        resize_keyboard=True
    )

А здесь просто вызывается функция кнопок

@dp.message(CommandStart())
async def cmd_start(message: Message):
    save_user(message.from_user.id, message.from_user.username, message.from_user.first_name)
    logger.info(f"Юзер {message.from_user.id} (@{message.from_user.username}) нажал /start")
    
    await message.answer(
        "Привет! Я бот для проверки кибербезопасности твоих паролей.\n\n"
        "• Нажми кнопку ниже, чтобы создать взломостойкий пароль.\n"
        "• Или просто **отправьте мне любой текст**, и я проверю, есть ли он в базах утечек хакеров.",
        reply_markup=get_main_keyboard()
    )

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

Кусок кода ответа админстратора

@dp.message(Command("send"))
async def cmd_send_to_user(message: Message):
    if message.from_user.id != ADMIN_ID:
        return
        
    try:
        args = message.text.split(maxsplit=2)
        if len(args) < 3:
            await message.answer("❌ Формат: /send ID ТЕКСТ")
            return
            
        target_id = int(args[1])
        text_to_send = args[2]
        
        await bot.send_message(chat_id=target_id, text=f"✉️ **Сообщение от разработчика:**\n\n{text_to_send}")
        await message.answer(f"✅ Отправлено пользователю {target_id}")
        logger.info(f"Админ отправил сообщение для {target_id}: {text_to_send}")
    except ValueError:
        await message.answer("❌ ID должен быть числом.")
    except Exception as e:
        await message.answer(f"❌ Ошибка отправки: {e}")
        logger.error(f"Не удалось отправить сообщение от админа к {target_id}: {e}")

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

Полный исходный код с зависимости на моем github.

Ссылка на github: https://github.com/dkrunkeevich/password-security-bot

p.p.s Файл нужно открывать только с помощью cmd а не двойным кликом иначе скрипт не сработает(Не могу понять причину почему, может вы напишите а?)

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


  1. tester_v
    30.05.2026 03:15

    Заинтересовала логика работы с апи, а тут она не описана и надо идти на гитхаб и вычитывать 200 строк...


    1. dk_runkeevich Автор
      30.05.2026 03:15

      Вы не знаете про сайт Have been pwned и как работает вообще любой API?


      1. ki-dev
        30.05.2026 03:15

        Я почему-то думал, что у этого сайта никакого API нет...


  1. Dhwtj
    30.05.2026 03:15

    Вышлите мне свои пароли, логины и URL. Я проверю, безопасные ли они.


    1. Mayurifag
      30.05.2026 03:15

      Строго через бота с использованием телеграм инфраструктуры без точного знания, как будут обработаны сообщения; через ваш VPS, где я не знаю, шифруете ли вы диск от провайдера; и, будучи уверенным в вашей профессиональности, неподкупности, честности, а ещё и в политике ведения логов/телеметрии? Вы же точно исходный код не подмените, ведь да?

      Жду результатов! Как приятно жить в интеллигентном обществе! Не спешите, всё точно проверьте, а то вдруг я там где напутал с паролем, уточните, не стесняйтесь! Вы, кстати, банковские карты не проверяете ещё? Для друга спрашиваю.


      1. dk_runkeevich Автор
        30.05.2026 03:15

        Здравствуйте! Именно по этой причине я выложил исходный код, а не заставил вас запускать чужого бота. Ваш пароль хешируется в SHA-1 и на скрипт улетают первые 5 символов вашего пароля.


        1. dk_runkeevich Автор
          30.05.2026 03:15

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


      1. DennisP
        30.05.2026 03:15

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


        1. randomsimplenumber
          30.05.2026 03:15

          Долго думал зачем нужна прослойка из tg для запуска собственного кода.


        1. HemulGM
          30.05.2026 03:15

          Бот тогда зачем, если он не для общего пользования? Скрипт я и так могу запустить, если нужно.


          1. dk_runkeevich Автор
            30.05.2026 03:15

            Я просто поделился самой структурой бота и его исходным кодом на гитхабе НЕУЖЕЛИ ЭТО НЕВОЗМОЖНО ПОНЯТЬ НУ ЕМАЕ


            1. rSedoy
              30.05.2026 03:15

              сложность кода - показать друзьям чё умею или школьный факультатив, но это точно не статья для Хабра.


              1. dk_runkeevich Автор
                30.05.2026 03:15

                Слушай, "эксперт", если для тебя Хабр — это только статьи про квантовые процессоры и архитектуру метавселенных, то ты дверью ошибся. Люди делятся исходным кодом и готовой структурой (boilerplates), чтобы другие могли взять её за основу и не изобретать велосипед. Это называется опенсорс и коммьюнити, если ты не знал со своей колокольни. Не нравится сложность — листай дальше и пиши свои "сложные" энтерпрайз-скрипты, а нормальные пацаны оценят готовый рабочий код на Гитхабе.


            1. HemulGM
              30.05.2026 03:15

              А что вы в статье показали? Как создаётся клавиатура у бота и как обработать колбэк нажатия кнопки. И это буквально всё, что вы показали.

              Что мы должны из этой статьи получить?


              1. dk_runkeevich Автор
                30.05.2026 03:15

                более подробно почитайте код на гитхаб и там оттуда запустите вам что делать нечего читать код в самой статье?


                1. HemulGM
                  30.05.2026 03:15

                  Хабр - не место для рекламы своего исходного кода. Тем более такого простого и, по сути своей, бесполезного. Для этого есть сам гитхаб.

                  Полезно было бы рассказать о там, как работает API, почему это может быть безопасно, почему именно такая структура бота и чем она лучше других (по факту у вас самая дефолтная поделка бота: не масштабируемая, не универсальная и не внушает доверия).


                1. randomsimplenumber
                  30.05.2026 03:15

                  вам что делать нечего читать код в самой статье?

                  О_о

                  вам что делать нечего читать статью?

                  :)


          1. DennisP
            30.05.2026 03:15

            В чем концептуальная проблема иметь своего личного бота, например для десктопа и мобильных устройств? ТГ как раз даёт готовый интерфейс для разных устройств. Возможная альтернатива - это веб приложение с аналогичным функционалом.
            PS Я не утверждаю, что именно это решение имеет какое-то реальное применение, но концепцтуально оно имеет право на жизнь.


  1. gosanon
    30.05.2026 03:15

    В этой статье я разберу своего телеграм бота который проверяет пароль по утекшим базам данных

    Так же я добавил телеметрию. Все что делает пользователь в боте отправляется в терминальный лог.

    Очень хорошо. Посмотрел сурсы, не понял только, почему пароли не логируются. Ну, ладно. Вопросы автору: а для чего в таком нехитром сервисе бд юзеров ведётся? Почему база именно юзеров, а не "телеметрии"?


    1. dk_runkeevich Автор
      30.05.2026 03:15

      А об этом я не задумывался...