Проблема с капчей для телеграм бота
Суть капчи в том, что надо найти запрашиваемый смайлик из меню 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):