@ArtemMik
Python

Как запускать FSM при нажатии на inline кнопку в телеграмм канале?

Мой бот не запускает state после нажатия на inline кнопку в тг канале, он просто задаёт вопрос, а fsm не запускает, до того, как я бота закинул в тг канал всё работало.

Если поставить message.chat.id = id админа, то всё работает, а с каналом не работает.

Код:
# запись txt файла в папку и переотправка txt файла в канал тг
@dp.message_handler(state=Tokens.token, content_types=['document'])   
async def tokensState(message: types.Message, state: FSMContext):
    file_id = message.document.file_id
    filename = message.document.file_name
    user_id = message.from_user.id
    if filename.endswith('.txt'):
        await bot.send_message(message.chat.id, "✅ Токены успешно добавились в очередь, ожидайте от 1ч до 24ч, если ничего не произошло, то отпишите саппорту")
        num_token = db.cur.execute('SELECT tokens FROM users WHERE user_id = ?',
                   (message.chat.id,)).fetchall()
        for number in num_token:
            num = number[0]
            upd_num = int(num + 1)
            await db.edit_tokens_users(user_id=message.chat.id, tokens=upd_num)
            # Получаем информацию о файле
            file_info = await bot.get_file(file_id)
            file_path = file_info.file_path

            # Формируем URL для загрузки файла
            file_url = f'https://api.telegram.org/file/bot{TOKEN}/{file_path}'

            # Создаем папку для сохранения файлов, если ее нет
            txt_directory = 'txtDownloads'
            os.makedirs(txt_directory, exist_ok=True)

            # Имя файла для сохранения
            filename = os.path.join(txt_directory, f'{filename}')

            # Загружаем файл
            async with aiohttp.ClientSession() as session:
                async with session.get(file_url) as resp:
                    with open(filename, 'wb') as file:
                        file.write(await resp.read())

            # Отправляем файл
            with open(filename, 'rb') as txt_file:
                await bot.send_document('1046814681', txt_file)

            # Отправка файла из папки txtDownloads
            users = db.cur.execute('SELECT user_name FROM users WHERE user_id = ?',
                                       (message.chat.id,)).fetchall()
            for user in users:
                us = user[0]
            date = datetime.now()
            markup = InlineKeyboardMarkup(row_width=2)
            markup.add(InlineKeyboardButton(text=f"Выдать баланс", callback_data=f"isBal_{user_id}"))
            await bot.send_message(ADMIN_ID, f"{filename}, ✅Новая пачка токенов\nПоставщик: ({us})\nUser_id: ({user_id})\nВремя: ({date})", reply_markup=markup) #отправка в канал админа
            await bot.send_message(USER_CHAT_ID, f"{filename}, ✅Новая пачка токенов\nПоставщик: ({us})\nUser_id: ({user_id})\nВремя: ({date})") #отправка в канал клиентов (без кнопки)
    else:
        await bot.send_message(message.chat.id, "Отправьте <b>txt</b> документ с токенами, каждый токен с новой строчки, или же пропишите <b>'Отмена'</b> для того чтобы отменить выгрузку", parse_mode=ParseMode.HTML)
    await state.finish()


#callback_query забирает после _ id юзера и запускает FSM
@dp.callback_query_handler(lambda c: c.data.startswith('isBal_'))  
async def isBal(callback_query: types.CallbackQuery, state: FSMContext):
    user_id = callback_query.data.split('_')[1]
    async with state.proxy() as data:
        data['user_id'] = user_id
    await bot.send_message(ADMIN_ID_User, f"Сколько выдать?") # после этой команды FSM не запускается
    await IssueBalance.issue_balance.set()



@dp.message_handler(state=IssueBalance.issue_balance)  #FSM,  обработка нового баланса пользователю от админа
async def issueBalanceState(message: types.Message, state: FSMContext):
    print('gfdgfdgd') # этот принт не выводится
    async with state.proxy() as data:
        user_id = data['user_id']
    price = db.cur.execute('SELECT price FROM users WHERE user_id = ?',
                             (user_id,)).fetchall()
    for balance in price:
        new_balance = int(balance[0] + int(message.text))
    await db.edit_balance_user(price=new_balance, user_id=user_id)
    await bot.send_message(ADMIN_ID_User, f"Вы выдали - {message.text} пользователю с user_id: ({user_id})")
    await bot.send_message(user_id, f"На ваш баланс было зачисленно - {message.text}")
    await state.finish()

На скриншотах видно, что FSM не работает:
663e0e18d219e866710044.png
663e0e1fa2d9d061324141.png
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы