Получение нескольких документов от пользователя pyTelegramBotAPI

Рейтинг: 0Ответов: 1Опубликовано: 10.04.2023

Имеется вот такой код:

@bot.message_handler(content_types=['document'])
def handle_docs(message):

    file_id = message.document.file_id
    file_info = bot.get_file(file_id)
    file_data = bot.download_file(file_info.file_path)
    file_name = message.document.file_name

    print(f'Обрабатываем файл: {file_name}')

    with open(file_name, 'wb') as new_file:
        new_file.write(file_data)

    with open(file_name, 'rb') as send_file:
        bot.send_document(chat_id=admin_chat_id, document=send_file)

    bot.reply_to(message, f'Файл {file_name} отправлен')
    bot.send_message(message.chat.id, "Теперь пришлите комментарий")
    bot.register_next_step_handler(message, handle_message)


def handle_message(message):

    keyboard = types.InlineKeyboardMarkup()
    done_button = types.InlineKeyboardButton(text="Выполнено", callback_data="done")
    keyboard.add(done_button)

    bot.send_message(admin_chat_id, message.text)
    bot.send_message(admin_chat_id, f"Новое задание от @{message.from_user.username}!\n"
                                    f"Имя: {message.from_user.first_name}\n"
                                    f"Фамилия: {message.from_user.last_name}\n"
                                    f"ID чата: {message.chat.id}", reply_markup=keyboard)

    bot.send_message(message.chat.id, "Текст получен! Павел Картошкин счастлив")

Он должен принять от пользователя файлы, отправить их администратору (admin_chat_id), а затем запросить у пользователя комментарий к этим файлам и тоже отправить администратору. Но когда пользователь присылает несколько документов за раз, бот выполняет функцию-обработчик документов (handle_docs) несколько раз, соответственно слудующая функция, запрашивающая комментарий, тоже вызывается несколько раз. Есть ли способ отследить последнее выполнение функции, чтобы вызывать следующий шаг только после него, или каким-то иным способом реализовать приём нескольких документов от пользователя, запрашивая после этого комментарий. Я никак не могу сделать так, чтобы первый шаг выполнялся несколько раз, а второй шаг - только один раз.

Ответы

▲ 0

Путём экспериментов спустя несколько часов я всё-таки нашёл решение. Элементарное. Нужно объявить дополнительную переменную, которая не будет позволять функции handle_message выполняться больше одного раза:

flag = False


@bot.message_handler(content_types=['document'])
def handle_docs(message):
    global flag

    file_id = message.document.file_id
    file_info = bot.get_file(file_id)
    file_data = bot.download_file(file_info.file_path)
    file_name = message.document.file_name

    print(f'Обрабатываем файл: {file_name}')

    with open(file_name, 'wb') as new_file:
        new_file.write(file_data)

    with open(file_name, 'rb') as send_file:
        bot.send_document(chat_id=admin_chat_id, document=send_file)

    bot.reply_to(message, f'Файл {file_name} отправлен')

    if not flag:
        flag = True
        bot.register_next_step_handler(message, handle_message)


def handle_message(message):
    global flag

    keyboard = types.InlineKeyboardMarkup()
    done_button = types.InlineKeyboardButton(text="Выполнено", callback_data="done")
    keyboard.add(done_button)

    bot.send_message(admin_chat_id, message.text)
    bot.send_message(admin_chat_id, f"Новое задание от @{message.from_user.username}!\n"
                                    f"Имя: {message.from_user.first_name}\n"
                                    f"Фамилия: {message.from_user.last_name}\n"
                                    f"ID чата: {message.chat.id}", reply_markup=keyboard)

    bot.send_message(message.chat.id, "Текст получен! Павел Картошкин счастлив")

    flag = False

Конструкция

if not flag:
    flag = True
    bot.register_next_step_handler(message, handle_message)

работает как электрический предохранитель: срабатывает только один раз. Может кому-то это сэкономит часок-другой :)