Skip to main content

Локальный бэкап статей с Sponsr.ru и Boosty.to в Markdown с Hugo-интеграцией

Project description

Article Backup

PyPI version Python 3.10+ License

Скрипт для локального бэкапа статей с платформ Sponsr.ru и Boosty.to.

Конвертирует статьи в Markdown с YAML-метаданными, скачивает изображения и другие медиафайлы, поддерживает инкрементальную синхронизацию.

Возможности

  • Полный архив статей одного или нескольких авторов
  • Инкрементальная синхронизация — после первой загрузки проверяет только новые посты (⚡ до 98% быстрее повторных запусков)
  • Конвертация в Markdown с frontmatter (title, date, tags, source)
  • Локальное сохранение изображений, видео, аудио, PDF
  • Гибкая фильтрация типов скачиваемых файлов (image, video, audio, document)
  • Сохранение ссылок на встроенные видео (Rutube, YouTube, Vimeo, VK, OK.ru)
  • Нормализация разметки Sponsr (вложенный em/strong, кавычки, bidi-маркеры)
  • Исправление внутренних ссылок между статьями
  • Интеграция с Hugo для просмотра в браузере (поддержка тем, улучшенная типографика)
  • SQLite-индекс для быстрого поиска

Установка

Требуется Python 3.10+

Вариант 1: Через pip (рекомендуется)

pip install article-backup

Вариант 2: Из исходников

git clone https://github.com/strannick-ru/article-backup.git
cd article-backup
python -m venv venv
source venv/bin/activate  # Linux/macOS
# venv\Scripts\activate   # Windows
pip install -r requirements.txt

Настройка

1. Создайте конфиг

cp config.yaml.example config.yaml

2. Заполните config.yaml

output_dir: ./backup

hugo:
  base_url: "https://example.com/"
  title: "Бэкап статей"
  language_code: "ru"

auth:
  sponsr_cookie_file: ./sponsr_cookie.txt
  boosty_cookie_file: ./boosty_cookie.txt
  boosty_auth_file: ./boosty_auth.txt

sources:
  - platform: sponsr
    author: pushkin
    display_name: "Пушкин. Проза"
    asset_types: ["image", "document"] # Скачивать только картинки и документы
    
  - platform: boosty
    author: lermontov
    display_name: "Лермонтов. Стихи"

3. Получите токены авторизации

Sponsr

  1. Войдите на sponsr.ru
  2. Откройте DevTools (F12) → Network
  3. Перезагрузите страницу
  4. Найдите любой запрос → Headers → Cookie
  5. Скопируйте значение в sponsr_cookie.txt

Boosty

  1. Войдите на boosty.to
  2. Откройте DevTools (F12) → Console
  3. Вставьте код:
const cookie = document.cookie;
const auth = JSON.parse(decodeURIComponent(document.cookie.match(/auth=([^;]+)/)[1]));
console.log("Cookie:\n" + cookie + "\n\nAuthorization:\nBearer " + auth.accessToken);
  1. Скопируйте Cookie в boosty_cookie.txt
  2. Скопируйте Authorization в boosty_auth.txt

Использование

Синхронизация всех авторов

# Если установлено через pip
article-backup

# Или из исходников
python backup.py

Скачать один пост по URL

article-backup "https://sponsr.ru/author/12345/post-title/"
article-backup "https://boosty.to/author/posts/uuid"

Указать другой конфиг

article-backup -c /path/to/config.yaml

Инкрементальная синхронизация

После первого полного запуска скрипт автоматически переключается в инкрементальный режим:

Первый запуск (полная загрузка):
  [sponsr] Синхронизация author...
  Полная загрузка индекса...
  Получено 2156/2156 постов...
  ✓ Архив полностью синхронизирован

Повторные запуски (только новые посты):
  [sponsr] Синхронизация author...
  Инкрементальный режим...
  Получено 20/2156 постов... (чанк уже скачан)
  Получено 40/2156 постов... (чанк уже скачан)
  ⚡ Остановлено на 40 постах (все новые загружены)
  Найдено постов: 40, новых: 0

Производительность:

  • Автор с 2000+ постами: первый запуск ~30 мин, повторные ~30 сек
  • Проверка обновлений для 10 авторов: ~5 мин вместо часов

Статус синхронизации хранится в backup/index.db (таблица sync_state). Старые базы данных автоматически обновляются при первом запуске новой версии.

Разработка

Тесты

Проект использует встроенный unittest.

python -m unittest -q

Docker

Для серверов с устаревшим Python можно использовать Docker.

Для удобства используйте скрипт run-docker.sh, который автоматически подхватывает output_dir из вашего config.yaml и монтирует правильный volume.

# Синхронизация + сборка сайта (рекомендуемый способ)
./run-docker.sh

# Скачать один пост
./run-docker.sh "https://sponsr.ru/author/123/"

# Только пересборка сайта
./run-docker.sh hugo

# Пересборка контейнеров
./run-docker.sh build

Ручной запуск (Advanced)

Если вы не хотите использовать скрипт, можно запускать через docker compose, но нужно вручную указывать путь к бэкапам, если он отличается от ./backup.

# Если output_dir в конфиге = ./backup
docker compose run --rm backup

# Если output_dir другой
HOST_BACKUP_DIR=/path/to/data docker compose run --rm backup

Cron

Для автоматической синхронизации добавьте в crontab:

# Каждый день в 3:00
0 3 * * * cd /path/to/article-backup && docker compose run --rm backup && docker compose run --rm hugo >> /var/log/article-backup.log 2>&1

Структура выходных файлов

backup/
├── index.db                          # SQLite-индекс
├── sponsr/
│   └── pushkin/
│       ├── _index.md
│       └── posts/
│           └── 2026-01-31-article-title/
│               ├── index.md          # Статья с frontmatter
│               └── assets/           # Медиафайлы
└── boosty/
    └── lermontov/
        └── posts/
            └── 2026-01-31-another-article/
                ├── index.md
                └── assets/

Интеграция с Hugo

После каждого запуска backup.py:

  • Автоматически создаётся симлинк site/content → output_dir
  • Генерируется site/hugo.toml из секции hugo: в конфиге
# Запуск локального сервера
cd site && hugo server -D

Откройте http://localhost:1313

Настройка Hugo

Параметры Hugo задаются в config.yaml:

hugo:
  base_url: "https://example.com/"  # URL сайта для production
  title: "Мой архив статей"         # Заголовок сайта
  language_code: "ru"               # Язык контента
  default_theme: "sepia"            # Тема по умолчанию: light, dark, sepia, gruvbox, everforest

Сайт поддерживает переключение тем "на лету" (кнопки в углу экрана). Выбор пользователя сохраняется в браузере.

Если секция hugo: не указана, используются значения по умолчанию (http://localhost:1313/).

RSS-ленты

Для каждого автора автоматически генерируется RSS-фид:

  • http://localhost:1313/sponsr/pushkin/index.xml
  • http://localhost:1313/boosty/lermontov/index.xml

На странице автора отображается ссылка 📡 для подписки.

Субдомены для авторов (nginx)

Каждого автора можно раздавать на отдельном субдомене. При использовании Docker CSS автоматически копируется в папки авторов.

# Docker (CSS копируется автоматически)
docker compose run --rm backup && docker compose run --rm hugo

# Или локально через build.sh
cd site && ./build.sh

Пример конфига nginx:

server {
    listen 80;
    server_name pushkin.example.site;
    root /var/www/backup/site/public/sponsr/pushkin;
    index index.html;

    # Корень показывает список постов
    location = / {
        try_files /posts/index.html =404;
    }

    location / {
        try_files $uri $uri/ =404;
    }
}

Формат статьи

---
title: "Заголовок статьи"
date: 2024-01-15T12:00:00
source: https://sponsr.ru/pushkin/12345/...
author: pushkin
platform: sponsr
post_id: 12345
tags: ["тег1", "тег2"]
---

# Заголовок статьи

Текст статьи...

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

article_backup-0.3.3.tar.gz (36.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

article_backup-0.3.3-py3-none-any.whl (33.3 kB view details)

Uploaded Python 3

File details

Details for the file article_backup-0.3.3.tar.gz.

File metadata

  • Download URL: article_backup-0.3.3.tar.gz
  • Upload date:
  • Size: 36.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for article_backup-0.3.3.tar.gz
Algorithm Hash digest
SHA256 a435bba63bbab0f723ecc30349372e60cd034f259ceb2f0bbef2c86ef93cd047
MD5 dea6f612d84bd7e447dc0b52c02f5dac
BLAKE2b-256 b5fa3eacb32d0e7a42e1249f78bb5bf0f00f192dd0d77e09d09766b99a362254

See more details on using hashes here.

File details

Details for the file article_backup-0.3.3-py3-none-any.whl.

File metadata

  • Download URL: article_backup-0.3.3-py3-none-any.whl
  • Upload date:
  • Size: 33.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for article_backup-0.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 1008acbe8296d6cddd12ef127bd102702876a55515855f599ae1af9ea1382d2c
MD5 1aaf210b01d6b2af2df69362c583b591
BLAKE2b-256 e49c8e9d5b914d9052266ce60eae5a15850e276f4a724dde0eb3ebf76a293ecd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page