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.

Для пользователей (готовый образ)

По умолчанию docker-compose.yml использует готовый образ из GitHub Container Registry (GHCR), что значительно ускоряет установку.

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

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

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

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

Для разработчиков (сборка из исходников)

Если вы хотите внести изменения в код и протестировать их в Docker, используйте конфиг docker-compose-dev.yml:

# Сборка образа
docker compose -f docker-compose-dev.yml build

# Запуск
docker compose -f docker-compose-dev.yml run --rm backup

Cron

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

# Каждый день в 3:00
0 3 * * * cd /path/to/article-backup && ./run-docker.sh >> /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.7.tar.gz (45.4 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.7-py3-none-any.whl (36.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: article_backup-0.3.7.tar.gz
  • Upload date:
  • Size: 45.4 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.7.tar.gz
Algorithm Hash digest
SHA256 adb6f2c47069d0adbe3d3acab73c8725a8999283cf815feab40822ffd48b880c
MD5 93ac7942fb8e9a116d64f697dc93cdfa
BLAKE2b-256 584e129db553c080cd0a8afeaf3ec400430cbae9f8c9776d2bd4172231ce2da7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: article_backup-0.3.7-py3-none-any.whl
  • Upload date:
  • Size: 36.7 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.7-py3-none-any.whl
Algorithm Hash digest
SHA256 d3b977afa9e6e4799452d8fa84cdb5c853107803735a01ef57ec2d32230c2741
MD5 3ad6a3ec87dcab690526543dba64e5e7
BLAKE2b-256 8bdc1469059978738ddd88e1d77c2ddedf2ccf04f4d35ca098f8aa7af36547df

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