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
6841b99a
Commit
6841b99a
authored
Mar 10, 2025
by
Иванова Мария Кирилловна
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update bot.py
parent
ea52c884
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
68 additions
and
8 deletions
+68
-8
bot.py
bot.py
+68
-8
No files found.
bot.py
View file @
6841b99a
...
@@ -15,6 +15,7 @@ import unicodedata
...
@@ -15,6 +15,7 @@ import unicodedata
from
aiogram.filters
import
Command
from
aiogram.filters
import
Command
import
logging
import
logging
from
aiogram
import
types
from
aiogram
import
types
from
aiogram.types
import
InlineKeyboardMarkup
,
InlineKeyboardButton
# Список слов фраз - указателей спама
# Список слов фраз - указателей спама
...
@@ -96,6 +97,7 @@ load_dotenv()
...
@@ -96,6 +97,7 @@ load_dotenv()
# Получение значения токена
# Получение значения токена
bot_token
=
os
.
getenv
(
"BOT_TOKEN"
)
bot_token
=
os
.
getenv
(
"BOT_TOKEN"
)
log_chat_id
=
os
.
getenv
(
"LOG_CHAT_ID"
)
log_chat_id
=
os
.
getenv
(
"LOG_CHAT_ID"
)
main_chat_id
=
os
.
getenv
(
"MAIN_CHAT_ID"
)
# Инициализация бота и диспетчера
# Инициализация бота и диспетчера
bot
=
Bot
(
token
=
bot_token
)
bot
=
Bot
(
token
=
bot_token
)
...
@@ -107,7 +109,6 @@ dp.include_router(router)
...
@@ -107,7 +109,6 @@ dp.include_router(router)
# Для хранения информации о новых участниках
# Для хранения информации о новых участниках
active_users
=
{}
active_users
=
{}
class
TelegramLogHandler
(
logging
.
Handler
):
class
TelegramLogHandler
(
logging
.
Handler
):
def
__init__
(
self
,
bot
,
chat_id
,
*
args
,
**
kwargs
):
def
__init__
(
self
,
bot
,
chat_id
,
*
args
,
**
kwargs
):
super
()
.
__init__
(
*
args
,
**
kwargs
)
super
()
.
__init__
(
*
args
,
**
kwargs
)
...
@@ -171,6 +172,12 @@ def has_mixed_layout(text):
...
@@ -171,6 +172,12 @@ def has_mixed_layout(text):
except
Exception
as
e
:
except
Exception
as
e
:
logger
.
error
(
"Checking error:
%
s"
,
e
)
logger
.
error
(
"Checking error:
%
s"
,
e
)
return
False
return
False
# Проверка на арабские символы в имени
def
is_arabic_name
(
name
:
str
)
->
bool
:
"""Проверяет, содержит ли имя арабские символы."""
arabic_regex
=
re
.
compile
(
"[
\u0600
-
\u06FF
]"
)
# Диапазон арабских символов в Unicode
return
bool
(
arabic_regex
.
search
(
name
))
# Регулярное выражение для распознавания эмодзи
# Регулярное выражение для распознавания эмодзи
emoji_pattern
=
re
.
compile
(
"["
emoji_pattern
=
re
.
compile
(
"["
...
@@ -185,7 +192,7 @@ emoji_pattern = re.compile("["
...
@@ -185,7 +192,7 @@ emoji_pattern = re.compile("["
u"
\U0001FA70
-
\U0001FAFF
"
# Symbols and Pictographs Extended-A
u"
\U0001FA70
-
\U0001FAFF
"
# Symbols and Pictographs Extended-A
u"
\U00002702
-
\U000027B0
"
# Dingbats
u"
\U00002702
-
\U000027B0
"
# Dingbats
u"
\U0001F004
-
\U0001F0CF
"
# Playing Cards
u"
\U0001F004
-
\U0001F0CF
"
# Playing Cards
"]+"
,
flags
=
re
.
UNICODE
)
"]+"
,
flags
=
re
.
UNICODE
)
def
normalize_text_to_infinitive
(
text
):
def
normalize_text_to_infinitive
(
text
):
"""
"""
...
@@ -275,7 +282,6 @@ def is_spam(text):
...
@@ -275,7 +282,6 @@ def is_spam(text):
return
spam_count
>=
2
return
spam_count
>=
2
def
generate_math_problem
():
def
generate_math_problem
():
"""Генерация простого математического примера."""
"""Генерация простого математического примера."""
a
=
random
.
randint
(
1
,
10
)
a
=
random
.
randint
(
1
,
10
)
...
@@ -287,6 +293,21 @@ async def welcome_new_user(event: ChatMemberUpdated):
...
@@ -287,6 +293,21 @@ async def welcome_new_user(event: ChatMemberUpdated):
"""Обработчик новых участников группы."""
"""Обработчик новых участников группы."""
if
event
.
new_chat_member
.
status
==
"member"
and
event
.
old_chat_member
.
status
not
in
[
"member"
,
"administrator"
,
"creator"
]:
if
event
.
new_chat_member
.
status
==
"member"
and
event
.
old_chat_member
.
status
not
in
[
"member"
,
"administrator"
,
"creator"
]:
new_user
=
event
.
new_chat_member
.
user
new_user
=
event
.
new_chat_member
.
user
# Проверка, если имя пользователя содержит арабские символы
if
is_arabic_name
(
new_user
.
first_name
):
try
:
# Немедленно удаляем пользователя
await
bot
.
ban_chat_member
(
event
.
chat
.
id
,
new_user
.
id
)
logger
.
info
(
f
"User {new_user.first_name} ({new_user.id}) banned due to Arabic name."
)
return
# Прерываем дальнейшую обработку
except
AiogramError
as
e
:
logger
.
error
(
f
"Failed to ban user {new_user.id}. Error: {e}"
)
except
Exception
as
e
:
logger
.
error
(
f
"Error banning user {new_user.id}: {e}"
)
return
math_problem
,
correct_answer
=
generate_math_problem
()
math_problem
,
correct_answer
=
generate_math_problem
()
try
:
try
:
...
@@ -294,9 +315,9 @@ async def welcome_new_user(event: ChatMemberUpdated):
...
@@ -294,9 +315,9 @@ async def welcome_new_user(event: ChatMemberUpdated):
logger
.
info
(
f
"Sending welcome message to {new_user.first_name} ({new_user.id}) in chat {event.chat.id}"
)
logger
.
info
(
f
"Sending welcome message to {new_user.first_name} ({new_user.id}) in chat {event.chat.id}"
)
welcome_message
=
await
bot
.
send_message
(
welcome_message
=
await
bot
.
send_message
(
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
"Решите математический пример в течение
2-х минут
! В качестве ответа отправьте одно число.
\n\n
{math_problem}
\n
"
f
"Решите математический пример в течение
минуты
! В качестве ответа отправьте одно число.
\n\n
{math_problem}
\n
"
)
)
# Сохраняем данные о пользователе
# Сохраняем данные о пользователе
...
@@ -314,10 +335,33 @@ async def welcome_new_user(event: ChatMemberUpdated):
...
@@ -314,10 +335,33 @@ async def welcome_new_user(event: ChatMemberUpdated):
logger
.
error
(
f
"Failed sending a message to the group {event.chat.id}. Error: {e}"
)
logger
.
error
(
f
"Failed sending a message to the group {event.chat.id}. Error: {e}"
)
# Ожидание ответа пользователя
# Ожидание ответа пользователя
await
check_answer
(
new_user
.
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
):
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
)
...
@@ -328,12 +372,28 @@ async def check_answer(user_id):
...
@@ -328,12 +372,28 @@ 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
)
logger
.
info
(
f
"User {user_id} has been banned due to not answering in time."
)
# Создаем кнопку для разбанивания
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
:
except
AiogramError
as
e
:
logger
.
error
(
f
"User deletion error {user_id}. Error: {e}"
)
logger
.
error
(
f
"User deletion error {user_id}. Error: {e}"
)
except
Exception
as
e
:
except
Exception
as
e
:
logger
.
error
(
f
"User deletion error {user_id}. Error: {e}"
)
logger
.
error
(
f
"User deletion error {user_id}. Error: {e}"
)
async
def
cleanup_messages
(
user_data
):
async
def
cleanup_messages
(
user_data
):
"""Удаление всех сообщений пользователя и бота."""
"""Удаление всех сообщений пользователя и бота."""
try
:
try
:
...
...
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