Локальный бэкап статей с Sponsr.ru и Boosty.to в Markdown с Hugo-интеграцией
Project description
Article Backup
Скрипт для локального бэкапа статей с платформ Sponsr.ru и Boosty.to.
Конвертирует статьи в Markdown с YAML-метаданными, скачивает изображения и другие медиафайлы, поддерживает инкрементальную синхронизацию.
Возможности
- Полный архив статей одного или нескольких авторов
- Инкрементальные обновления — скачивает только новые статьи
- Конвертация в Markdown с frontmatter (title, date, tags, source)
- Локальное сохранение изображений, видео, аудио, PDF
- Сохранение ссылок на встроенные видео (Rutube, YouTube, Vimeo, VK, OK.ru)
- Исправление внутренних ссылок между статьями
- Интеграция с Hugo для просмотра в браузере
- SQLite-индекс для быстрого поиска
Установка
Требуется Python 3.10+
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: "Пушкин. Проза"
- platform: boosty
author: lermontov
display_name: "Лермонтов. Стихи"
3. Получите токены авторизации
Sponsr
- Войдите на sponsr.ru
- Откройте DevTools (F12) → Network
- Перезагрузите страницу
- Найдите любой запрос → Headers → Cookie
- Скопируйте значение в
sponsr_cookie.txt
Boosty
- Войдите на boosty.to
- Откройте DevTools (F12) → Console
- Вставьте код:
const cookie = document.cookie;
const auth = JSON.parse(decodeURIComponent(document.cookie.match(/auth=([^;]+)/)[1]));
console.log("Cookie:\n" + cookie + "\n\nAuthorization:\nBearer " + auth.accessToken);
- Скопируйте Cookie в
boosty_cookie.txt - Скопируйте Authorization в
boosty_auth.txt
Использование
Синхронизация всех авторов
python backup.py
Скачать один пост по URL
python backup.py "https://sponsr.ru/author/12345/post-title/"
python backup.py "https://boosty.to/author/posts/uuid"
Указать другой конфиг
python backup.py -c /path/to/config.yaml
Docker
Для серверов с устаревшим Python можно использовать Docker.
# Сборка образа
docker compose build
# Синхронизация всех авторов
docker compose run --rm backup
# Скачать один пост
docker compose run --rm backup "https://sponsr.ru/author/123/"
# Сборка Hugo-сайта
docker compose run --rm hugo
# Полная синхронизация (backup + hugo)
docker compose run --rm backup && docker compose run --rm hugo
# Пересборка после изменений кода
docker compose build --no-cache
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" # Язык контента
Если секция hugo: не указана, используются значения по умолчанию (http://localhost:1313/).
RSS-ленты
Для каждого автора автоматически генерируется RSS-фид:
http://localhost:1313/sponsr/pushkin/index.xmlhttp://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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file article_backup-0.1.0.tar.gz.
File metadata
- Download URL: article_backup-0.1.0.tar.gz
- Upload date:
- Size: 21.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d030ad833bc5c8175e1367d7c1c901e3dd05ceefea80b9ad05e594c624c55a5
|
|
| MD5 |
da5fde6d0e4350fd616fa1af5ab39ac4
|
|
| BLAKE2b-256 |
4c4f8a609868d22f8b1b3f374c64549ef0c8a30cc3bd7d1864cecb6e424c1eae
|
File details
Details for the file article_backup-0.1.0-py3-none-any.whl.
File metadata
- Download URL: article_backup-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
116f8b5784c9f723a69718c3226b1a2458abbdcbb90611fd99329c87ed22ecde
|
|
| MD5 |
f3bdebc18847a63db681cefcf1cda171
|
|
| BLAKE2b-256 |
34650a3364c3ba49b4f61bdd7bef4cdb38a920fd5736c97a8d59aed412d2af3d
|