После проверки подписки на канал программа не работает

@bot.message_handler(content_types = ['text'])
def check(message):
  if message.chat.type == 'private':
    if message.text == 'Подтвердить':
      status = ['creator', 'administrator', 'member']
      for stat in status:
        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        menu_btn = types.KeyboardButton('Главное меню')
        markup.add(menu_btn)
        if stat == bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status:
          bot.send_message(message.chat.id, 'Вы подписаны на канал!', reply_markup = markup)
          break
        else:
          bot.send_message(message.chat.id, 'Доступ закрыт, подпишитесь на канал'
                                        f'{channel_link}')

@bot.message_handler(content_types = ['text'])
def func(message):
  if message.text == 'Главное меню':
    markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
    ref_btn = types.KeyboardButton('Реферальная ссылка')
    ref_count_btn = types.KeyboardButton('Ваши рефералы')
    buy_btn = types.KeyboardButton('Купить')
    markup.add(ref_btn, ref_count_btn, buy_btn)
    bot.send_message(message.chat.id, 'Меню', reply_markup = markup)

@bot.message_handler(content_types = ['text'])
def new_func(message):
  if message.text == 'Реферальная ссылка':
    bot_name = bot.get_me().username
    bot.reply_to(message, text=ref_link.format(bot_name, message.chat.id))

вот код, не знаю в чем проблема


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

Автор решения: oleksandrigo

Эхх... Ну она и не должна работать. У вас три хендлера. У всех трех хендлеров один и тот же фильтр, а как мы знаем, при получении сообщения/колбека от юзера, бот тригерит первый хендлер который подходит по условиям/фильтру.
В этом случае ваш бот видит первый(верхний) хендлер который способен реагировать на текст "Подтвердить" и всё. Нижние хендлеры же он игнорирует так как первый хендлер имеет условие content_types = ['text'] то бишь он говорит "я принимаю в себя только текст!" и так как ваши остальные хендлеры делают в целом то же самое, то и возникает эта ситуация.

Короче к главному, "Как фиксить?"

Примерно вот так.

@bot.message_handler(content_types = ['text'])
def check(message):
  if message.chat.type == 'private':
    if message.text == 'Подтвердить':
      status = ['creator', 'administrator', 'member']
      for stat in status:
        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        menu_btn = types.KeyboardButton('Главное меню')
        markup.add(menu_btn)
        if stat == bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status:
          bot.send_message(message.chat.id, 'Вы подписаны на канал!', reply_markup = markup)
          break
        else:
          bot.send_message(message.chat.id, 'Доступ закрыт, подпишитесь на канал'
                                        f'{channel_link}')
    if message.text == 'Главное меню':
      markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
      ref_btn = types.KeyboardButton('Реферальная ссылка')
      ref_count_btn = types.KeyboardButton('Ваши рефералы')
      buy_btn = types.KeyboardButton('Купить')
      markup.add(ref_btn, ref_count_btn, buy_btn)
      bot.send_message(message.chat.id, 'Меню', reply_markup = markup)
    if message.text == 'Реферальная ссылка':
      bot_name = bot.get_me().username
      bot.reply_to(message, text=ref_link.format(bot_name, message.chat.id))

Так как это не прекрасный айограм, а ужасный и страшный телебот, то красивых фильтров для хендлера вам не видать. Хотя можно было бы через лямбда функции сделать фильтрацию, это в случае когда вы захотите разбросать хендлеры по функциям. К примеру если заменить ваш первых хендлер, то можно сделать так.

@bot.message_handler(lambda msg: msg.chat.type == "private", lambda msg: msg.text == "Подтвердить")
def check(msg):
    status = ['creator', 'administrator', 'member']
    for stat in status:
        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        menu_btn = types.KeyboardButton('Главное меню')
        markup.add(menu_btn)
        if stat == bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status:
            bot.send_message(message.chat.id, 'Вы подписаны на канал!', reply_markup = markup)
            break
        else:
            bot.send_message(message.chat.id, 'Доступ закрыт, подпишитесь на канал'
                                        f'{channel_link}')

Но если говорить откровенно, я не помню можно ли юзать два лямбда фильтра одновременно. А так думаю суть понятна. Удачи

→ Ссылка