# 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) ## Лицензия ``` Copyright (C) 2024 Alexander NeonXP Kiryukhin 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 . ```