@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 раза, и я подписан)
  • Вопрос задан
  • 326 просмотров
Пригласить эксперта
Ответы на вопрос 2
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}')
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы