This commit is contained in:
payzinn 2025-01-11 03:09:05 +06:00
commit 812448282a
12 changed files with 224 additions and 0 deletions

4
.env Normal file
View File

@ -0,0 +1,4 @@
BOT_TOKEN=7880464408:AAEiLDCgB4r2XVNtEoZHbwKJnFmDUbGSc0Y
DATABASE_URL=postgresql+asyncpg://postgres:2780@host.docker.internal/delete_message
# DATABASE_URL=postgresql+asyncpg://postgres:2780@localhost/delete_message
ADMINS = [6155921710, 6297555082]

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
venv/
__pycache__/

17
Dockerfile Normal file
View File

@ -0,0 +1,17 @@
FROM python:3.11-slim-bullseye
ENV PYTHONUNBUFFERED=1
ENV PYTHONWARNINGS="ignore"
ENV SQLALCHEMY_WARN_20=0
ENV PYTHONDONTWRITEBYTECODE=1
WORKDIR /
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "bot.py"]

46
README.md Normal file
View File

@ -0,0 +1,46 @@
# DELETING_MESSAGES
## Описание
Бот добавляет в базу данных тех, кто может писать в чат
# Запуск через python
### 1. Создаём виртуальное окружение
```cmd
python -m venv venv
```
### 2. Активируем виртуальное окружение
```cmd
venv\Scripts\activate
```
### 3. Устанавливаем зависимости
```cmd
pip install -r requirements.txt
```
### 4. Переименовываем .env copy в .env
Вставляем свой токен бота
### 5. Запуск
```cmd
python bot.py
```
# Запуск через Docker
### 1. Создание докер приложения
перейдите в директорию с ботом и пропишите следующую команду (с точкой)
```cmd
docker build -t название .
```
### 2. Активируем докер приложение
```cmd
docker run название
```
# Добавление админа
чтобы добавить админа нужно в файле .env в список ADMINS добавить айди админа

18
bot.py Normal file
View File

@ -0,0 +1,18 @@
import asyncio
from handlers import router
from aiogram import Bot, Dispatcher
from config import BOT_TOKEN
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
async def main():
dp.include_router(router)
await dp.start_polling(bot)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print('Exit')

8
config.py Normal file
View File

@ -0,0 +1,8 @@
import os
from dotenv import load_dotenv
load_dotenv()
BOT_TOKEN = os.getenv('BOT_TOKEN')
DATABASE_URL = os.getenv('DATABASE_URL')
ADMINS = list(map(int, os.getenv("ADMINS", "").strip("[]").split(",")))

23
db.py Normal file
View File

@ -0,0 +1,23 @@
import logging
logging.basicConfig(level=logging.ERROR)
logging.getLogger('sqlalchemy.pool').setLevel(logging.ERROR)
logging.getLogger('sqlalchemy').setLevel(logging.ERROR)
logging.getLogger('sqlalchemy').propagate = False
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.asyncio import async_sessionmaker
from models import Base
from config import DATABASE_URL
import warnings
warnings.filterwarnings("ignore")
# Создание асинхронного движка для подключения к базе данных
engine = create_async_engine(DATABASE_URL, echo=False, pool_pre_ping=True)
# Создание сессий для работы с базой данных
async_session = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
# Функция для инициализации базы данных
async def init_db():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Создание всех таблиц, определенных в моделях

BIN
delete_message_backup.dump Normal file

Binary file not shown.

88
handlers.py Normal file
View File

@ -0,0 +1,88 @@
from aiogram.filters import CommandStart, Command
from aiogram.types import Message, CallbackQuery
from aiogram import F, Router
from aiogram.fsm.state import StatesGroup, State
from aiogram.fsm.context import FSMContext
from db import async_session
from models import Users
from sqlalchemy.future import select
from sqlalchemy import and_
from states import Admin
from config import ADMINS
router = Router()
@router.message(CommandStart())
async def start(message: Message, state: FSMContext):
if message.from_user.id in ADMINS:
await state.clear()
await message.reply(f"Привет, я бот который следит за сообщениями в группе, и удаляет сообщения тех пользователей кого нет в моём списке.\n/admin_id")
else:
await message.delete()
await message.answer(
"Приветствую! Вы недавно в нашем чате? Тогда вам обязательно нужно [ознакомиться с методичкой для новичков](https://telegra.ph/Segodnya-reshila-napisat-metodichku-dlya-novichkov-kto-po-kakim-libo-prichinam-ne-smotrel-video-iz-chata-01-08-3).",
parse_mode="Markdown",
disable_web_page_preview=True
)
@router.message(Command("admin_id"))
async def admin_command(message: Message, state: FSMContext):
if message.from_user.id in ADMINS:
await state.set_state(Admin.users)
await message.reply("Пожалуйста, введите ID пользователей, чьи сообщения не будут удаляться. Каждый ID должен быть на отдельной строке.")
else:
await message.delete()
await message.answer(
"Приветствую! Вы недавно в нашем чате? Тогда вам обязательно нужно [ознакомиться с методичкой для новичков](https://telegra.ph/Segodnya-reshila-napisat-metodichku-dlya-novichkov-kto-po-kakim-libo-prichinam-ne-smotrel-video-iz-chata-01-08-3).",
parse_mode="Markdown",
disable_web_page_preview=True
)
@router.message(Admin.users)
async def check_id(message: Message, state: FSMContext):
if not message.text.isalpha():
ids = message.text.split("\n")
valid_ids = []
async with async_session() as session:
for user_id in ids:
try:
user_id_int = int(user_id.strip())
valid_ids.append(user_id_int)
result = await session.execute(select(Users).where(Users.user_id == user_id_int))
existing_user = result.scalars().first()
if not existing_user:
new_user = Users(user_id=user_id_int)
session.add(new_user)
except ValueError:
await message.reply(f"⛔ Ошибка: ID `{user_id}` не является числом.")
continue
await session.commit()
await message.reply("Список ID пользователей, чьи сообщения не будут удаляться, успешно обновлен! 👍")
await state.clear()
else:
await message.reply("⛔ Ошибка: ID должны состоять только из цифр.")
await state.clear()
@router.message()
async def delete_messages(message: Message):
user_id = message.from_user.id
if user_id in ADMINS:
return
async with async_session() as session:
result = await session.execute(select(Users).where(Users.user_id == user_id))
existing_user = result.scalars().first()
if not existing_user:
await message.delete()
await message.answer(
"Приветствую! Вы недавно в нашем чате? Тогда вам обязательно нужно [ознакомиться с методичкой для новичков](https://telegra.ph/Segodnya-reshila-napisat-metodichku-dlya-novichkov-kto-po-kakim-libo-prichinam-ne-smotrel-video-iz-chata-01-08-3).",
parse_mode="Markdown",
disable_web_page_preview=True
)

11
models.py Normal file
View File

@ -0,0 +1,11 @@
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import BigInteger, Column, Integer
# Создание базового класса для моделей
Base = declarative_base()
class Users(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, index=True)
user_id = Column(BigInteger, unique=True, index = True)

BIN
requirements.txt Normal file

Binary file not shown.

7
states.py Normal file
View File

@ -0,0 +1,7 @@
from aiogram import F
from aiogram.fsm.state import StatesGroup, State
class Admin(StatesGroup):
users = State()