410 lines
13 KiB
Markdown
410 lines
13 KiB
Markdown
# VH Posting System - Описание системы
|
||
|
||
**Версия:** 1.0
|
||
**Дата:** 2026-01-07
|
||
**Совместимость:** PHP 7.2+
|
||
**Хостинг:** reg.ru (shared hosting)
|
||
|
||
---
|
||
|
||
## Общее описание
|
||
|
||
VH Posting System — веб-приложение для работы с изображениями Flickr. Позволяет конвертировать ссылки в различные форматы для публикации на форумах, блогах и социальных сетях, а также напрямую публиковать в Telegram-каналы.
|
||
|
||
---
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
VH_posting_system/
|
||
├── index.php # Главная страница (требует авторизации)
|
||
├── login.php # Страница входа
|
||
├── setup.php # Первоначальная настройка (создание админа)
|
||
├── api.php # API эндпоинты для AJAX-запросов
|
||
├── config.php # Конфигурация (API ключи) - НЕ в git
|
||
├── config.example.php # Пример конфигурации
|
||
├── auth_config.php # Данные пользователей - НЕ в git, создаётся автоматически
|
||
├── .htaccess # Настройки Apache
|
||
├── .gitignore # Исключения для git
|
||
│
|
||
├── classes/ # PHP классы
|
||
│ ├── Auth.php # Система авторизации
|
||
│ ├── FlickrAPI.php # Клиент Flickr API
|
||
│ ├── FlickrParser.php # Парсер ссылок Flickr
|
||
│ ├── FormatGenerator.php # Генератор форматов вывода
|
||
│ └── TelegramBot.php # Клиент Telegram Bot API
|
||
│
|
||
├── css/
|
||
│ └── style.css # Стили интерфейса
|
||
│
|
||
├── js/
|
||
│ └── app.js # Фронтенд логика
|
||
│
|
||
└── templates/ # (зарезервировано для шаблонов)
|
||
```
|
||
|
||
---
|
||
|
||
## Функциональные модули
|
||
|
||
### 1. Link Converter (Конвертер ссылок)
|
||
|
||
**Назначение:** Преобразование ссылок Flickr в различные форматы.
|
||
|
||
**Поддерживаемые входные форматы:**
|
||
- Страница фото: `https://www.flickr.com/photos/username/12345678901/`
|
||
- Короткая ссылка: `https://flic.kr/p/ABC123`
|
||
- Прямая ссылка: `https://live.staticflickr.com/65535/12345678901_abcdef1234_b.jpg`
|
||
|
||
**Форматы вывода:**
|
||
|
||
| Ключ | Название | Шаблон | Применение |
|
||
|------|----------|--------|------------|
|
||
| `bbcode` | BBCode | `[img]{url}[/img]` | Форумы phpBB, vBulletin, IPB |
|
||
| `bbcode_linked` | BBCode (clickable) | `[url={original}][img]{url}[/img][/url]` | Кликабельные превью |
|
||
| `html` | HTML | `<img src="{url}" alt="{title}">` | Веб-сайты |
|
||
| `html_linked` | HTML (clickable) | `<a href="{original}"><img...></a>` | Кликабельные изображения |
|
||
| `html_figure` | HTML Figure | `<figure>...</figure>` | Семантическая разметка |
|
||
| `markdown` | Markdown | `` | GitHub, Reddit |
|
||
| `markdown_linked` | Markdown (clickable) | `[]({original})` | Кликабельные в Markdown |
|
||
| `url_only` | URL only | `{url}` | Просто ссылка |
|
||
| `url_list` | URL list (comma) | `{url}, {url}...` | Списки через запятую |
|
||
|
||
**Размеры изображений:**
|
||
|
||
| Размер | Суффикс | Размер (px) |
|
||
|--------|---------|-------------|
|
||
| Square | `_s` | 75×75 |
|
||
| LargeSquare | `_q` | 150×150 |
|
||
| Thumbnail | `_t` | 100 |
|
||
| Small | `_m` | 240 |
|
||
| Small320 | `_n` | 320 |
|
||
| Medium | (нет) | 500 |
|
||
| Medium640 | `_z` | 640 |
|
||
| Medium800 | `_c` | 800 |
|
||
| Large | `_b` | 1024 |
|
||
| Large1600 | `_h` | 1600 |
|
||
| Large2048 | `_k` | 2048 |
|
||
| Original | `_o` | Оригинал |
|
||
|
||
---
|
||
|
||
### 2. Flickr Gallery (Галерея Flickr)
|
||
|
||
**Назначение:** Просмотр и выбор фотографий из аккаунта Flickr.
|
||
|
||
**Возможности:**
|
||
- Просмотр всех фотографий пользователя
|
||
- Просмотр по альбомам (photosets)
|
||
- Поиск по названию/описанию
|
||
- Множественный выбор галочками
|
||
- Пагинация (50 фото на страницу)
|
||
- Превью в виде сетки
|
||
|
||
**Требует:** Flickr API Key + User ID
|
||
|
||
---
|
||
|
||
### 3. Telegram Post (Публикация в Telegram)
|
||
|
||
**Назначение:** Отправка фотографий и текста в Telegram-каналы.
|
||
|
||
**Возможности:**
|
||
- Отправка одной фотографии с подписью
|
||
- Отправка альбома (2-10 фото)
|
||
- Автоматическое разбиение больших альбомов (>10 фото)
|
||
- Выбор формата текста (HTML, Markdown, plain)
|
||
- Публикация в несколько каналов
|
||
|
||
**Ограничения Telegram:**
|
||
- Максимум 10 фото в одном альбоме
|
||
- Подпись только у первого фото в альбоме
|
||
- Бот должен быть администратором канала
|
||
|
||
---
|
||
|
||
### 4. Settings (Настройки)
|
||
|
||
**Возможности:**
|
||
- Проверка статуса подключения к Flickr API
|
||
- Проверка статуса Telegram бота
|
||
- Управление списком каналов
|
||
- Смена пароля пользователя
|
||
|
||
---
|
||
|
||
## Классы PHP
|
||
|
||
### Auth.php — Система авторизации
|
||
|
||
```php
|
||
class Auth {
|
||
// Создание пользователя
|
||
createUser($username, $password): bool
|
||
|
||
// Смена пароля
|
||
changePassword($username, $oldPassword, $newPassword): bool
|
||
|
||
// Вход в систему
|
||
login($username, $password, $ip): array
|
||
|
||
// Запуск сессии
|
||
startSession($username, $token): void
|
||
|
||
// Проверка авторизации
|
||
isAuthenticated($timeout = 3600): bool
|
||
|
||
// Выход
|
||
logout(): void
|
||
|
||
// Текущий пользователь
|
||
getCurrentUser(): ?string
|
||
|
||
// Есть ли пользователи
|
||
hasUsers(): bool
|
||
|
||
// IP клиента
|
||
static getClientIP(): string
|
||
}
|
||
```
|
||
|
||
**Безопасность:**
|
||
- Хеширование: Argon2ID (fallback на bcrypt)
|
||
- Защита от брутфорса: 5 попыток, блокировка 15 минут
|
||
- Таймаут сессии: 1 час
|
||
- Регенерация session ID при входе
|
||
|
||
---
|
||
|
||
### FlickrAPI.php — Клиент Flickr API
|
||
|
||
```php
|
||
class FlickrAPI {
|
||
__construct($apiKey, $apiSecret, $userId = '')
|
||
|
||
// Установить User ID
|
||
setUserId($userId): void
|
||
|
||
// Получить фотографии пользователя
|
||
getPhotos($page = 1, $perPage = 50): array
|
||
|
||
// Получить альбомы
|
||
getPhotosets($page = 1, $perPage = 50): array
|
||
|
||
// Фотографии из альбома
|
||
getPhotosetPhotos($photosetId, $page, $perPage): array
|
||
|
||
// Информация о фото
|
||
getPhotoInfo($photoId): array
|
||
|
||
// Доступные размеры фото
|
||
getPhotoSizes($photoId): array
|
||
|
||
// Поиск фотографий
|
||
searchPhotos($query, $page, $perPage): array
|
||
|
||
// Найти User ID по имени
|
||
findUserByUsername($username): string
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### FlickrParser.php — Парсер ссылок
|
||
|
||
```php
|
||
class FlickrParser {
|
||
// Парсинг одной ссылки
|
||
parse($url): ?array
|
||
|
||
// Парсинг нескольких ссылок
|
||
parseMultiple($input): array
|
||
|
||
// Построение URL изображения
|
||
buildImageUrl($photoInfo, $size = 'Large'): string
|
||
|
||
// Доступные размеры
|
||
getAvailableSizes(): array
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### FormatGenerator.php — Генератор форматов
|
||
|
||
```php
|
||
class FormatGenerator {
|
||
// Добавить кастомный формат
|
||
addFormat($key, $name, $template, $separator, $description): void
|
||
|
||
// Получить все форматы
|
||
getFormats(): array
|
||
|
||
// Сгенерировать для одного изображения
|
||
generate($formatKey, $imageData): string
|
||
|
||
// Сгенерировать для нескольких
|
||
generateMultiple($formatKey, $images): string
|
||
|
||
// Сгенерировать все форматы сразу
|
||
generateAll($images): array
|
||
}
|
||
```
|
||
|
||
**Плейсхолдеры в шаблонах:**
|
||
- `{url}` — URL изображения выбранного размера
|
||
- `{original}` — URL оригинала
|
||
- `{title}` — Название фото
|
||
- `{description}` — Описание
|
||
- `{photo_id}` — ID фото
|
||
- `{width}`, `{height}` — Размеры
|
||
|
||
---
|
||
|
||
### TelegramBot.php — Клиент Telegram
|
||
|
||
```php
|
||
class TelegramBot {
|
||
__construct($botToken)
|
||
|
||
// Отправить текст
|
||
sendMessage($chatId, $text, $parseMode, $disablePreview): array
|
||
|
||
// Отправить фото
|
||
sendPhoto($chatId, $photo, $caption, $parseMode): array
|
||
|
||
// Отправить альбом
|
||
sendMediaGroup($chatId, $photos, $caption, $parseMode): array
|
||
|
||
// Умная публикация (авто-выбор метода)
|
||
post($chatId, $photos, $text, $parseMode): array
|
||
|
||
// Публикация в несколько каналов
|
||
postToMultiple($chatIds, $photos, $text, $parseMode): array
|
||
|
||
// Информация о боте
|
||
getMe(): array
|
||
|
||
// Информация о чате
|
||
getChat($chatId): array
|
||
|
||
// Проверка доступа к каналу
|
||
validateChannel($chatId): array
|
||
|
||
// Экранирование HTML
|
||
static escapeHtml($text): string
|
||
|
||
// Экранирование Markdown
|
||
static escapeMarkdown($text): string
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## API Endpoints (api.php)
|
||
|
||
| Action | Method | Параметры | Описание |
|
||
|--------|--------|-----------|----------|
|
||
| `convert` | POST | urls, size, format | Конвертация ссылок |
|
||
| `flickr_albums` | GET | — | Список альбомов |
|
||
| `flickr_photos` | GET | page, per_page, album_id, search | Список фото |
|
||
| `flickr_photo_sizes` | GET | photo_id | Размеры фото |
|
||
| `telegram_status` | GET | — | Статус бота |
|
||
| `telegram_channels` | GET | — | Список каналов |
|
||
| `telegram_post` | POST | channel_id, text, photos, parse_mode | Публикация |
|
||
| `change_password` | POST | current_password, new_password | Смена пароля |
|
||
|
||
---
|
||
|
||
## Конфигурация (config.php)
|
||
|
||
```php
|
||
return [
|
||
'flickr' => [
|
||
'api_key' => '', // API ключ Flickr
|
||
'api_secret' => '', // API секрет
|
||
],
|
||
'flickr_user_id' => '', // ID пользователя (12345678@N00)
|
||
|
||
'telegram' => [
|
||
'bot_token' => '', // Токен бота от @BotFather
|
||
'channels' => [ // Список каналов
|
||
['id' => '@channel', 'name' => 'Название'],
|
||
],
|
||
],
|
||
|
||
'default_size' => 'Large',
|
||
|
||
'custom_formats' => [ // Кастомные форматы
|
||
// 'key' => ['name' => '', 'template' => ''],
|
||
],
|
||
];
|
||
```
|
||
|
||
---
|
||
|
||
## Безопасность
|
||
|
||
### Защита файлов (.htaccess)
|
||
- Запрет листинга директорий
|
||
- Блокировка доступа к config.php, auth_config.php
|
||
- Блокировка прямого доступа к /classes/
|
||
|
||
### Защита авторизации
|
||
- Argon2ID/bcrypt хеширование
|
||
- Rate limiting (5 попыток / 15 минут блокировки)
|
||
- Session timeout (1 час)
|
||
- CSRF токены на формах
|
||
- Регенерация session ID
|
||
|
||
### Входные данные
|
||
- htmlspecialchars() для вывода
|
||
- Валидация URL при парсинге
|
||
- JSON-encode для API ответов
|
||
|
||
---
|
||
|
||
## Требования
|
||
|
||
### Сервер
|
||
- PHP 7.2+ (рекомендуется 7.4+)
|
||
- Расширения: curl, json, bcmath (для base58)
|
||
- Apache с mod_rewrite
|
||
|
||
### API ключи
|
||
- **Flickr:** https://www.flickr.com/services/apps/create/
|
||
- **Telegram:** @BotFather → /newbot
|
||
|
||
---
|
||
|
||
## Установка
|
||
|
||
1. Загрузить файлы на хостинг
|
||
2. Скопировать `config.example.php` → `config.php`
|
||
3. Заполнить API ключи в config.php
|
||
4. Открыть сайт → setup.php → создать админа
|
||
5. Войти через login.php
|
||
|
||
---
|
||
|
||
## Планируемые функции
|
||
|
||
- [ ] Drag & drop загрузка изображений
|
||
- [ ] История конвертаций
|
||
- [ ] Избранные форматы
|
||
- [ ] Темная тема
|
||
- [ ] Экспорт/импорт настроек
|
||
- [ ] Поддержка других фотохостингов (Imgur, etc.)
|
||
|
||
---
|
||
|
||
## Changelog
|
||
|
||
### v1.0 (2026-01-07)
|
||
- Начальная реализация
|
||
- Конвертер ссылок Flickr
|
||
- Интеграция с Flickr API
|
||
- Интеграция с Telegram Bot API
|
||
- Система авторизации
|
||
- Адаптация под PHP 7.2 (reg.ru)
|