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?



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()