# 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 | `
` | Веб-сайты |
| `html_linked` | HTML (clickable) | `` | Кликабельные изображения |
| `html_figure` | HTML 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)