Комментарии 15
отличная статья но как все сложно...
Главная причина использования вебхука вместо long polling это возможность горизонтального масштабирования, а вы через .delete_webhook(...) делаете так что если один из подов упадет то остальные тоже перестанут работать. Миллион статей на хабре про тг ботов, но везде код на уровне студента вчера почитавшего доку aiogram
Я не считаю что в текущем проете главное возможность горизонтального масштабирования. Во-первых, подскажите зачем оно тут? В данном проекте? Во вторых, в статье описан большой блок о преимуществах веб-хуков. Подскажите, что из того что реализовано в проекте противоречит этому боту? Или вы, как обычно, "не читал, но осуждаю"?
Зачем вам вебхук в этом проекте? Лонг пулинг уже не справляется из-за огромных нагрузок? Вы уверены что геморрой с вебхуками по типу "так как для работы вебхуков необходим домен с поддержкой HTTPS" и еще кучи проблем в обмен на увеличение "лимита" рпс которого вам итак предостаточно с пуллингом - стоит свеч? Или вы просто прочитали где-то что это "современно модно молодежно" и не разобравшись в вопросе побежали писать 1001-ую статью про тг ботов показывая новичкам код который приведет к проблемам в будущем?
Вы оплату через Робокассу тоже предлагаете делать через поллинг? Или вы говорите о том, что лучше делать отдельное приложение для хуков под платежки? То есть, по вашему, это лучше чем в текущей реализации?
Что касается хука в контексте ботов. Как минимум, на данный момент есть прирост в скорости обработки + удобная интеграция бота в хук платежки.
Ну и повторю вопросы:
Кроме одной строчки кода, что бы вы, как "Не вчерашний студент" в коде бы заменили
Как бы вы, как "не вчерашний студент" реализовали связку хука, который ловит ответ от Робокассы и через бота пробрасывает ответ?
Или вы говорите о том, что лучше делать отдельное приложение для хуков под платежки? То есть, по вашему, это лучше чем в текущей реализации?
а, ну то есть вы завязали весь свой продукт на ТГ. Что будете делать если его заблокируют в РФ? Закроетесь? Я бы таких гениев как вы и близко не подпускал к разработке и особенно управлению продуктами. То что вы тут своими корявыми рученками накидали тянет максимум на джуновский пет проект.
А по поводу "Какие бы лично вы тут правки внесли, кроме замены 1 строки кода?" - а вам что, недостаточно одной строки кода которая ложит весь сервис и является трудноотлавливаемым багом если не понимать деталей?
Хамство и переходы на личности — это слабая позиция, особенно если за ней не стоит ничего, кроме громких слов. У вас есть конкретные претензии к коду? Тогда давайте разберем их детально.
"Код на уровне студента" — прекрасно, но покажите, как написать лучше. Ни одной статьи, ни одного примера вашего кода на горизонте, только обвинения, минусовой рейтинг и 200+ пустых отзывов.
"Приводит к проблемам" — каких именно? Опишите четко и обоснованно, с примерами. Иначе это просто слова ради слов.
"Блокировка 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.
Когда пользователь нажимает на кнопку «добавить в корзину», за ним закрепляется уникальный идентификатор товара. Затем, при переходе в раздел корзины, можно выставить общий счет.
Как сделать оплату в Telegram боте-магазине на вебхуках