Pose
Pose — пересыльщик сообщений из источников (сейчас RSS/Atom/JsonFeed) в целевые сервисы (пока только Телеграм).
При этом есть контроль дедупликации засчёт простого текстового файла с уже обработанными сообщениями.
Установка
Требования
- Go 1.25.0 или выше
Сборка из исходников
go install go.neonxp.ru/pose@latest
Конфигурация
Переменные окружения
Создайте файл .env на основе шаблона .env.dist:
cp .env.dist .env
Отредактируйте .env и укажите токен вашего Telegram-бота:
TELEGRAM_TOKEN=ваш_токен_бота
Примечание: Для получения токена бота обратитесь к @BotFather в Telegram.
Конфигурационный файл
Основная конфигурация находится в файле config.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 чата/канала (обязательный параметр)
Использование
Запуск
./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 (Источники)
Интерфейс для источников данных:
type Source interface {
Retrive(ctx context.Context) <-chan model.Item
}
Feed — реализация источника для RSS/Atom-лент:
- Периодически опрашивает указанный URL
- Парсит ленту с помощью библиотеки
gofeed - Отправляет элементы в общий канал
Target (Цели)
Интерфейс для целевых каналов:
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 — модель элемента ленты:
type Item struct {
ID string // Уникальный идентификатор
Date time.Time // Дата публикации
Title string // Заголовок
Summary string // Краткое описание
Link string // Ссылка на оригинал
Img string // URL изображения (опционально)
}
Метод BuildMessage() форматирует элемент в HTML-сообщение для последующей отправки.
Зависимости
github.com/mmcdole/gofeed— парсер RSS/Atom лентgo.neonxp.ru/conf— библиотека конфигурацииgithub.com/microcosm-cc/bluemonday— санитайзер HTML
Лицензия
Этот проект распространяется под лицензией GNU General Public License v3.0 (GPLv3).
Подробности см. в файле LICENSE.
Автор
Александр NeonXP Кирюхин — 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/>.
