diff options
| author | 2026-03-14 00:44:19 +0300 | |
|---|---|---|
| committer | 2026-03-14 00:44:19 +0300 | |
| commit | e5d6f4c02b757c83244ba5e04fead08623a27299 (patch) | |
| tree | 5b5babb9887cafa3dbc165928dc2b0fd65265bda /README.md | |
| download | pose-e5d6f4c02b757c83244ba5e04fead08623a27299.tar.gz pose-e5d6f4c02b757c83244ba5e04fead08623a27299.tar.bz2 pose-e5d6f4c02b757c83244ba5e04fead08623a27299.tar.xz pose-e5d6f4c02b757c83244ba5e04fead08623a27299.zip | |
Diffstat (limited to '')
| -rw-r--r-- | README.md | 224 |
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/>. +``` |
