aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
author2026-03-14 00:44:19 +0300
committer2026-03-14 00:44:19 +0300
commite5d6f4c02b757c83244ba5e04fead08623a27299 (patch)
tree5b5babb9887cafa3dbc165928dc2b0fd65265bda /README.md
downloadpose-e5d6f4c02b757c83244ba5e04fead08623a27299.tar.gz
pose-e5d6f4c02b757c83244ba5e04fead08623a27299.tar.bz2
pose-e5d6f4c02b757c83244ba5e04fead08623a27299.tar.xz
pose-e5d6f4c02b757c83244ba5e04fead08623a27299.zip
начальный коммитHEADmaster
Diffstat (limited to 'README.md')
-rw-r--r--README.md224
1 files changed, 224 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a50211c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,224 @@
+# Pose
+
+**Pose** — пересыльщик сообщений из источников (сейчас RSS/Atom/JsonFeed) в
+целевые сервисы (пока только Телеграм).
+
+При этом есть контроль дедупликации засчёт простого текстового файла с уже
+обработанными сообщениями.
+
+## Установка
+
+### Требования
+
+- Go 1.25.0 или выше
+
+### Сборка из исходников
+
+```bash
+go install go.neonxp.ru/pose@latest
+```
+
+## Конфигурация
+
+### Переменные окружения
+
+Создайте файл `.env` на основе шаблона `.env.dist`:
+
+```bash
+cp .env.dist .env
+```
+
+Отредактируйте `.env` и укажите токен вашего Telegram-бота:
+
+```env
+TELEGRAM_TOKEN=ваш_токен_бота
+```
+
+> **Примечание**: Для получения токена бота обратитесь к [@BotFather](https://t.me/BotFather) в Telegram.
+
+### Конфигурационный файл
+
+Основная конфигурация находится в файле `config.conf`:
+
+```conf
+db_file "./pose.db";
+
+sources {
+ feed "название_ленты" {
+ url "https://neonxp.ru/feed/";
+ scrape_interval "10m";
+ }
+}
+
+targets {
+ telegram {
+ token TELEGRAM_TOKEN;
+ group "-1001234567890";
+ }
+}
+```
+
+#### Параметры конфигурации
+
+**Глобальные параметры:**
+
+- `db_file` — путь к файлу базы данных для дедупликации (по умолчанию: `./pose.db`)
+
+**Блок `sources`:**
+
+- `feed` — определение RSS-ленты
+ - `url` — URL RSS/Atom-ленты (обязательный параметр)
+ - `scrape_interval` — интервал проверки ленты (по умолчанию: `10m`)
+
+**Блок `targets`:**
+
+- `telegram` — определение Telegram-канала
+ - `token` — токен бота (можно указать напрямую или через переменную окружения)
+ - `group` — ID чата/канала (обязательный параметр)
+
+## Использование
+
+### Запуск
+
+```bash
+./pose -config config.conf
+```
+
+Флаг `-config` позволяет указать путь к конфигурационному файлу (по умолчанию: `config.conf`).
+
+### Управление процессом
+
+Приложение поддерживает корректное завершение работы через сигналы `SIGINT` (Ctrl+C) и `SIGTERM`.
+
+## Архитектура
+
+### Структура проекта
+
+```
+pose/
+├── cmd/
+│ └── pose/
+│ └── main.go # Точка входа приложения
+├── internal/
+│ ├── application/
+│ │ └── application.go # Основная логика приложения
+│ ├── database/
+│ │ └── db.go # Простая БД для дедупликации
+│ ├── model/
+│ │ └── item.go # Модель элемента ленты
+│ ├── source/
+│ │ └── feed.go # Источник данных (RSS)
+│ └── target/
+│ ├── telegram.go # Целевой канал (Telegram)
+│ └── html.go # Обработка HTML
+├── config.conf # Конфигурационный файл
+├── .env.dist # Шаблон переменных окружения
+├── go.mod # Go модуль
+└── README.md # Этот файл
+```
+
+### Компоненты
+
+#### Application
+
+Основной компонент, который координирует работу источников и целей:
+
+- Создаёт и управляет источниками данных
+- Создаёт и управляет целевыми каналами
+- Распределяет элементы из источников по целям
+- Управляет жизненным циклом приложения
+
+#### Source (Источники)
+
+Интерфейс для источников данных:
+
+```go
+type Source interface {
+ Retrive(ctx context.Context) <-chan model.Item
+}
+```
+
+**Feed** — реализация источника для RSS/Atom-лент:
+
+- Периодически опрашивает указанный URL
+- Парсит ленту с помощью библиотеки `gofeed`
+- Отправляет элементы в общий канал
+
+#### Target (Цели)
+
+Интерфейс для целевых каналов:
+
+```go
+type Target interface {
+ Send(ctx context.Context) chan<- model.Item
+}
+```
+
+**Telegram** — реализация цели для Telegram:
+
+- Получает элементы из канала
+- Форматирует сообщение в HTML
+- Санитайзирует HTML с помощью `bluemonday`
+- Отправляет сообщение в указанный чат/канал
+
+#### Database
+
+Простая база данных для дедупликации:
+
+- `Exists(string) bool` — проверяет, была ли уже обработана запись
+- `Append(string) error` — добавляет запись в базу
+- `Close() error` — закрывает базу данных
+
+База данных хранит ID обработанных элементов в текстовом файле (по одной записи на строку).
+
+#### Model
+
+**Item** — модель элемента ленты:
+
+```go
+type Item struct {
+ ID string // Уникальный идентификатор
+ Date time.Time // Дата публикации
+ Title string // Заголовок
+ Summary string // Краткое описание
+ Link string // Ссылка на оригинал
+ Img string // URL изображения (опционально)
+}
+```
+
+Метод `BuildMessage()` форматирует элемент в HTML-сообщение для последующей отправки.
+
+## Зависимости
+
+- [`github.com/mmcdole/gofeed`](https://github.com/mmcdole/gofeed) — парсер RSS/Atom лент
+- [`go.neonxp.ru/conf`](https://go.neonxp.ru/conf) — библиотека конфигурации
+- [`github.com/microcosm-cc/bluemonday`](https://github.com/microcosm-cc/bluemonday) — санитайзер HTML
+
+## Лицензия
+
+Этот проект распространяется под лицензией **GNU General Public License v3.0** (GPLv3).
+
+Подробности см. в файле [LICENSE](LICENSE).
+
+## Автор
+
+**Александр NeonXP Кирюхин** — [https://neonxp.ru](https://neonxp.ru) <i@neonxp.ru>
+
+## Лицензия
+
+```
+Copyright (C) 2024 Alexander NeonXP Kiryukhin <i@neonxp.ru>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+```