Update bot.py

parent 4507e6eb
...@@ -4,6 +4,7 @@ from aiogram.types import ChatMemberUpdated, Message ...@@ -4,6 +4,7 @@ from aiogram.types import ChatMemberUpdated, Message
from aiogram.exceptions import AiogramError from aiogram.exceptions import AiogramError
from pymorphy2 import MorphAnalyzer from pymorphy2 import MorphAnalyzer
from aiogram.types import ChatMember from aiogram.types import ChatMember
from itertools import chain
import random import random
import time import time
import emoji import emoji
...@@ -46,12 +47,12 @@ SPAM_KEYWORDS = [ ...@@ -46,12 +47,12 @@ SPAM_KEYWORDS = [
"спецпредложение","эксклюзивный предложение","мой тг канал", "уникальное предложение", "только сегодня", "лютая жиза", "мерч", "продукция", "коллекция", "спецпредложение","эксклюзивный предложение","мой тг канал", "уникальное предложение", "только сегодня", "лютая жиза", "мерч", "продукция", "коллекция",
# Работа # Работа
"удалённая работа","удалённая работа", "бакс", "доллар", "$", "сумма", "выручка", "прибыль", "нужен человек", "нужен помощник", "вакансии", "удаленка","условия труда","лс" , "писать лс", "писать в лс", "бабки", "пасивный заработок","без вложений", "удалённая работа","удалённая работа", "бакс", "доллар", "$", "нужен человек", "нужен помощник", "вакансии", "удаленка","условия труда", "писать лс", "писать в лс", "лс", "партнер", "сотрудничество", "прибыль", "бабки", "пасивный заработок","без вложений", "подробности лс",
# Мошенничество # Мошенничество
"лотерея", "быстрый выигрыш", "выигрыш", "приз", "деньги", "халява", "прибыль", "заработок", "зп", "подработка", "легкий заработок", "лотерея", "быстрый выигрыш", "выигрыш", "приз", "деньги", "халява", "прибыль", "заработок", "зп", "подработка", "легкий заработок",
"мгновенно", "доход", "доход онлайн", "как заработать", "схема заработка", "мгновенно", "доход", "доход онлайн", "как заработать", "схема заработка",
"пассивный доход", "быстро заработать", "богатство", "всего за", "инвестировать", "инвестиция", "партнер", "пассивный доход", "быстро заработать", "богатство", "всего за", "инвестировать", "инвестиция",
"биткоин", "криптовалюта", "forex", "деньги на карта", "дивиденд", "процент", "депозит", "выплата", "невероятный доход", "статус","гарантированный доход", "секрет богатство", "без риск", "биткоин", "криптовалюта", "forex", "деньги на карта", "дивиденд", "процент", "депозит", "выплата", "невероятный доход", "статус","гарантированный доход", "секрет богатство", "без риск",
# Психология, манипуляции и самопомощь # Психология, манипуляции и самопомощь
...@@ -177,6 +178,10 @@ def extract_emojis(text): ...@@ -177,6 +178,10 @@ def extract_emojis(text):
return ''.join(c for c in text if emoji.is_emoji(c)) return ''.join(c for c in text if emoji.is_emoji(c))
def is_spam(text): def is_spam(text):
if text is None: # Проверяем, что текст не None
return False
# Нормализуем текст # Нормализуем текст
normalized_words = normalize_text_to_infinitive(text) normalized_words = normalize_text_to_infinitive(text)
...@@ -206,11 +211,7 @@ def is_spam(text): ...@@ -206,11 +211,7 @@ def is_spam(text):
spam_count += 1 spam_count += 1
matched_keywords.append(keyword) # Добавляем совпавшее слово в список matched_keywords.append(keyword) # Добавляем совпавшее слово в список
spam_count += emoji_count # Учитываем только спамные эмодзи spam_count += emoji_count # Учитываем только спам-эмодзи
# Выводим совпавшие ключевые слова для диагностики
if matched_keywords:
print(f"Обнаружены спамные ключевые слова: {', '.join(matched_keywords)}")
# Возвращаем True, если найдено два или более совпадений # Возвращаем True, если найдено два или более совпадений
return spam_count >= 2 return spam_count >= 2
...@@ -236,7 +237,7 @@ async def welcome_new_user(event: ChatMemberUpdated): ...@@ -236,7 +237,7 @@ async def welcome_new_user(event: ChatMemberUpdated):
chat_id=event.chat.id, chat_id=event.chat.id,
text=f"Здравствуйте, {new_user.first_name}! Добро пожаловать в нашу группу!\n\n" text=f"Здравствуйте, {new_user.first_name}! Добро пожаловать в нашу группу!\n\n"
f"Нам необходимо удостовериться, что вы человек.\n" f"Нам необходимо удостовериться, что вы человек.\n"
f"Решите математический пример в течение 1 минуты! В качестве ответа отправьте одно число.\n\n{math_problem}\n" f"Решите математический пример в течение 2-х минут! В качестве ответа отправьте одно число.\n\n{math_problem}\n"
) )
# Сохраняем данные о пользователе # Сохраняем данные о пользователе
...@@ -249,16 +250,14 @@ async def welcome_new_user(event: ChatMemberUpdated): ...@@ -249,16 +250,14 @@ async def welcome_new_user(event: ChatMemberUpdated):
"chat_id": event.chat.id, "chat_id": event.chat.id,
} }
print(f"Приветственное сообщение отправлено пользователю {new_user.id} с примером {math_problem}")
except Exception as e: except Exception as e:
print(f"Не удалось отправить сообщение в группу {event.chat.id}. Ошибка: {e}") print(f"Failed sending a message to the group {event.chat.id}. Ошибка: {e}")
# Ожидание ответа пользователя # Ожидание ответа пользователя
await check_answer(new_user.id) await check_answer(new_user.id)
async def check_answer(user_id): async def check_answer(user_id):
"""Проверка ответа пользователя через 1 минуту.""" """Проверка ответа пользователя через 1 минуты."""
await asyncio.sleep(60) await asyncio.sleep(60)
user_data = active_users.get(user_id) user_data = active_users.get(user_id)
...@@ -269,11 +268,10 @@ async def check_answer(user_id): ...@@ -269,11 +268,10 @@ async def check_answer(user_id):
# Удаляем пользователя из группы # Удаляем пользователя из группы
await bot.ban_chat_member(chat_id=user_data["chat_id"], user_id=user_id) await bot.ban_chat_member(chat_id=user_data["chat_id"], user_id=user_id)
print(f"Пользователь {user_id} не ответил вовремя. Удален из группы.")
except AiogramError as e: except AiogramError as e:
print(f"Ошибка при удалении пользователя {user_id}. Ошибка: {e}") print(f"User deletion error {user_id}. Error: {e}")
except Exception as e: except Exception as e:
print(f"Ошибка при удалении пользователя {user_id}. Ошибка: {e}") print(f"User deletion error {user_id}. Error: {e}")
async def cleanup_messages(user_data): async def cleanup_messages(user_data):
"""Удаление всех сообщений пользователя и бота.""" """Удаление всех сообщений пользователя и бота."""
...@@ -281,22 +279,19 @@ async def cleanup_messages(user_data): ...@@ -281,22 +279,19 @@ async def cleanup_messages(user_data):
# Удаляем все сообщения бота # Удаляем все сообщения бота
for message_id in user_data["message_ids"]: for message_id in user_data["message_ids"]:
try: try:
print(f"Удаляю сообщение бота: chat_id={user_data['chat_id']}, message_id={message_id}")
await bot.delete_message(chat_id=user_data["chat_id"], message_id=message_id) await bot.delete_message(chat_id=user_data["chat_id"], message_id=message_id)
print(f"Сообщение бота для пользователя {user_data['chat_id']} удалено.")
except Exception as e: except Exception as e:
print(f"Ошибка при удалении сообщения бота. Ошибка: {e}") print(f"Bot message deletion error. Error: {e}")
# Удаляем сообщения пользователя # Удаляем сообщения пользователя
for user_message in user_data["user_messages"]: for user_message in user_data["user_messages"]:
try: try:
if user_message: if user_message:
await bot.delete_message(chat_id=user_data["chat_id"], message_id=user_message.message_id) await bot.delete_message(chat_id=user_data["chat_id"], message_id=user_message.message_id)
print(f"Сообщение пользователя {user_message.message_id} удалено.")
except Exception as e: except Exception as e:
print(f"Ошибка при удалении сообщения пользователя. Ошибка: {e}") print(f"User message deletion error. Error: {e}")
except Exception as e: except Exception as e:
print(f"Ошибка при удалении сообщений. Ошибка: {e}") print(f"Message deletion error. Error: {e}")
@router.message() @router.message()
async def handle_message(message: Message): async def handle_message(message: Message):
...@@ -308,10 +303,9 @@ async def handle_message(message: Message): ...@@ -308,10 +303,9 @@ async def handle_message(message: Message):
if chat_member.status not in ["member", "administrator", "creator"]: if chat_member.status not in ["member", "administrator", "creator"]:
# Если пользователь не участник, удаляем его сообщение # Если пользователь не участник, удаляем его сообщение
await message.delete() await message.delete()
print(f"Удалено сообщение от пользователя {message.from_user.id}, который не является участником группы.")
return return
except AiogramError as e: except AiogramError as e:
print(f"Ошибка при проверке статуса пользователя {message.from_user.id}. Ошибка: {e}") print(f"User status verification error {message.from_user.id}. Error: {e}")
text = message.text or message.caption or "" text = message.text or message.caption or ""
text = " ".join(normalize_text_to_infinitive(text)) # Убедимся, что это строка text = " ".join(normalize_text_to_infinitive(text)) # Убедимся, что это строка
...@@ -320,42 +314,35 @@ async def handle_message(message: Message): ...@@ -320,42 +314,35 @@ async def handle_message(message: Message):
if text and has_mixed_layout(text): if text and has_mixed_layout(text):
try: try:
await message.delete() await message.delete()
print(f"Удалено сообщение с смешанной раскладкой от пользователя {message.from_user.id}: {text}")
return return
except Exception as e: except Exception as e:
print(f"Ошибка при удалении сообщения с смешанной раскладкой. Ошибка: {e}") print(f"Error deleting a message with a mixed layout. Error: {e}")
# Проверка на мультимедиа (фото/видео) и его подпись # Проверка на мультимедиа (фото/видео) и его подпись
if message.photo or message.video or message.document: if (message.photo or message.video or message.document) and text.strip() and is_spam(text):
if text.strip(): # Проверяем, есть ли текст try:
try: await message.delete()
if is_spam(text): # Проверяем подпись к мультимедиа return
await message.delete() except Exception as e:
print(f"Удалено спамное мультимедиа сообщение от пользователя {message.from_user.id}.") print(f"Error deleting a multimedia message. Error: {e}")
return
except Exception as e:
print(f"Ошибка при удалении мультимедиа сообщения. Ошибка: {e}")
# Проверка на кнопки/ссылки # Проверка на кнопки/ссылки
if message.reply_markup and hasattr(message.reply_markup, 'inline_keyboard'): if message.reply_markup and hasattr(message.reply_markup, 'inline_keyboard'):
for row in message.reply_markup.inline_keyboard: for button in chain(*message.reply_markup.inline_keyboard):
for button in row: if button.url and any(spam_word in button.url.lower() for spam_word in SPAM_KEYWORDS):
if button.url and any(spam_word in button.url.lower() for spam_word in SPAM_KEYWORDS): try:
try: await message.delete()
await message.delete() return
print(f"Удалено сообщение с подозрительной кнопкой от пользователя {message.from_user.id}.") except Exception as e:
return print(f"Error when deleting a message with a button. Error: {e}")
except Exception as e:
print(f"Ошибка при удалении сообщения с кнопкой. Ошибка: {e}")
# Проверка на спам # Проверка на спам
if is_spam(message.text): if is_spam(message.text):
try: try:
await message.delete() await message.delete()
print(f"Удалено спамное сообщение от пользователя {message.from_user.id}: {message.text}")
return return
except Exception as e: except Exception as e:
print(f"Ошибка при удалении спамного сообщения. Ошибка: {e}") print(f"Error when trying to delete spam messages. Error: {e}")
user_data = active_users.get(message.from_user.id) user_data = active_users.get(message.from_user.id)
...@@ -370,23 +357,21 @@ async def handle_message(message: Message): ...@@ -370,23 +357,21 @@ async def handle_message(message: Message):
# Ответ правильный — сохраняем сообщение и удаляем все # Ответ правильный — сохраняем сообщение и удаляем все
correct_message = await message.reply("Благодарим!") correct_message = await message.reply("Благодарим!")
user_data["message_ids"].append(correct_message.message_id) # Добавляем в список ID сообщений user_data["message_ids"].append(correct_message.message_id) # Добавляем в список ID сообщений
print(f"Пользователь {message.from_user.id} ответил правильно.")
# Удаляем сообщения после правильного ответа # Удаляем сообщения после правильного ответа
await cleanup_messages(user_data) await cleanup_messages(user_data)
else: else:
# Ответ неправильный, добавляем новое сообщение бота # Ответ неправильный, добавляем новое сообщение бота
incorrect_message = await message.reply("Неправильный ответ. Попробуйте еще раз.") incorrect_message = await message.reply("Неправильный ответ. Попробуйте еще раз.")
user_data["message_ids"].append(incorrect_message.message_id) user_data["message_ids"].append(incorrect_message.message_id)
print(f"Отправлено сообщение о неправильном ответе для пользователя {message.from_user.id}")
else: else:
# Если ответ не число # Если ответ не число
invalid_message = await message.reply("Пожалуйста, отправьте числовой ответ.") invalid_message = await message.reply("Пожалуйста, отправьте числовой ответ.")
user_data["message_ids"].append(invalid_message.message_id) user_data["message_ids"].append(invalid_message.message_id)
print(f"Отправлено сообщение с просьбой ввести числовой ответ для пользователя {message.from_user.id}")
async def main(): async def main():
"""Запуск бота.""" """Запуск бота."""
print("bot is running")
await dp.start_polling(bot) await dp.start_polling(bot)
if __name__ == "__main__": if __name__ == "__main__":
......
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