Загрузка данных


# VK бот "Бюро находок"

Python-бот для сообщества VK, который принимает объявления о найденных вещах, отправляет их на модерацию, публикует на стене сообщества и помогает безопасно связать нашедшего с владельцем через бота.

## Что уже реализовано

- пользовательский сценарий: `/start` -> создание объявления -> превью -> отправка на модерацию
- пошаговый сбор данных: описание, место, дата/время, фото
- модерация в личных сообщениях сообщества:
  - `✅ Принять`
  - `⚠️ Изменить`
  - `❌ Отклонить`
- редактирование модератором текста, места, даты и фотографии
- публикация объявления на стене сообщества VK
- уведомления автору о публикации, изменении и отклонении
- список своих объявлений
- закрытие объявления автором
- базовый запрос на связь с автором через бота без мгновенного раскрытия контактов
- запуск в Docker
- хранение данных в SQLite

## Архитектура

- `app/__main__.py` - точка входа
- `app/bot.py` - основной цикл бота и обработчики сценариев
- `app/db.py` - инициализация SQLite
- `app/repository.py` - доступ к данным
- `app/keyboards.py` - VK-клавиатуры
- `app/config.py` - переменные окружения

## Ограничения и адаптация под VK

В вашем описании исходный сценарий был рассчитан на Telegram. Для VK пришлось адаптировать несколько вещей:

- публикация происходит на стене сообщества VK, а не в Telegram-канале
- кнопка "Связаться с нашедшим" под постом стены технически не такая гибкая, как в Telegram, поэтому используется безопасный сценарий:
  - человек пишет боту `связаться 12`
  - бот отправляет запрос автору объявления
  - только после согласия автора бот раскрывает профили друг другу
- роль администратора сейчас управляется через текстовые команды в чате с ботом:
  - `добавить модератора 123456`
  - `удалить модератора 123456`
  - `статистика`

## Настройка VK

Нужно создать сообщество и включить:

1. Сообщения сообщества
2. Callback API / Long Poll API для бота
3. Доступ к сообщениям и стене

Токен сообщества должен иметь права минимум на:

- `messages`
- `wall`
- `photos`
- `docs` при необходимости

## Переменные окружения

Скопируйте `.env.example` в `.env` и заполните:

```env
VK_GROUP_TOKEN=your_group_token
VK_GROUP_ID=123456789
VK_COMMUNITY_SCREEN_NAME=club123456789
DATABASE_PATH=/app/data/lost_and_found.sqlite3
MODERATOR_IDS=12345678,87654321
ADMIN_IDS=12345678
LOG_LEVEL=INFO
```

## Запуск в Docker

```bash
docker compose up --build -d
```

Логи:

```bash
docker compose logs -f
```

Остановка:

```bash
docker compose down
```

## Локальный запуск без Docker

```bash
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
python -m app
```

Для Windows PowerShell:

```powershell
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m app
```

## Как работает сценарий

### Пользователь

1. Нажимает `➕ Подать объявление`
2. Вводит описание
3. Отправляет место текстом или геолокацией
4. Указывает дату и время
5. Отправляет фото
6. Получает превью и нажимает `✅ Опубликовать`

### Модератор

1. Получает карточку объявления
2. Выбирает одно из действий:
   - принять
   - изменить
   - отклонить
3. При редактировании бот публикует уже исправленную версию

### Потерявший

1. Видит пост на стене
2. Пишет боту `связаться ID`
3. Ждет согласия автора объявления на обмен контактами

## Что имеет смысл улучшить следующим шагом

- полноценная валидация даты и времени
- отдельная таблица аудита действий модераторов
- автозакрытие старых объявлений
- веб-панель администратора
- повторная публикация при редактировании уже существующего поста вместо создания нового
- более строгая защита персональных данных и журнал согласий