Проблема с капчей для телеграм бота
Суть капчи в том, что надо найти запрашиваемый смайлик из меню Inline кнопок, если выбрать неверный, то меню со смайлами перемешается и надо заново выбрать, если выбрать верный то бот скажет, что ты прошел капчу. Если запустить код первый раз, то после выполнения команды /start все работает идеально, однако если второй раз нажать /start и попытаться пройти капчу, то появляется проблема: запрашиваемый смайлик сохраняет значение переменной предыдущего запрашиваемого смайлика, но бот не показывает этого и когда выбираешь из меню смайлик, то бот сверяет его с запрашиваемым смайлом из самой первой капчи ну и пишет что это неверно, вот полный код:
import random
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
from config import MAIN_BOT_TOKEN
bot = Bot(token=MAIN_BOT_TOKEN)
dp = Dispatcher(bot)
emojis = ['?','?','?','?','?','?','?','⬜️','⬛️']
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
correct_emoji = random.choice(emojis)
shuffled_emojis = generate_captcha()
keyboard = create_keyboard(shuffled_emojis)
await message.answer(f"Найдите смайлик {correct_emoji}", reply_markup=keyboard)
await bot.send_message(message.chat.id, "Найдите указанный смайлик, чтобы продолжить.")
@dp.callback_query_handler(lambda c: True)
async def process_callback(callback_query: types.CallbackQuery):
if callback_query.data == correct_emoji:
await bot.answer_callback_query(callback_query.id, "Верно!")
await bot.send_message(callback_query.message.chat.id, "Вы прошли проверку на капчу!")
else:
shuffled_emojis = generate_captcha()
keyboard = create_keyboard(shuffled_emojis)
await bot.answer_callback_query(callback_query.id, "Неверно! Попробуйте еще раз.")
await bot.edit_message_reply_markup(callback_query.message.chat.id, message_id=callback_query.message.message_id, reply_markup=keyboard)
def generate_captcha():
shuffled_emojis = random.sample(emojis, len(emojis))
return shuffled_emojis
def create_keyboard(shuffled_emojis):
keyboard = InlineKeyboardMarkup()
for i in range(0, len(shuffled_emojis), 3):
row = [InlineKeyboardButton(text=emoji, callback_data=emoji) for emoji in shuffled_emojis[i:i+3]]
keyboard.row(*row)
return keyboard
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=False)
Через отладчик заметил что переменная correct_emoji(запрашиваемый смайл) меняется на значение из первой капчи на этой строке:
async def process_callback(callback_query: types.CallbackQuery):
Ответы (1 шт):
Мой вариант:
import random
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
bot = Bot(token="t")
dp = Dispatcher(bot)
emojis = ['?','?','?','?','?','?','?','⬜️','⬛️']
#Создаем кнопки (по старинке простите)
def created_kbr(emj):
button_list = [] #для того, что бы сработал row_width, знаешь как лучше сделай.
keyboard = InlineKeyboardMarkup(row_width=3)
random.shuffle(emj)
for item in emj:
button_list.append(InlineKeyboardButton(text=item, callback_data=item)) #callback такой же как и текст, для последующего упрощения поиска верного ответа.
keyboard.add(*button_list)
return keyboard
@dp.message_handler(commands='start')
async def start_msg(message:types.Message):
#Тут же выводим сообщение, и через рандом цвет который нужно выбрать.
await message.answer(f'Выбери: "{random.choice(emojis)}"', reply_markup=created_kbr(emojis))
@dp.callback_query_handler(text = emojis)
async def checked_correct(cq: types.CallbackQuery):
#сплитуем наш текст исходя из сообщения... cq.message.text.split = ['Выбери: ', '?', ''] наш цвет первый элемент [1] ->
capch_color = cq.message.text.split('"')[1]
if(cq.data == capch_color):
await cq.message.edit_text('Верно! Capcha пройдена')
else:
await cq.message.edit_text(f'Другой цвет! "{random.choice(emojis)}"', reply_markup=created_kbr(emojis)) #Принцип тот же,что и со старта
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=False)
Хотелось бы добавить, что handler'bI никогда не используются внутри других handler'ov(по крайней мере года 2 назад так и было, может, что поменялось ¯\(ツ)/¯ ). Лучше немного скорректировать вашу логику и пользуясь документацией писать более лаконично.