Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
telegram_bot_antispammer
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иванова Мария Кирилловна
telegram_bot_antispammer
Commits
a8aefbf8
Commit
a8aefbf8
authored
Mar 07, 2025
by
Иванова Мария Кирилловна
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update bot.py
parent
33cb0040
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
44 additions
and
7 deletions
+44
-7
bot.py
bot.py
+44
-7
No files found.
bot.py
View file @
a8aefbf8
...
...
@@ -16,6 +16,7 @@ from aiogram.filters import Command
import
logging
from
aiogram
import
types
# Список слов фраз - указателей спама
SPAM_KEYWORDS
=
[
...
...
@@ -83,21 +84,18 @@ SPAM_KEYWORDS = [
"🎁"
,
"🔥"
,
"💸"
,
"💰"
,
"💲"
,
"💎"
,
"🤑"
,
"🤩"
,
"⚡"
,
"⭐"
,
"💥"
,
"✅"
,
"🏆"
,
"✋"
,
"💖"
,
"💝"
,
"⚔️"
,
"🥇"
,
"💯"
,
"💳"
,
"🔞"
,
"🥳"
,
"😱"
]
# Настройка логирования
log_level
=
os
.
getenv
(
'LOG_LEVEL'
,
'DEBUG'
)
.
upper
()
# Считываем уровень логирования из .env (по умолчанию DEBUG)
logging
.
basicConfig
(
level
=
log_level
,
format
=
'
%(asctime)
s -
%(levelname)
s -
%(message)
s'
)
logger
=
logging
.
getLogger
(
__name__
)
def
preprocess_spam_keywords
(
keywords
):
"""Приводит ключевые слова к нормализованной форме."""
logger
.
debug
(
"preprocess_spam_keywords: keyword conversion"
)
return
set
(
' '
.
join
(
normalize_text_to_infinitive
(
keyword
))
for
keyword
in
keywords
)
# Загрузка переменных из файла .env
load_dotenv
()
# Получение значения токена
bot_token
=
os
.
getenv
(
"BOT_TOKEN"
)
log_chat_id
=
os
.
getenv
(
"LOG_CHAT_ID"
)
# Инициализация бота и диспетчера
bot
=
Bot
(
token
=
bot_token
)
...
...
@@ -109,6 +107,40 @@ dp.include_router(router)
# Для хранения информации о новых участниках
active_users
=
{}
class
TelegramLogHandler
(
logging
.
Handler
):
def
__init__
(
self
,
bot
,
chat_id
,
*
args
,
**
kwargs
):
super
()
.
__init__
(
*
args
,
**
kwargs
)
self
.
bot
=
bot
self
.
chat_id
=
chat_id
async
def
send_log
(
self
,
message
):
await
self
.
bot
.
send_message
(
self
.
chat_id
,
message
)
def
emit
(
self
,
record
):
log_message
=
self
.
format
(
record
)
loop
=
asyncio
.
get_event_loop
()
loop
.
create_task
(
self
.
send_log
(
log_message
))
#asyncio.create_task(self.send_log(log_message)) # создаем асинхронную задачу
# Настройка логирования
log_level
=
os
.
getenv
(
'LOG_LEVEL'
,
'DEBUG'
)
.
upper
()
# Считываем уровень логирования из .env (по умолчанию DEBUG)
logging
.
basicConfig
(
level
=
log_level
,
format
=
'
%(asctime)
s -
%(levelname)
s -
%(message)
s'
)
logger
=
logging
.
getLogger
(
__name__
)
# Формат логов
formatter
=
logging
.
Formatter
(
'
%(asctime)
s -
%(levelname)
s -
%(message)
s'
)
# Добавляем обработчик для Telegram
tg_log_handler
=
TelegramLogHandler
(
bot
,
chat_id
=
log_chat_id
)
tg_log_handler
.
setLevel
(
log_level
)
tg_log_handler
.
setFormatter
(
formatter
)
# Добавляем обработчик в логгер
logger
.
addHandler
(
tg_log_handler
)
morph
=
MorphAnalyzer
()
def
has_mixed_layout
(
text
):
"""
...
...
@@ -129,7 +161,6 @@ def has_mixed_layout(text):
logger
.
info
(
"Word with mixed layout:
%
s"
,
word
)
return
True
# Найдено слово со смешанной раскладкой
logger
.
info
(
"No word with mixed layout."
)
return
False
except
Exception
as
e
:
...
...
@@ -230,7 +261,8 @@ def is_spam(text):
spam_count
+=
1
matched_keywords
.
append
(
keyword
)
# Добавляем совпавшее слово в список
logger
.
debug
(
f
"Spam-words found in text: {', '.join(matched_keywords)}"
)
if
matched_keywords
:
logger
.
debug
(
f
"Spam-words found in text: {', '.join(matched_keywords)}"
)
spam_count
+=
emoji_count
# Учитываем только спам-эмодзи
...
...
@@ -304,6 +336,7 @@ async def cleanup_messages(user_data):
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
"Сообщение с ID {message_id} успешно удалено из чата {user_data['chat_id']}."
)
except
Exception
as
e
:
logger
.
error
(
f
"Bot message deletion error. Error: {e}"
)
...
...
@@ -312,6 +345,7 @@ async def cleanup_messages(user_data):
try
:
if
user_message
:
await
bot
.
delete_message
(
chat_id
=
user_data
[
"chat_id"
],
message_id
=
user_message
.
message_id
)
logger
.
info
(
f
"Сообщение с ID {message_id} успешно удалено из чата {user_data['chat_id']}."
)
except
Exception
as
e
:
logger
.
error
(
f
"User message deletion error. Error: {e}"
)
except
Exception
as
e
:
...
...
@@ -346,6 +380,7 @@ async def handle_message(message: Message):
if
(
message
.
photo
or
message
.
video
or
message
.
document
)
and
text
.
strip
()
and
is_spam
(
text
):
try
:
await
message
.
delete
()
logger
.
info
(
f
"Multimedia message with ID {message.message_id} successfully deleted from group {message.chat.id}."
)
return
except
Exception
as
e
:
logger
.
error
(
f
"Error deleting a multimedia message. Error: {e}"
)
...
...
@@ -356,6 +391,7 @@ async def handle_message(message: Message):
if
button
.
url
and
any
(
spam_word
in
button
.
url
.
lower
()
for
spam_word
in
SPAM_KEYWORDS
):
try
:
await
message
.
delete
()
logger
.
info
(
f
"Message with links/buttons with ID {message.message_id} successfully deleted from group {message.chat.id}."
)
return
except
Exception
as
e
:
logger
.
error
(
f
"Error when deleting a message with a button. Error: {e}"
)
...
...
@@ -364,6 +400,7 @@ async def handle_message(message: Message):
if
is_spam
(
message
.
text
):
try
:
await
message
.
delete
()
logger
.
info
(
f
"Message wiht spam {message.message_id} successfully deleted from group {message.chat.id}."
)
return
except
Exception
as
e
:
logger
.
error
(
f
"Error when trying to delete spam messages. Error: {e}"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment