domovoy_bot/main.py
Admin ba4676b0af v1.0 MVP - Инициализация проекта 🏠
 Регистрация и верификация жильцов
 Рейтинг активности (уровни)
 Детект шпионов (Score 0-100)
 Анти-мат система (3 предупреждения → бан)
 Админ-панель с рассылкой
 Учёт квартир (несколько жильцов)
 Телефоны экстренных служб и мастеров
 Еженедельный экспорт JSON
 Прокси (socks5) для обхода РКН

Бекап: backups/versions/v1.0_mvp_2026-02-26/

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-27 10:54:16 +00:00

295 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
🏠 Домовой Бот — Telegram-бот для чата многоквартирного дома
ВЕРСИЯ: v1.2 — Чёрный список ссылок
ДАТА ФИКСАЦИИ: 26 февраля 2026 г.
СТАТУС: ✅ Реализовано
РЕАЛИЗОВАНО В v1.0:
- Регистрация и верификация жильцов
- Рейтинг активности (уровни: Новичок → Сосед → Активист → Лидер)
- Детект шпионов (Score 0-100, 8 факторов)
- Анти-мат система (3 предупреждения → бан)
- Админ-панель с рассылкой
- Учёт квартир (несколько жильцов на квартиру)
- Телефоны экстренных служб и мастеров
- Еженедельный экспорт JSON
- Прокси (socks5) для обхода РКН
РЕАЛИЗОВАНО В v1.1 (26.02.2026):
- ✅ Опросы и голосования (/poll_create, /poll_end, /polls)
- ✅ Inline-кнопки для голосования
- ✅ Подсчёт голосов в реальном времени
- ✅ Результаты с визуальной шкалой
- ✅ Защита от повторного голосования
РЕАЛИЗОВАНО В v1.2 (26.02.2026):
- ✅ Чёрный список доменов (data/bad_domains.json)
- ✅ Чёрный список паттернов и ключевых слов
- ✅ Авто-удаление спам-сообщений
- ✅ Система предупреждений (3 → бан)
- ✅ Уведомление админа о спаме
- ✅ Команды управления ЧС (/add_domain, /domains, /warnings...)
РЕАЛИЗОВАНО В v1.3 (26.02.2026):
- ✅ Анти-спам лимиты (10 сообщений за 60 сек)
- ✅ Авто-удаление флуда
- ✅ Система предупреждений (2 → мут на 30 мин)
- ✅ Команды мута/размута (/mute, /unmute, /muted)
- ✅ Проверка истечения мута
РЕАЛИЗОВАНО В v1.4 (26.02.2026):
- ✅ Расписание отключений (вода, свет, отопление, газ, лифт)
- ✅ Пошаговое создание событий (/schedule_add)
- ✅ Просмотр расписания (/график)
- ✅ Авто-напоминания за 1 час до начала
- ✅ 6 типов отключений с emoji
РЕАЛИЗОВАНО В v1.5 (26.02.2026):
- ✅ Доска объявлений (6 категорий: продам, куплю, отдам, потеряно, нашлось, услуга)
- ✅ Пошаговое создание объявлений (/ad)
- ✅ Просмотр всех объявлений (/ads)
- ✅ Авто-удаление через 7 дней
- ✅ Только для верифицированных жильцов
РЕАЛИЗОВАНО В v1.6 (26.02.2026):
- ✅ Напоминания о платежах ЖКХ (8 типов: электро, вода, отопление, газ, жильё, мусор, интернет, другое)
- ✅ Пошаговое создание напоминаний (/payment_add)
- ✅ Просмотр всех платежей (/payments)
- ✅ Авто-рассылка 5 и 9 числа в 09:00
- ✅ Ссылки на оплату (Госуслуги, Сбербанк, Тинькофф)
РЕАЛИЗОВАНО В v1.7 (26.02.2026):
- ✅ Детект мультиаккаунтов (анализ активности, паттернов сообщений)
- ✅ Проверка всех пользователей (/multicheck)
- ✅ Проверка квартир (/check_apt)
- ✅ Статистика (/multistats)
- ✅ Сброс score (/clear_multiscore)
- ✅ Связывание аккаунтов (/link_accounts)
РЕАЛИЗОВАНО В v1.8 (26.02.2026):
- ✅ Облако тегов тем чата (18 тем: лифты, парковка, уборка, соседи...)
- ✅ Авто-классификация сообщений
- ✅ Статистика по темам (/topics, /top_topics)
- ✅ Еженедельный отчёт (/weekly_report)
РЕАЛИЗОВАНО В v1.9 (26.02.2026):
- ✅ Рейтинг токсичности (4 категории: оскорбления, агрессия, угрозы, дискриминация)
- ✅ Toxicity Score 0-100 для каждого пользователя
- ✅ Топ токсичных пользователей (/toxic_top)
- ✅ Статистика по пользователю (/toxic_stats)
- ✅ Жалобы на пользователей (/complaint)
- ✅ Авто-анализ сообщений и уведомления
РЕАЛИЗОВАНО В v1.10 (26.02.2026):
- ✅ История версий профиля (авто-логирование изменений username, first_name, last_name)
- ✅ Команда /history — история конкретного пользователя
- ✅ Команда /all_history — все изменения за период
- ✅ Команда /field_history — история по полю
- ✅ Команда /history_stats — статистика изменений
РЕАЛИЗОВАНО В v1.11 (27.02.2026):
- ✅ Веб-интерфейс админа на FastAPI
- ✅ Дашборд со статистикой
- ✅ Страница пользователей с поиском
- ✅ Страница экспорта данных
- ✅ API endpoints (/api/stats, /api/users, /api/export)
- ✅ HTTP Basic авторизация
РЕАЛИЗОВАНО В v1.12 (27.02.2026):
- ✅ Достижения жильцов (16 достижений в 9 категориях)
- ✅ Авто-выдача достижений за активность, рейтинг, верификацию
- ✅ Команда /achievements — свои достижения
- ✅ Команда /achievements_top — топ по достижениям
- ✅ Уведомления о новых достижениях
РЕАЛИЗОВАНО В v1.13 (27.02.2026):
- ✅ Система благодарностей (/thank @username)
- ✅ +10 к рейтингу за благодарность
- ✅ Достижение "Помощник" при первой благодарности
- ✅ Ограничение: 1 благодарность в день
- ✅ Топ и история благодарностей
РЕАЛИЗОВАНО В v1.14 (27.02.2026):
- ✅ Календарь событий дома (собрания, субботники, праздники)
- ✅ Создание событий (/event_add)
- ✅ Запись на участие (/join, /leave)
- ✅ Просмотр событий (/events, /my_events)
- ✅ Список участников (/participants)
- ✅ Авто-напоминания за 24 часа
🎉 ВСЕ ФУНКЦИИ v1.x РЕАЛИЗОВАНЫ! 🎉
ПЛАН РАЗРАБОТКИ (v2.0 — AI-Юрист):
См. файл DEVELOPMENT_PLAN.md и VERSIONS.md
БЕКАПЫ ВЕРСИЙ:
backups/versions/vX.X_YYYY-MM-DD/
АВТОРЫ: matrixhasyou + Qwen Code
"""
import logging
import asyncio
import sys
from pathlib import Path
# Добавляем путь к проекту
BASE_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(BASE_DIR))
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import Command
from aiogram.types import Message
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.fsm.storage.memory import MemoryStorage
from config import (
BOT_TOKEN, ADMIN_USER_ID, get_proxy_url,
USE_PROXY, PROXY_TYPE, PROXY_HOST, PROXY_PORT
)
from database.db import init_db
from handlers import admin_router, users_router, verification_router, chat_monitor_router, security_router, apartments_router, antimat_router, phones_router, polls_router, antispam_router, ratelimit_router, schedule_router, ads_router, payments_router, multicount_router, topics_router, toxicity_router, profile_history_router, achievements_router, thanks_router, events_router
from services.scheduler import Scheduler
from services.web_server import WebServerService
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('logs/bot.log', encoding='utf-8'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
def create_bot_with_proxy() -> Bot:
"""Создание бота с настройкой прокси"""
proxy_url = get_proxy_url()
if proxy_url:
logger.info(f'🔒 Использование прокси: {PROXY_TYPE}://{PROXY_HOST}:{PROXY_PORT}')
# Создаём сессию aiogram с прокси
aiogram_session = AiohttpSession(proxy=proxy_url)
bot = Bot(
token=BOT_TOKEN,
session=aiogram_session,
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
)
else:
logger.info('🔓 Работа без прокси')
bot = Bot(
token=BOT_TOKEN,
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
)
return bot
async def on_startup(bot: Bot):
"""Действия при запуске"""
logger.info('🚀 Бот запускается...')
# Инициализация БД
await init_db()
logger.info('✅ База данных инициализирована')
# Запуск планировщика
scheduler = Scheduler(bot)
scheduler.start()
logger.info('✅ Планировщик задач запущен')
# Запуск веб-сервера
web_server = WebServerService(port=8000)
web_server.start()
logger.info(f'🌐 Веб-интерфейс: {web_server.get_url()}')
# Уведомление админа
try:
await bot.send_message(
ADMIN_USER_ID,
'✅ <b>Домовой бот запущен!</b>\n\n'
f'Прокси: {"" if USE_PROXY else ""}\n'
f'Веб-интерфейс: {web_server.get_url()}\n'
'Логин: admin\n'
f'Пароль: {ADMIN_USER_ID}\n\n'
'Использйте /admin для управления.',
parse_mode=ParseMode.HTML
)
except Exception as e:
logger.error(f'Не удалось уведомить админа о запуске: {e}')
async def on_shutdown(bot: Bot):
"""Действия при остановке"""
logger.info('🛑 Бот останавливается...')
try:
await bot.send_message(
ADMIN_USER_ID,
'⚠️ <b>Домовой бот остановлен</b>\n\n'
'Перезапустите бота.',
parse_mode=ParseMode.HTML
)
except Exception:
pass
# Закрываем сессию
await bot.session.close()
logger.info('🔒 Сессия закрыта')
async def main():
"""Основная функция"""
# Создаём бота с прокси
bot = create_bot_with_proxy()
# Создаём диспетчер с FSM storage (для состояний)
dp = Dispatcher(storage=MemoryStorage())
# Регистрируем роутеры
dp.include_router(admin_router)
dp.include_router(users_router)
dp.include_router(verification_router)
dp.include_router(chat_monitor_router)
dp.include_router(security_router)
dp.include_router(apartments_router)
dp.include_router(antimat_router)
dp.include_router(phones_router)
dp.include_router(polls_router)
dp.include_router(antispam_router)
dp.include_router(ratelimit_router)
dp.include_router(schedule_router)
dp.include_router(ads_router)
dp.include_router(payments_router)
dp.include_router(multicount_router)
dp.include_router(topics_router)
dp.include_router(toxicity_router)
dp.include_router(profile_history_router)
dp.include_router(achievements_router)
dp.include_router(thanks_router)
dp.include_router(events_router)
# Регистрируем хуки
dp.startup.register(on_startup)
dp.shutdown.register(on_shutdown)
# Запуск
logger.info('🤖 Запуск бота...')
await dp.start_polling(bot)
if __name__ == '__main__':
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info('🛑 Остановка по Ctrl+C')
except Exception as e:
logger.error(f'Критическая ошибка: {e}', exc_info=True)