Задать вопрос
@Trefame

Как защитить бота Telegram от спама?

Возникла проблема с моим ботом телеграмм, один из его пользователей, каким то софтом решил его заспамить - получилось вполне успешно, бот лег. Как можно реализовать систему антиспама, чтобы при попытке отправить допустим больше одного сообщение в 5 секунд - приходило стоп-сообщение: Между сообщениями должна быть пауза 5 секунд! За продолжение спама Вы можете быть заблокированы. Если пользователь проигнорировал предупреждение и отправил допустим больше 5 сообщений без паузы, то его аккаунт, который я храню в базе данных приобретал статус - Заблокирован, а бот проверял статус пользователя и если он заблокирован, просто завершал работу через exit(), но это неважно, главное то, как мне хранить оставшееся время и прочее? Ничего в голову не приходит..
  • Вопрос задан
  • 3419 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 2
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Для этого нужно в боте отслеживать user_id и timestamp последнего сообщения.
Можно завести в БД таблицу c 2-мя колонками: user_id (unique), last_message_time.
Когда от пользователя приходит новое сообщение, вы достаёте last_message_time для текущего user_id и смотрите сколько секунд прошло между последним сообщением и текущим временем.
Если прошло меньше 5 секунд, то шлёте предупреждение и считаете что произошло нарушение от user_id, если прошло больше 5 секунд, то считаем сообщение валидным и не забываем обновить last_message_time для user_id.

Единственный способ заспамить бота в таком случае это будет отправка сообщений с множества разных аккаунтов, что уже гораздо сложнее для злоумышленника.
Ответ написан
Dimastik86
@Dimastik86
(isset($brain))?: die;
можно тупо чисто на триггерах мускула...
вариант придумал только что, не претендую на истину!

На основной табл, куда сохраняются сообщения - перед добавлением, проверяет разницу времени с прошлым сообщением этого пользователя (определить по id).

При наступлении события - в доп таблицу(журнал) делаем запись: время-пользователь.

Тут же делаем проверку, на кол-во записей в журнале с выборкой по id и за определенное время - если записей больше чем N кол-во за последние, например 5 минут, то просто тупо срабатывает стоп и все! Как только кол-во снижается до допустимого, появляется возможность писать.

Это будет работать для всех пользователей, на уровне базы...
По поводу сообщений - надо смотреть, скорей всего эту ошибку можно отловить и вернуть ответом в чат, только зачем?! Лучше настроить так, чтобы обычный пользователь с ней вообще не сталкивался, а те другие, пусть развлекаются дальше )) Советую аудиокнигу (ответ на твой вопрос на 6:30)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Kiki_iki
Друзья, кому интересен реализованный код:

@bot.message_handler(func=lambda message: True)
def echo_all(message):
if message.from_user.id not in last_message:
last_message[message.from_user.id] = message.date - 5
print(last_message)
if message.date - last_message[message.from_user.id] > 5:
bot.reply_to(message, message.text)
last_message[message.from_user.id] = message.date
print(last_message)

last_message = {}
bot.polling()
Ответ написан
Комментировать
@fourclever
В общем, кто бы что ни выдумывал, фактический ответ на сегодняшний день - никак. А если ваш бот к тому же размещён в облаке, или на слабом сервере, то можно ещё и по-шантажировать вас. Ведь каждый вызов функций бота чего-то стоит - либо денег, либо ресурсов.
Ответ написан
Комментировать
@nsk-realty
В Телеграм есть боты, которые позволяют защититься от спама на канале, например, https://t.me/SpamRemoverRobot
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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