MIKHAN_GO
@MIKHAN_GO

Почему в telebot функция срабатывает дважды?

def check(message):
    if client.get_chat_member(channel_chat_id,  message.chat.id).status in need_status:
        return True
    else:
        client.send_message(message.chat.id, subscribe_error_msg)
        return False

@client.message_handler(commands = ['start'], func=check)
def hello(message):
    with sqlite3.connect("users.db") as con:
        cur = con.cursor()
        info = cur.execute('SELECT * FROM users WHERE userid=?', (int(message.chat.id), ))
        if info.fetchone() is None:
            user_info = (int(message.chat.id), message.from_user.first_name, message.from_user.last_name, undefined_status)
            cur.execute(f"""INSERT INTO users VALUES(?, ?, ?, ?);""", user_info)
            con.commit()
    sti = open('static/welcome.webp', 'rb')
    client.send_sticker(message.chat.id, sti)

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton(register)

    markup.add(item1)

    client.send_message(message.chat.id, hello_message.format(message.from_user, client.get_me()), parse_mode='html', reply_markup=markup)

Почему-то при отсутствии тебя в канале выводит 2 сообщения с текстом "вы не подписаны на канал".
Если же пользователь подписан на канал, то все ок
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
@twistfire92
Python backend developer
Судя по-всему ситуация такая:

у вас несколько хендлеров, каждый из которых проверяет наличия юзера в чате.

@client.message_handler(commands = ['start'], func=check)

@client.message_handler(content_type= ['text'], func=check)


и т.д.
Пользователь присылает сообщение. Срабатывает проверка в первом хендлере. Во время этой проверке выясняется, что пользователь не состоит в чате, ему отправляется сообщение и возвращается False.
Из-за того, что первый хендлер не сработал, срабатывает проверка в следующем. И ситуация повторяется.

Как вариант, можно сделать следующее:
Насколько я понимаю, бот не должен ничего делать, если пользователь не состоит в чате.
Делайте отдельный хендлер с проверкой на то, то пользователь НЕ состоит в чате.

def check(message):
    if client.get_chat_member(channel_chat_id,  message.chat.id).status in need_status:
        return False
    else:
        return True

@client.message_handler(content_types=['text'], func=check)
def access_denied(message):
    client.send_message(message.chat.id, subscribe_error_msg)


И этот хендлер надо поставить выше всех остальных, тогда он будет ловить вообще все сообщения самым первым. Если пользователя нет в нужном чате, он срабатывает, пишет что проверка не пройдена и все, другие хендлеры работать не будут.

Думаю, суть понятна.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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