Feb-07-2025, 12:42 PM
Hello, everyone. I'm completely new to Python (I've been writing code for literally 3 days). My task is to write an Antispam Telegram bot based on python-telegram-bot. At the moment, I have a problem with the fact that forwarded messages from the group are not deleted (I need to make sure that all forwarded messages from groups, bots, chats are deleted) (forwarded from). Also, the buttons attached to the telegram with links are also not deleted. Help please.
import logging import re from telegram import Update from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext # ✅ Логирование logging.basicConfig(format=“%(asctime)s - %(levelname)s - %(message)s”, level=logging.INFO) logger = logging.getLogger(__name__) # 🔹 Регулярное выражение для всех ссылок (HTTP, HTTPS, Telegram) URL_PATTERN = re.compile( r“(https?/|www\.)\S+|” # Обычные ссылки (https/, http/, www.) r“t\.me/\S+|” # Ссылки Telegram r"@+|“ # Упоминания через @username r”+\.ru\b|+\.com\b|+\.net\b|+\.org\b“ # Доменные имена r”\b(?:+\+)\b" # Защищенные домены типа glazcom…… ) # 🔹 Регулярка для запрета ссылок на ботов (t.me/ИмяБота) BOT_LINK_PATTERN = re.compile(r"t\.me\/+bot“, re.IGNORECASE) # 🔹 Регулярное выражение для фильтрации эмоджи (более 5 подряд) EMOJI_PATTERN = re.compile(r”({5,})“) # 🔹 СПАМ-ФРАЗЫ (регулярные выражения) SPAM_PATTERNS = [ r”нужны \d+ человека“, r”Срочно ищем людей на подработку“, r”срочно нужны люди на подработку“, r”Заработок \d+-\d+ рублей в день“, r”вoзьмy \d+ чeлoвекa в паpтнeры по бизнecy“, r”нужны \d+ человек“, r”СРОЧНО , нужны люди на вечернюю подработку“, r”Срочно ищем людей на подработку“, r”Оплата — \d+ рублей за смену“, r”\+ в лс“, r”Открыт набор людей, хороший доход“, r”за подробностями пишите в лс“, r”cмoжeт пoмoчь oдинoкoй дeвyшкe c пepeeздoм“, r”пиши в лс“, r”приглашаем на работу, подработку“, r”пишите в лс“, r”пиши в личку“, r”удалёнку с хорошим доходом“, r”официальном тг казино“, r”выиграл \d+к в казино“, r”Paбoтa для студeнтов и мaм в дeкpeте“, r”Гибкий гpaфик, дocтoйнaя oплатa“, r”ПОДРАБОТКА НА ПАРУ ЧАСОВ В ДЕНЬ“, r”ОТ \d+к в ДЕНЬ“, r”\d+$ в неделю“, r”\d+ \d+ - \d+ \d+ рублей, прямо с телефона“, r”\d+$ в день“, r”КАСАЕТСЯ ВСЕХ В ГРУППЕ" ] # 🔹 Функция проверки сообщения def check_message(message): # Проверяем на спам-фразы spam_match = if spam_match: print(f“❌ СПАМ: {message} (Найдено: {spam_match})”) # Печатаем на консоль return f“❌ СПАМ: {message} (Найдено: {spam_match})” # Проверяем на массовые эмоджи if EMOJI_PATTERN.search(message): print(f“❌ СПАМ (эмоджи): {message}”) return f“❌ СПАМ (эмоджи): {message}” # Проверяем на ссылки elif URL_PATTERN.search(message): print(f“❌ СПАМ (ссылка): {message}”) # Печатаем на консоль return f“❌ СПАМ (ссылка): {message}” else: print(f“✅ Чисто: {message}”) # Печатаем на консоль return f“✅ Чисто: {message}” #————ТЕСТОВЫЕ СООБЩЕНИЯ для проверки———————————————– # 🔹 Тестовые сообщения test_messages = [ “Нужны 5 человека на работу”, # Должно быть спамом “Выиграл 200к в казино!”, # Должно быть спамом “Заработок в сети, пиши в лс!”, # Должно быть спамом “Наш сайт www.scam.biz – проверенный!”, # Должно быть спамом (ссылка) “Привет, как дела?”, # Должно быть чистым “t.me/official_group”, # Должно быть спамом (ссылка) "Перейдите на сайт: https://example.com“ # Должно быть спамом (ссылка) ”это касается всех в группе“ ] # 🔹 Проверяем тестовые сообщения print(”🔹 Проверка тестовых сообщений:\n“) for msg in test_messages: print(check_message(msg)) # Проверка каждого сообщения #————ТЕСТОВЫЕ СООБЩЕНИЯ для проверки———————————————– #————ТЕСТОВЫЙ КОД 1 для проверки————————————————— #————ТЕСТОВЫЙ КОД 1 для проверки————————————————— # 🚀 Функция проверки на спам def is_spam(message_text): text = message_text.lower() # Проверяем по ключевым словам (через регулярные выражения) if any(re.search(pattern, text) for pattern in SPAM_PATTERNS): return True # Проверяем наличие любых ссылок (HTTP, HTTPS, Telegram) if URL_PATTERN.search(text): return True # Проверяем наличие любых ссылок (HTTP, HTTPS, Telegram, боты) if URL_PATTERN.search(text) or BOT_LINK_PATTERN.search(text): return True if EMOJI_PATTERN.search(text): return True return False # 🛠 Обработчик сообщений: удаляет спам async def handle_message(update: Update, context: CallbackContext): message = update.message if not message: return # Проверяем на спам if message.text: result = check_message(message.text) # Проверяем сообщение на спам if ”❌ СПАМ“ in result: # Если нашли спам, удаляем await message.delete() # ✅ Добавлен await logger.info(f”❌ Удалено спам-сообщение от {message.from_user.username}“) # Удаляем пересланные сообщения от ботов if message.forward_from and message.forward_from.is_bot: await message.delete() # ✅ Добавлен await logger.info(f”❌ Удалено пересланное сообщение от бота ({message.from_user.username})“) # Удаляем сообщения от имени групп/каналов if message.sender_chat: await message.delete() logger.info(f”❌ Удалено сообщение от имени группы/канала ({message.sender_chat.title})“) return #————ТЕСТОВЫЙ КОД 1 —————————————————————————————- # Удаляем пересланные сообщения от пользователей, ботов, каналов, привязанных чатов if message.forward_from or message.forward_from_chat or message.is_automatic_forward: await message.delete() logger.info(f”❌ Удалено пересланные сообщения от пользователей, ботов, каналов, привязанных чатов ({message.from_user.username})") return # Удаляем пересланные сообщения из других групп или каналов if message.forward_from_chat and message.forward_from_chat.type in : await message.delete() # ✅ Добавлен await logger.info(f“❌ Удалено пересланное сообщение из чужого чата ({message.from_user.username})”) #————ТЕСТОВЫЙ КОД 1 —————————————————————————————- # 🔹 Ответ на команду /start async def start(update: Update, context: CallbackContext): await update.message.reply_text(“Привет! Я антиспам-бот. Я удаляю спам, ссылки и пересланные сообщения от ботов. 🚀”) # 🔥 Основная функция (Запуск бота) def main(): TOKEN = “!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!” # Вставьте свой токен application = Application.builder().token(TOKEN).build() application.add_handler(CommandHandler(“start”, start)) application.add_handler(MessageHandler(filters.TEXT, handle_message)) application.add_handler(MessageHandler(filters.FORWARDED, handle_message)) application.run_polling() if __name__ == ‘__main__’: main()