Как использовать "message.text" 2 раза в коде? Библиотека Aiogram

Рейтинг: 0Ответов: 2Опубликовано: 21.02.2023
@dp.message_handler(text="Promo_Code")
async def promo(message: types.Message):
    if str(message.text) == "#BLAZER":
        await bot.send_message(message.from_user.id, text="Успешно! Ссылка на сборку: \n")
    else:
        await bot.send_message(message.from_user.id, text="Введите действующий промокод. Например: #ABCD")
@dp.message_handler()
async def bot_meesage(message: types.Message):
    if message.chat.type == "private":
        if is_number(message.text):
            message_money = int(message.text)
            if message_money >= 5:
                comment = str(message.from_user.id) + "_" + \
                    str(random.randint(1000, 9999))
                bill = p2p.bill(amount=message_money,
                                lifetime=15, comment=comment)
                db.add_check(message.from_user.id, message_money, bill.bill_id)

                await bot.send_message(message.from_user.id, f"Вам нужно отправить {message_money} руб. на на счет QIWI\nСсылка: {bill.pay_url}\n Указав комментарий к оплате: {comment}", reply_markup=buy_menu(url=bill.pay_url, bill=bill.bill_id))
            else:
                await bot.send_message(message.from_user.id, "Минимальная сумма для пополнения 5 руб.")
        else:
            await bot.send_message(message.from_user.id, "Введите целое число")

Если пользователь напишет например #BALZER, то выполняется почему-то второй хендлер, как сделать так, чтобы message.text как отделялся от хендлеров?

Вот все библиотеки:

from aiogram import executor, Bot, Dispatcher, types
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from Database import Database
from pyqiwip2p import QiwiP2P
import os
import random

Ответы

▲ 0

Можно отфильтровать хэндлер с помощью анонимной функции lambda:

@dp.message_handler(lambda mes: mes.text == '#BLAZER')
async def promo(message: types.Message):
    if str(message.text) == "#BLAZER":
        await bot.send_message(message.from_user.id, text="Успешно! Ссылка на сборку: \n")
    else:
        await bot.send_message(message.from_user.id, text="Введите действующий промокод. Например: #ABCD")

Такие же действия выполнить и со вторым хэндлером. Например, если у вас кнопка "Пополнить баланс":

@dp.message_handler(lambda mes: mes.text == 'Пополнить баланс')
async def bot_meesage(message: types.Message):
    if message.chat.type == "private":
        if is_number(message.text):
            message_money = int(message.text)
            if message_money >= 5:
                comment = str(message.from_user.id) + "_" + \
                    str(random.randint(1000, 9999))
                bill = p2p.bill(amount=message_money,
                                lifetime=15, comment=comment)
                db.add_check(message.from_user.id, message_money, bill.bill_id)

                await bot.send_message(message.from_user.id, f"Вам нужно отправить {message_money} руб. на на счет QIWI\nСсылка: {bill.pay_url}\n Указав комментарий к оплате: {comment}", reply_markup=buy_menu(url=bill.pay_url, bill=bill.bill_id))
            else:
                await bot.send_message(message.from_user.id, "Минимальная сумма для пополнения 5 руб.")
        else:
            await bot.send_message(message.from_user.id, "Введите целое число")
▲ 0
@dp.message_handler(lambda mes: mess.text.startswith('Promo_Code'))
async def promo(message: types.Message):
    if str(message.text) == "#BLAZER":
        await bot.send_message(message.from_user.id, text="Успешно! Ссылка на сборку: \n")
    else:
        await bot.send_message(message.from_user.id, text="Введите действующий промокод. Например: #ABCD")

Здесь мы используем startswith() что бы проверить что строка начинается с Promo_Code