Как стать автором
Обновить

Комментарии 15

Честно, старался максимально упрощать, но да, тема, действительно, непростая. Спасибо за обратную связь) Если есть вопросы - задавайте.

Да, конечно, спасибо)

Главная причина использования вебхука вместо long polling это возможность горизонтального масштабирования, а вы через .delete_webhook(...) делаете так что если один из подов упадет то остальные тоже перестанут работать. Миллион статей на хабре про тг ботов, но везде код на уровне студента вчера почитавшего доку aiogram

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

Зачем вам вебхук в этом проекте? Лонг пулинг уже не справляется из-за огромных нагрузок? Вы уверены что геморрой с вебхуками по типу "так как для работы вебхуков необходим домен с поддержкой HTTPS" и еще кучи проблем в обмен на увеличение "лимита" рпс которого вам итак предостаточно с пуллингом - стоит свеч? Или вы просто прочитали где-то что это "современно модно молодежно" и не разобравшись в вопросе побежали писать 1001-ую статью про тг ботов показывая новичкам код который приведет к проблемам в будущем?

Вы оплату через Робокассу тоже предлагаете делать через поллинг? Или вы говорите о том, что лучше делать отдельное приложение для хуков под платежки? То есть, по вашему, это лучше чем в текущей реализации?

Что касается хука в контексте ботов. Как минимум, на данный момент есть прирост в скорости обработки + удобная интеграция бота в хук платежки.

Ну и повторю вопросы:

  1. Кроме одной строчки кода, что бы вы, как "Не вчерашний студент" в коде бы заменили

  2. Как бы вы, как "не вчерашний студент" реализовали связку хука, который ловит ответ от Робокассы и через бота пробрасывает ответ?

Или вы говорите о том, что лучше делать отдельное приложение для хуков под платежки? То есть, по вашему, это лучше чем в текущей реализации?

а, ну то есть вы завязали весь свой продукт на ТГ. Что будете делать если его заблокируют в РФ? Закроетесь? Я бы таких гениев как вы и близко не подпускал к разработке и особенно управлению продуктами. То что вы тут своими корявыми рученками накидали тянет максимум на джуновский пет проект.
А по поводу "Какие бы лично вы тут правки внесли, кроме замены 1 строки кода?" - а вам что, недостаточно одной строки кода которая ложит весь сервис и является трудноотлавливаемым багом если не понимать деталей?

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

  1. "Код на уровне студента" — прекрасно, но покажите, как написать лучше. Ни одной статьи, ни одного примера вашего кода на горизонте, только обвинения, минусовой рейтинг и 200+ пустых отзывов.

  2. "Приводит к проблемам" — каких именно? Опишите четко и обоснованно, с примерами. Иначе это просто слова ради слов.

  3. "Блокировка Telegram" — завязка на Telegram для данного проекта была обоснована. Если у вас есть конкретные предложения по архитектуре, где Telegram можно заменить, давайте обсудим. И не забывайте, что всегда можно добавить поддержку альтернативных платформ.

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

И теперь, вы ж у нас "Middle python developer". Кроме хамства и перехода на личности продемонстрируйте свой профессионализм в коде, а не пустым гонором тут. Я вам задал конкретный вопрос. Ответьте.

Вот код от вчерашнего студента, который вчера вечером почитал документацию Aiogram и услышал, что веб-хуки круто, а после криво их реализовал:

async def robokassa_result(request: web.Request) -> web.Response:
    """
    Обрабатывает запрос от Робокассы на ResultURL.

    :param request: HTTP-запрос
    :return: Текстовый ответ с результатами проверки
    """
    logger.success("Получен ответ от Робокассы!")
    data = await request.post()

    # Извлекаем параметры из запроса
    signature = data.get('SignatureValue')
    out_sum = data.get('OutSum')
    inv_id = data.get('InvId')
    user_id = data.get('Shp_user_id')
    user_telegram_id = data.get('Shp_user_telegram_id')
    product_id = data.get('Shp_product_id')

    # Проверяем подпись
    if check_signature_result(
        out_sum=out_sum,
        inv_id=inv_id,
        received_signature=signature,
        password=settings.MRH_PASS_2,
        user_id=user_id,
        user_telegram_id=user_telegram_id,
        product_id=product_id
    ):
        result = f"OK{inv_id}"
        logger.info(f"Успешная проверка подписи для InvId: {inv_id}")

        payment_data = {
            'user_id': int(user_id),
            'payment_id': signature,
            'price': int(out_sum),
            'product_id': int(product_id),
            'payment_type': "robocassa"
        }
        async with async_session_maker() as session:
            await successful_payment_logic(
                session=session,
                payment_data=payment_data,
                currency="₽",
                user_tg_id=int(user_telegram_id),
                bot=bot
            )
            await session.commit()
    else:
        result = "bad sign"
        logger.warning(f"Неверная подпись для InvId: {inv_id}")

    logger.info(f"Ответ: {result}")
    return web.Response(text=result)

Подскажите альтернативу этому подходу без хуков на методе поллинга. Опрашивать будем раз в 5 секунд платежку, да?

Вы так пишите, как будто ни разу не пытались делать ботов на поллинге. Если бы вы реально делали проект который должен работать 24/7, вы бы знали что поллинг отваливается со временем и лечится только перезагрузкой контейнера/перезапуском файла, никакие надстройки и параметры это не исправят.

Вы, как опытный кодер и "не вчерашний студент" подскажите. Какие бы лично вы тут правки внесли, кроме замены 1 строки кода?

Не отвлекайся. Люди, которые хотят что-то внести полезного, вместе с критикой предлагают свой вариант решения. А так - одно балоболство.

Спасибо за статью! Хотелось бы узнать как работать с корзиной? Видел пример где для каждого товара создают свою корзину и суммируют их.

Здравствуйте!

Существует множество стратегий, как реализовать функцию корзины покупок. Одна из самых простых — фиксировать товары, добавленные пользователем, в базе данных. Для этого можно использовать как Redis, так и табличные базы данных, такие как SQLite или PostgreSQL.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий