aboutsummaryrefslogtreecommitdiff

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-сообщение для последующей отправки.

Зависимости

Лицензия

Этот проект распространяется под лицензией 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/>.