Как ограничить доступ к командам бота на заданое время
Как ограничить выполнение команды на несколько секунд. Если команду вызвал один пользователь то доступ для этой команды для всех пользователей ограничен на время. А если кто то пробует вызвать команду то появляеться алерт что команду нельзя использовать столько то времени. На форуме нашел решение, но там не могу написать коментарий пока.
@dp.message_handler(commands='weather')
async def command_weather(message: types.Message):
await message.answer(weather.get_weather())
last_time = datetime.now()
delta = datetime.now() - last_time
if delta.second > 30:
await message.answer(weather.get_weather())
else:
Тут алерт ('Извините 30 секунд ещё не прошло')
Там было так описано... но выходит если команду вызвать то команда все таки будет использована, а потом уже сработает условие...
import datetime
current_datetime = datetime.now()
IndentationError: unexpected indent
Ответы (2 шт):
Пробуйте
from datetime import datetime, timedelta
last_time = datetime.now() - timedelta(seconds=30)
@dp.message_handler(commands='weather')
async def command_weather(message: types.Message):
global last_time
if (datetime.now() - last_time).seconds < 30:
await message.answer("Слишком часто")
return
await message.answer(weather.get_weather())
last_time = datetime.now()
UPD
Пример для инлайн кнопок
last_time = datetime.now() - timedelta(seconds=30)
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.answer("text", reply_markup=types.InlineKeyboardMarkup().add(
types.InlineKeyboardButton(text="Погода", callback_data="weather")))
@dp.callback_query_handler(text='weather')
async def command_weather(call: types.CallbackQuery):
global last_time
if (datetime.now() - last_time).seconds < 30:
await call.answer("Слишком часто")
return
await call.message.answer("weather.get_weather()")
last_time = datetime.now()
Как оказалось у aiogram уже есть готовое решение. Я просто не знал как правильно оно называется.
https://docs.aiogram.dev/en/latest/examples/throtling_example.html
from aiogram.utils.exceptions import Throttled
@dp.message_handler(commands='start')
async def cmd_start(message: types.Message):
try:
await dp.throttle('start', rate=10)
except Throttled:
await message.reply('Подождите 10 секунд. Нельзя часто использовать эту команду.')
else:
await message.reply("Команда выполнилась")
