@robocop45
Only python

Как сделать кнопку неактивной на 10 сек, после ее нажатия?

Есть бот на основе парсера, который собирает скидки из ситилинка. Работает все прекрасно!!! Но есть одно но, если пользователь нажмет много раз на кнопку "показать процессоры", то это будет много запросов, за которых можно получить флуд или ляжет бот. Можно конечно сделать так
if index % 20 == 0:
            tm.sleep(5)

но это просто ограничение по выводу карточек. Решение непрактичное

В итоге, как можно сделать кнопку 'показать процессоры' неактивной на 10 сек после нажатия на нее
Библиотека aiogram
  • Вопрос задан
  • 490 просмотров
Решения вопроса 1
@OoU
import time

def callback_handler(update, context):
    query = update.callback_query
    # Disable the button
    context.bot.answer_callback_query(callback_query_id=query.id, text="Button disabled", show_alert=False, disable_notification=True)
    # Start the timer
    time.sleep(10)
    # Enable the button
    context.bot.answer_callback_query(callback_query_id=query.id, text="Button enabled", show_alert=False, enable_notification=True)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@HXNDY
import telebot
from telebot import types
import threading
import time

bot = telebot.TeleBot("token")

clicked = False
timeout = 10  # Секунд

def run_in_thread(func):
    def wrapper(*args, **kwargs):
        thread = threading.Thread(target=func, args=args, kwargs=kwargs)
        thread.start()
    return wrapper


@run_in_thread
def asynchronous():
    global clicked
    while True:
        if clicked:
            time.sleep(timeout)
            clicked = False


@bot.message_handler(commands=["start"])
def start(message):
    markup = types.InlineKeyboardMarkup()
    hello_button = types.InlineKeyboardButton(text="Показать процессоры", callback_data="cpu")
    markup.add(hello_button)
    bot.send_message(message.chat.id, "Здравствуйте, %s!" % (f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})"), parse_mode="markdown", reply_markup=markup)


@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
    global clicked
    if clicked:
        bot.answer_callback_query(call.id, "Попробуйте снова через 10 секунд!", show_alert=True)
        return
    
    if call.data == "cpu":
        clicked = True
        bot.send_message(call.from_user.id, "Процессоры..")


if __name__ == "__main__":
    asynchronous()
    bot.polling(none_stop=True, interval=0)


в идеале конечно завести словарь формата ID: [True/False] и не использовать global
Ответ написан
Ваш ответ на вопрос

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

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