Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
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
Иванова Мария Кирилловна
antispammer
Commits
abd4a00a
Commit
abd4a00a
authored
Dec 31, 2024
by
Иванова Мария Кирилловна
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
827f80cb
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
138 additions
and
0 deletions
+138
-0
bot.py
bot.py
+138
-0
No files found.
bot.py
0 → 100644
View file @
abd4a00a
import
asyncio
from
aiogram
import
Bot
,
Dispatcher
,
Router
from
aiogram.types
import
ChatMemberUpdated
,
Message
from
aiogram.exceptions
import
AiogramError
import
random
import
time
# Токен вашего бота
BOT_TOKEN
=
"***"
# Инициализация бота и диспетчера
bot
=
Bot
(
token
=
BOT_TOKEN
)
dp
=
Dispatcher
()
router
=
Router
()
dp
.
include_router
(
router
)
# Для хранения информации о новых участниках
active_users
=
{}
def
generate_math_problem
():
"""Генерация простого математического примера."""
a
=
random
.
randint
(
1
,
10
)
b
=
random
.
randint
(
1
,
10
)
return
f
"{a} + {b}"
,
a
+
b
@router.chat_member
()
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"
]:
new_user
=
event
.
new_chat_member
.
user
math_problem
,
correct_answer
=
generate_math_problem
()
try
:
# Отправляем приветственное сообщение
welcome_message
=
await
bot
.
send_message
(
chat_id
=
event
.
chat
.
id
,
text
=
f
"Привет, {new_user.first_name}! Добро пожаловать в нашу группу!
\n\n
"
f
"Вот твой математический пример: {math_problem}
\n
"
f
"Попробуй решить его в течение 1 минуты!"
)
# Сохраняем данные о пользователе
active_users
[
new_user
.
id
]
=
{
"message_ids"
:
[
welcome_message
.
message_id
],
# Список для хранения всех сообщений бота
"correct_answer"
:
correct_answer
,
"timestamp"
:
time
.
time
(),
"user_messages"
:
[],
# Сообщения пользователя
"user_answered"
:
False
,
"chat_id"
:
event
.
chat
.
id
,
}
print
(
f
"Приветственное сообщение отправлено пользователю {new_user.id} с примером {math_problem}"
)
except
Exception
as
e
:
print
(
f
"Не удалось отправить сообщение в группу {event.chat.id}. Ошибка: {e}"
)
# Ожидание ответа пользователя
await
check_answer
(
new_user
.
id
)
async
def
check_answer
(
user_id
):
"""Проверка ответа пользователя через 1 минуту."""
await
asyncio
.
sleep
(
60
)
user_data
=
active_users
.
get
(
user_id
)
if
user_data
and
not
user_data
[
"user_answered"
]:
try
:
# Удаляем все сообщения
await
cleanup_messages
(
user_data
)
# Удаляем пользователя из группы
await
bot
.
ban_chat_member
(
chat_id
=
user_data
[
"chat_id"
],
user_id
=
user_id
)
print
(
f
"Пользователь {user_id} не ответил вовремя. Удален из группы."
)
except
AiogramError
as
e
:
print
(
f
"Ошибка при удалении пользователя {user_id}. Ошибка: {e}"
)
except
Exception
as
e
:
print
(
f
"Ошибка при удалении пользователя {user_id}. Ошибка: {e}"
)
async
def
cleanup_messages
(
user_data
):
"""Удаление всех сообщений пользователя и бота."""
try
:
# Удаляем все сообщения бота
for
message_id
in
user_data
[
"message_ids"
]:
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
)
print
(
f
"Сообщение бота для пользователя {user_data['chat_id']} удалено."
)
except
Exception
as
e
:
print
(
f
"Ошибка при удалении сообщения бота. Ошибка: {e}"
)
# Удаляем сообщения пользователя
for
user_message
in
user_data
[
"user_messages"
]:
try
:
if
user_message
:
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
:
print
(
f
"Ошибка при удалении сообщения пользователя. Ошибка: {e}"
)
except
Exception
as
e
:
print
(
f
"Ошибка при удалении сообщений. Ошибка: {e}"
)
@router.message
()
async
def
handle_message
(
message
:
Message
):
"""Обработчик сообщений от пользователей для проверки ответа."""
user_data
=
active_users
.
get
(
message
.
from_user
.
id
)
if
user_data
and
not
user_data
[
"user_answered"
]:
# Сохраняем сообщение пользователя
user_data
[
"user_messages"
]
.
append
(
message
)
if
message
.
text
.
isdigit
():
user_answer
=
int
(
message
.
text
)
if
user_answer
==
user_data
[
"correct_answer"
]:
user_data
[
"user_answered"
]
=
True
# Ответ правильный — сохраняем сообщение и удаляем все
correct_message
=
await
message
.
reply
(
"Правильно! Молодец!"
)
user_data
[
"message_ids"
]
.
append
(
correct_message
.
message_id
)
# Добавляем в список ID сообщений
print
(
f
"Пользователь {message.from_user.id} ответил правильно."
)
# Удаляем сообщения после правильного ответа
await
cleanup_messages
(
user_data
)
else
:
# Ответ неправильный, добавляем новое сообщение бота
incorrect_message
=
await
message
.
reply
(
"Неправильный ответ. Попробуй еще раз."
)
user_data
[
"message_ids"
]
.
append
(
incorrect_message
.
message_id
)
print
(
f
"Отправлено сообщение о неправильном ответе для пользователя {message.from_user.id}"
)
else
:
# Если ответ не число
invalid_message
=
await
message
.
reply
(
"Пожалуйста, отправь числовой ответ."
)
user_data
[
"message_ids"
]
.
append
(
invalid_message
.
message_id
)
print
(
f
"Отправлено сообщение с просьбой ввести числовой ответ для пользователя {message.from_user.id}"
)
async
def
main
():
"""Запуск бота."""
await
dp
.
start_polling
(
bot
)
if
__name__
==
"__main__"
:
asyncio
.
run
(
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