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-метаданными, скачивает изображения и другие медиафайлы, поддерживает инкрементальную синхронизацию.

Возможности

  • Полный архив статей одного или нескольких авторов
  • Инкрементальные обновления — скачивает только новые статьи
  • Конвертация в 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

Разработка

Тесты

Проект использует встроенный 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.2.3.tar.gz (28.2 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.2.3-py3-none-any.whl (29.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: article_backup-0.2.3.tar.gz
  • Upload date:
  • Size: 28.2 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.2.3.tar.gz
Algorithm Hash digest
SHA256 fb5817143f8f2edb1f400fef83ef862a32692955e38e6ad9997f96a60d128a0b
MD5 a06cd826138b7f1543b7102ff0dd1841
BLAKE2b-256 f835e4ceb34a2ea55521461e25cf9f855fd71de228da0823b10ff51cfe624ad9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: article_backup-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 29.2 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.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a582cedbab39f1ff77361ef3b78d3a97652d750b0cbeee7a42daed9502531873
MD5 6375cee6780ee25710a9b3dfacf7292e
BLAKE2b-256 99ca680215ae899ee0d58bab34a28f3a9f0310ad016592a8603524b8404645d3

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