Убрана проверка новых пользователей сообщением

Добавлено несколько ключевых слов Добавлена проверка надписей на кнопках
parent 05e0b214
import asyncio
from aiogram import Bot, Dispatcher, Router
from aiogram.types import ChatMemberUpdated, Message
#from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
#from aiogram.middleware.BaseMiddleware import BaseMiddlewarefrom
from aiogram.exceptions import AiogramError
from pymorphy2 import MorphAnalyzer
from aiogram.types import ChatMember
......@@ -33,7 +31,7 @@ SPAM_KEYWORDS = [
"похудеть", "без диет", "без физическая нагрузка", "здоровье навсегда", "природное лекарство", "безопасное лечение", "детокс",
# Коммерческий спам
"скидка", "акция", "мы снова", "спрос", "бонус", "витрина", "бесплатно","платить","монетизация" , "купить", "покупать", "продать", "продажа", "дешево",
"скидка", "акция", "мы снова", "спрос", "бонус", "витрина", "бесплатно","платить","монетизация" , "купить", "купюра", "покупать", "продать", "продажа", "дешево",
"доставка", "магазин", "следить за новости", "реклама", "распродажа", "экономия", "дешевле", "недорого",
"спецпредложение","эксклюзивный предложение","мой тг канал", "уникальное предложение", "только сегодня", "лютая жиза", "мерч", "продукция", "коллекция",
......@@ -80,11 +78,11 @@ SPAM_KEYWORDS = [
"добрый время сутки", "поделиться", "отправить", "регистрироваться по ссылка" "рассказать все", "срочно", "обязательно прочитать", "написать", "пересылать", "передать друг",
# Контент, связанный с азартными играми
"время действовать", "пополнить", "счет", "джекпот", "игрок","азарт", "баланс", "казино", "розыгрыш", "ставка", "азартная игра", "рулетка", "выигрыш в казино","выигрывать", "промокод", "слоты", "подарок", "забрать подарок", "получить подарок",
"время действовать", "пополнить", "счет", "джекпот", "игрок","азарт", "баланс", "казино", "розыгрыш", "ставка", "азартная игра", "рулетка", "выигрыш в казино","выигрывать", "промокод", "слот", "подарок", "забрать подарок", "получить подарок",
"казино онлайн", "бесплатные фишки", "ставки на спорт", "играть", "победить", "победитель", "выигрывать", "фриспин", "получить выигрыш","casino", "без цензуры",
# Эмодзи, часто используемые в спаме
"🎁", "🔥", "💸", "💰", "💲", "💎", "🤑", "🤩", "⚡", "⭐", "💥", "✅", "🏆", "✋", "💖", "💝", "⚔️", "🥇", "💯", "💳", "🔞", "🥳", "😱"
"🎁", "🔥", "💸", "💰", "💲", "💎", "🤑", "🤩", "⚡", "⭐", "💥", "✅", "🏆", "✋", "💖", "💝", "⚔️", "🥇", "💯", "💳", "🔞", "🥳", "😱", "🍬", "💸", "💵", "📲", "📱"
]
def preprocess_spam_keywords(keywords, chat_id):
......@@ -133,8 +131,6 @@ class TelegramLogHandler(logging.Handler):
loop.create_task(self.send_log(log_message, log_chat_id))
# Настройка логирования
log_level = os.getenv('LOG_LEVEL', 'DEBUG').upper() # Считываем уровень логирования из .env (по умолчанию DEBUG)
logging.basicConfig(level=log_level, format='%(asctime)s - %(levelname)s - %(message)s')
......@@ -322,121 +318,11 @@ async def welcome_new_user(event: ChatMemberUpdated):
return # Прерываем дальнейшую обработку
except AiogramError as e:
logger.error(f"Failed to ban user {new_user.id}. Error: {e}", extra={"chat_id": event.chat_id})
logger.error(f"Failed to ban user {new_user.id}. Error: {e}", extra={"chat_id": event.chat.id})
except Exception as e:
logger.error(f"Error banning user {new_user.id}: {e}", extra={"chat_id": event.chat_id})
logger.error(f"Error banning user {new_user.id}: {e}", extra={"chat_id": event.chat.id})
return
math_problem, correct_answer = generate_math_problem()
try:
# Отправляем приветственное сообщение
logger.info(f"Sending welcome message to {new_user.first_name} ({new_user.id}) in chat {event.chat.id}", extra={"chat_id": event.chat.id})
welcome_message = await bot.send_message(
chat_id=event.chat.id,
text=f"Здравствуйте, {new_user.first_name}! Добро пожаловать в группу!\n\n"
f"Нам необходимо удостовериться, что вы человек.\n"
f"Решите математический пример в течение минуты! В качестве ответа отправьте одно число.\n\n{math_problem}\n"
)
# Сохраняем данные о пользователе
active_users[new_user.id] = {
"message_ids": [welcome_message.message_id], # Список для хранения всех сообщений бота
"correct_answer": correct_answer,
"timestamp": time.time(),
"user_messages": [], # Сообщения пользователя
"user_answered": False,
"chat_id": event.chat.id,
}
logger.info(f"User {new_user.first_name} ({new_user.id}) added to active users.", extra={"chat_id": event.chat_id})
except Exception as e:
logger.error(f"Failed sending a message to the group {event.chat.id}. Error: {e}", extra={"chat_id": event.chat_id})
# Ожидание ответа пользователя
await check_answer(new_user.id)
# Обработчик кнопки "Разбанить"
@router.callback_query(lambda c: c.data.startswith("unban_"))
async def unban_user(callback_query: types.CallbackQuery):
user_id = int(callback_query.data.split("_")[1])
try:
await bot.unban_chat_member(main_chat_id, user_id, only_if_banned=True)
await callback_query.answer("✅ User unbanned!")
# Сообщение в логи
await bot.send_message(
callback_query.message.chat.id,
f"✅ User <b>{user_id}</b> unbanned.",
parse_mode="HTML"
)
except AiogramError as e:
await callback_query.answer("Unbanning error.")
await bot.send_message(
callback_query.message.chat.id,
f"Error in unbanning {user_id}: {e}"
)
async def check_answer(user_id):
"""Проверка ответа пользователя через 1 минуту."""
chat_id = user_data["chat_id"]
await asyncio.sleep(60)
user_data = active_users.get(user_id)
if user_data and not user_data["user_answered"]:
try:
# Удаляем все сообщения
await cleanup_messages(user_data)
# Удаляем пользователя из группы
await bot.ban_chat_member(chat_id=user_data["chat_id"], user_id=user_id)
# Создаем кнопку для разбанивания
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="🔓 Разбанить", callback_data=f"unban_{user_id}")]
]
)
# Отправляем сообщение с кнопкой в группу логов
await bot.send_message(
chat_id=log_chat_id,
text=f"❌ User <b>{user_id}</b> has been banned in {user_data['chat_id']} due to not answering in time.",
reply_markup=keyboard,
parse_mode="HTML"
)
except AiogramError as e:
logger.error(f"User deletion error {user_id}. Error: {e}", extra={"chat_id": chat_id})
except Exception as e:
logger.error(f"User deletion error {user_id}. Error: {e}", extra={"chat_id": chat_id})
async def cleanup_messages(user_data):
"""Удаление всех сообщений пользователя и бота."""
chat_id = user_data["chat_id"] # Получаем ID чата
try:
# Удаляем все сообщения бота
for message_id in user_data["message_ids"]:
try:
await bot.delete_message(chat_id=user_data["chat_id"], message_id=message_id)
logger.info(f"Message with ID {message_id} successfully deleted from chat.", extra={"chat_id": chat_id})
except Exception as e:
logger.error(f"Bot message deletion error. Error: {e}", extra={"chat_id": chat_id})
# Удаляем сообщения пользователя
for user_message in user_data["user_messages"]:
try:
if user_message:
await bot.delete_message(chat_id=user_data["chat_id"], message_id=user_message.message_id)
logger.info(f"Message с ID {message_id} successfully deleted from chat.", extra={"chat_id": chat_id})
except Exception as e:
logger.error(f"User message deletion error. Error: {e}", extra={"chat_id": chat_id})
except Exception as e:
logger.error(f"Message deletion error. Error: {e}", extra={"chat_id": chat_id})
else: logger.info(f"User {new_user.first_name} ({new_user.id}) added to active users.", extra={"chat_id": event.chat.id})
@router.message()
async def handle_message(message: Message):
......@@ -488,6 +374,14 @@ async def handle_message(message: Message):
return
except Exception as e:
logger.error(f"Error when deleting a message with a button. Error: {e}", extra={"chat_id": chat_id})
# Проверка текста на кнопке
if button.text and any(spam_word in button.text.lower() for spam_word in SPAM_KEYWORDS):
try:
await message.delete()
logger.info(f"Message with spam button text ID {message.message_id} successfully deleted from group.", extra={"chat_id": chat_id})
return
except Exception as e:
logger.error(f"Error when deleting a message with a button text. Error: {e}", extra={"chat_id": chat_id})
# Проверка на спам
if is_spam(text, chat_id):
......@@ -498,33 +392,6 @@ async def handle_message(message: Message):
except Exception as e:
logger.error(f"Error when trying to delete spam messages. Error: {e}", extra={"chat_id": chat_id})
user_data = active_users.get(message.from_user.id)
if user_data and not user_data["user_answered"]:
# Сохраняем сообщение пользователя
user_data["user_messages"].append(message)
if message.text.isdigit():
user_answer = int(message.text)
if user_answer == user_data["correct_answer"]:
user_data["user_answered"] = True
# Ответ правильный — сохраняем сообщение и удаляем все
correct_message = await message.reply("Благодарим!")
user_data["message_ids"].append(correct_message.message_id) # Добавляем в список ID сообщений
# Удаляем сообщения после правильного ответа
await cleanup_messages(user_data)
logger.info(f"User {message.from_user.id} answered correctly with {user_answer}. Correct answer.", extra={"chat_id": chat_id})
else:
# Ответ неправильный, добавляем новое сообщение бота
incorrect_message = await message.reply("Неправильный ответ. Попробуйте еще раз.")
user_data["message_ids"].append(incorrect_message.message_id)
logger.warning(f"User {message.from_user.id} answered incorrectly with {user_answer}. Correct answer was {user_data['correct_answer']}.", extra={"chat_id": chat_id})
else:
# Если ответ не число
invalid_message = await message.reply("Пожалуйста, отправьте числовой ответ.")
user_data["message_ids"].append(invalid_message.message_id)
logger.warning(f"User {message.from_user.id} sent an invalid answer: {message.text}", extra={"chat_id": chat_id})
@dp.message(Command("spam"))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment