После проверки подписки на канал программа не работает
@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 шт):
Эхх... Ну она и не должна работать. У вас три хендлера. У всех трех хендлеров один и тот же фильтр, а как мы знаем, при получении сообщения/колбека от юзера, бот тригерит первый хендлер который подходит по условиям/фильтру.
В этом случае ваш бот видит первый(верхний) хендлер который способен реагировать на текст "Подтвердить" и всё. Нижние хендлеры же он игнорирует так как первый хендлер имеет условие 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}')
Но если говорить откровенно, я не помню можно ли юзать два лямбда фильтра одновременно. А так думаю суть понятна. Удачи