from dotenv import load_dotenv
import os
import random
import logging
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.dispatcher import FSMContext
load_dotenv()
BOT_TOKEN = os.getenv("BOT_TOKEN")
CHANEL_LINK = os.getenv("CHANEL_LINK")
CHANEL_ID=os.getenv("CHANEL_ID")
CHANEL_NAME="Chanel name"
def MESSAGE_TEXT_SWITCH_NUMBER(number): return f"Выберете число - {number}"
MESSAGE_TEXT_HELLO=f"Привет. Я администратор канала {CHANEL_NAME}\n Для того чтобы стать участником канала, пройдите капчу."
MESSAGE_TEXT_ENTER_CAPCHA="Для того чтобы стать участником нашего канала, нужно пройти капчу."
logging.basicConfig(level=logging.INFO)
storage = MemoryStorage()
class Capcha(StatesGroup):
numbers= State()
correct_number=State()
message_id_capcha= State()
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot, storage=storage)
def buttonsCapcha(arr):
inline_keyboard = types.InlineKeyboardMarkup()
for number in arr: inline_keyboard.add(types.InlineKeyboardButton(text=number,callback_data=number))
return inline_keyboard
def generate_numbers(length=3):
numbers=[]
while len(numbers) < length:
number=random.randrange(10, 100, 10)
if number not in numbers: numbers.append(number)
return numbers
def get_correct_number(arr): return random.choice(arr)
@dp.chat_join_request_handler(state='*')
async def some_handler(chat_member: types.ChatJoinRequest, state: FSMContext):
await bot.send_message(chat_id=chat_member.from_user.id, text=MESSAGE_TEXT_HELLO)
await state.set_state(state=Capcha)
numbers=generate_numbers()
correct_number= get_correct_number(numbers)
async with state.proxy() as data:
data['numbers']=numbers
data['correct_number']=correct_number
capcha_data = await state.get_data()
message=await bot.send_message(chat_id=chat_member.from_user.id, text=MESSAGE_TEXT_SWITCH_NUMBER(capcha_data['correct_number']), reply_markup=buttonsCapcha(capcha_data['numbers']))
await state.update_data(message_id_capcha=message.message_id)
@dp.callback_query_handler(lambda callback_query: True, state='*' )
async def some_callback_handler(callback_query: types.CallbackQuery, state: FSMContext):
await bot.answer_callback_query(callback_query_id=callback_query.id)
capcha_data=await state.get_data()
print(capcha_data) # Вывод: "{}"
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Всем привет. Когда я беру данные из state в
@dp.chat_join_request_handler, всё работает отлично, но когда я хочу получить данные из state в
@dp.callback_query_handler, то после нажатия на кнопку, я получаю пустой объект. Почему так? Как мне получить данные?