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
9119e4c5
Commit
9119e4c5
authored
Feb 12, 2025
by
Иванова Мария Кирилловна
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update bot.py
parent
4507e6eb
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
33 additions
and
48 deletions
+33
-48
bot.py
bot.py
+33
-48
No files found.
bot.py
View file @
9119e4c5
...
@@ -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__"
:
...
...
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