Можно ли ограничить частоту нажатия на кнопку Inline — Telegram bot?
Подскажите - есть код на получение картинки при нажатии на кнопку Inline - возможно ли ограничить частоту нажатия на кнопку - чтоб нельзя было нажимать на кнопку бесконечно - например если пользователь нажимает повторно на кнопку получения фото - ему отправляется сообщение что вы уже получили фото... и допустим повторите нажатие через 2-3-4 часа - например. python - telegrambotapi
@bot.callback_query_handler(func=lambda call: call.data == "requestphoto1")
def test_callback(call):
# считываем текущее время
tm_now = time()
# сравниваем с временем предыдущего вызова функции ( ведь есть же хранилище, в котором хранится предыдущее время, ведь так?)
# если условия по времени не удовлетворяют требованиям
if (tm_now - tm_last) < treshold:
do_something()
return
files = []
for ext in ["png", "jpg", "jpeg", "PNG", "JPG", "JPEG"]:
[files.append(file) for file in glob.glob(f"test/*.{ext}")]
random_file = files[random.randint(0, len(files) - 1)]
with open(random_file, 'rb') as f:
bot.send_media_group(call.message.chat.id, [types.InputMediaPhoto(f, )])
bot.answer_callback_query(callback_query_id=call.id, text="Отправлено!")
shurshur, я полностью согласен с вами , но если хочется сделать, а знаний не много, приходится обращаться за помощью к людям, которые могут помочь. Спасибо!)
Учите питон, практикуйтесь на чем-то простом, потом переходите на ботов. Очень много объяснять, для формата тостера, учебник сюда тоже переписывать не очень.
time() - функция из модуля time, который надо импортировать.
from time import time
print(time())
treshold - пороговой значение, в данном случае - порог разницы во времени, с которым сравнивается реальные значения. treshold надо где-то задать, так просто она не существует.
Подсчет количества секунд в 30 минутах, этот вопрос точно на тостере надо задавать? Давайте подумаем. В 1 минуте - 60 секунд, в 30 минутах - 60*30=1800 секунд, если нам надо ограничить 30 минутами - treshold = 1800
from random import randint
from time import time, sleep
tm_last = time() # храним тут последнее зафиксированное время (секунды)
treshold = 5 # пороговое значение (секунды)
for _ in range(10):
sleep(randint(1, 10)) # спим случайное количество секунд из диапозона 1 - 10
tm_now = time() # текущее время
if (tm_now - tm_last) < treshold:
print(f'(tm_now - tm_last) < treshold | ({tm_now - tm_last}) < {treshold}')
else:
print(f'(tm_now - tm_last) > treshold | ({tm_now - tm_last}) > {treshold}')
tm_last = tm_now # записываем последнее обработанное время
bbkmzzzz, спасибо за информацию - но я просил как объединить мой код с этой функцией
я это все читал в руководствах - но у меня не получается это объединить чтоб все работало
мой код:
@bot.callback_query_handler(func=lambda call: call.data == "requestphoto1")
def test_callback(call):
files = []
for ext in ["png", "jpg", "jpeg", "PNG", "JPG", "JPEG"]:
[files.append(file) for file in glob.glob(f"test/*.{ext}")]
random_file = files[random.randint(0, len(files) - 1)]
with open(random_file, 'rb') as f:
bot.send_media_group(call.message.chat.id, [types.InputMediaPhoto(f, )])
bot.answer_callback_query(callback_query_id=call.id, text="Отправлено!")
lback_query_handler(func=lambda call: call.data == "requestphoto1")
def test_callback(call):
# считываем текущее время
tm_now = time()
# сравниваем с временем предыдущего вызова функции ( ведь есть же хранилище, в котором хранится предыдущее время, ведь так?)
# если условия по времени не удовлетворяют требованиям
if (tm_now - tm_last) < treshold:
# завершаем функцию. если времени прошло меньше, чем порог
return
files = []
for ext in ["png", "jpg", "jpeg", "PNG", "JPG", "JPEG"]:
[files.append(file) for file in glob.glob(f"test/*.{ext}")]
random_file = files[random.randint(0, len(files) - 1)]
with open(random_file, 'rb') as f:
bot.send_media_group(call.message.chat.id, [types.InputMediaPhoto(f, )])
bot.answer_callback_query(callback_query_id=call.id, text="Отправлено!")