Files
zuevav e5a88665cd mailn
2026-04-30 15:14:09 +03:00

410 lines
13 KiB
Markdown
Raw Permalink 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.
# 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 | `![{title}]({url})` | 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)