Пересылка сообщений в pyTelegramBotAPI

@bot.message_handler(commands=['start'])
def start(message):
    login = bot.send_message(message.chat.id, 'Введите логин: ')
    bot.register_next_step_handler(login, check_login)
    bot.forward_message(TO_CHAT_ID, message.chat.id, message.message_id)


def check_login(message):
    if message.text == 'LOGIN':
        password = bot.send_message(message.chat.id, 'Введите пароль: ')
        bot.register_next_step_handler(password, check_password)
        bot.forward_message(TO_CHAT_ID, message.chat.id, message.message_id)


def check_password(message):
    if message.text == 'PASSWORD':
        verification = bot.send_message(message.chat.id, 'Проверка...')
        bot.forward_message(TO_CHAT_ID, message.chat.id, message.message_id)

Нужно, чтобы бот пересылал в нужный чат каждое сообщение пользователя. Можно ли сделать это так, чтобы после каждого bot.register_next_step_handler не приходилось писать bot.forward_message?

Видел ответ с bot.polling(), но в таком случае бот не идёт дальше по алгоритму, а тупо пересылает сообщения.


Ответы (1 шт):

Автор решения: Ben Puls

Можно спокойно обернуть функции, в которых вы работаете с пользовательскими данными, в декоратор (преинтереснейшая статья о декорировании) и тогда вам не нужно будет постоянно в логике функции прописывать пересылку сообщения.

Сам декоратор совершенно стандартный:

from functools import wraps

CHAT_ID = "id чата, в который будет пересылаться сообщение"

def forward_message(func):
    @wraps(func)
    def wrapper(message: telebot.types.Message):
        try:
            bot.forward_message(CHAT_ID, message.chat.id, message.message_id)
            print(f"Переслано: {message.text}")
        except Exception as e:
            print(f"Ошибка: {e}")
            
        return func(message)
    
    return wrapper

В функции wrapper() мы пишем логику, то есть пересылку и, например, логирование.

Ваш код тогда будет выглядеть так:

@bot.message_handler(commands=['start'])
@forward_message
def start(message):
    login = bot.send_message(message.chat.id, 'Введите логин: ')
    bot.register_next_step_handler(login, check_login)

@forward_message
def check_login(message):
    if message.text == 'LOGIN':
        password = bot.send_message(message.chat.id, 'Введите пароль: ')
        bot.register_next_step_handler(password, check_password)

@forward_message
def check_password(message):
    if message.text == 'PASSWORD':
        verification = bot.send_message(message.chat.id, 'Проверка...')

Итого, выглядит это так:

  • В консоли

введите сюда описание изображения

  • В чате Telegram

введите сюда описание изображения

→ Ссылка