@IllIDan3

Бот проверки подписки в телеграм работает не корректно, как исправить?

@bot.message_handler(commands = ['start'])
def start(message):
  markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
  btn = types.KeyboardButton('Подтвердить')
  markup.add(btn)
  chat_id = message.chat.id
  bot.send_message(message.chat.id, f'Для продолжения нужно подписаться на канал\n'
                            f'{channel_link}', reply_markup = markup)

@bot.message_handler(content_types = ['text'])
def check (message):
  if message.chat.type == 'private':
    print(message.from_user.id)
    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}')

Вот код
Бот выдает:
"Доступ закрыт, подпишитесь на канал"
"Доступ закрыт, подпишитесь на канал" (2 раза, и я подписан)
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 3
shurshur
@shurshur
Бот всё делает так, как написано. А написано проверить, что проверяем, что пользователь по очереди creator/administrator/member и если нет - то ругаемся. Соответственно, если пользователь подписан, то два раза ругнётся и один раз поздравит (в соответствии с тем, какой у него статус, это будет 1/2/3 сообщение в цепочке).

Надо выкинуть цикл for stat in status вообще. Получить статус пользователя один раз и проверить его:

status = bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status
if status in ['creator, administrator', 'member']:
    ...
Ответ написан
SoreMix
@SoreMix Куратор тега Python
yellow
Проверка выполняется три раза, для каждого из статусов ['creator, administrator', 'member']. Пользователь не creator - отправляем Доступ закрыт, подпишитесь на канал, пользователь не administrator - отправляем Доступ закрыт, подпишитесь на канал и тд

Логичнее было бы сделать так:
user_status = bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status

if user_status in ['creator, administrator', 'member']:
    bot.send_message(message.chat.id, 'Вы подписаны на канал!', reply_markup = markup)
else:
    bot.send_message(message.chat.id, f'Доступ закрыт, подпишитесь на канал {channel_link}')
Ответ написан
@IllIDan3 Автор вопроса
Кстати, у меня опять возникла проблема.
@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.chat.type == 'private':
    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)

Кнопка "Главное меню" не работает
Ответ написан
Ваш ответ на вопрос

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

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