2026-08-10 23:11:09 +05:00
2026-06-15 22:22:35 +05:00

VK Parser New Core

Первый чистый слой проекта:

  • админка с источниками, пользователями, воркерами и raw-лентой;
  • VK parser worker;
  • VK storage uploader worker;
  • PostgreSQL job queue.

Старый проект лежит в original_project/ как справочник. Новый код живёт в src/vk_parser_app/.

Что нужно на сервере

Ubuntu 22.04/24.04:

sudo apt update
sudo apt install -y python3 python3-venv python3-pip postgresql postgresql-contrib nginx git curl

Для будущей работы с видео:

sudo apt install -y ffmpeg

БД

Пример:

sudo -u postgres psql
CREATE DATABASE vk_parser;
CREATE USER vk_parser_user WITH PASSWORD 'CHANGE_ME';
GRANT ALL PRIVILEGES ON DATABASE vk_parser TO vk_parser_user;
\c vk_parser
GRANT ALL ON SCHEMA public TO vk_parser_user;

Установка проекта

cd /opt
sudo git clone <repo-url> vk-parser
sudo chown -R $USER:$USER /opt/vk-parser
cd /opt/vk-parser

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

Заполнить .env:

APP_SECRET_KEY=long-random-string
ADMIN_BOOTSTRAP_LOGIN=admin
ADMIN_BOOTSTRAP_PASSWORD=long-admin-password

DB_HOST=localhost
DB_PORT=5432
DB_NAME=vk_parser
DB_USER=vk_parser_user
DB_PASSWORD=...

VK_ACCESS_TOKEN=...
VK_STORAGE_GROUP_ID=239548476

Важно: для wall.post, wall.edit, photos.saveWallPhoto нужен VK user token пользователя с правами в storage-группе. Community token для этого контура не подходит.

Миграции

PYTHONPATH=src .venv/bin/python scripts/apply_migrations.py

Первый админ создаётся из ADMIN_BOOTSTRAP_LOGIN / ADMIN_BOOTSTRAP_PASSWORD при старте админки.

Проверка VK storage

Без фото:

PYTHONPATH=src .venv/bin/python scripts/vk_storage_spike.py

С фото:

cp /path/to/photo.jpg sample_photo.jpg
PYTHONPATH=src .venv/bin/python scripts/vk_storage_spike.py

Скрипт должен вывести ссылку вида:

https://vk.com/wall-239548476_123

После этого надо руками проверить:

  • пост создан от имени storage-группы;
  • админ/редактор группы может открыть и отредактировать пост;
  • вложенное фото видно в браузере.

Site Parser

Сайты обрабатывает отдельный stateless-воркер из site_parser_worker. Основная коробка хранит источники, расписание, RuCaptcha-ключ и браузерное состояние, а воркер возвращает нормализованные материалы в существующий пайплайн.

Сейчас поддерживается RSS/Atom, включая Cloudflare:

{
  "format": "rss",
  "access": "auto",
  "max_items": 20
}

Если RSS отдаёт только заголовки и ссылки, можно явно дочитывать страницы записей:

{
  "format": "rss",
  "access": "cloudflare",
  "max_items": 20,
  "follow_links": true,
  "content_selector": "article.full",
  "text_selector": ".field--name-body",
  "min_text_length": 50
}

В глобальном разделе Site Parser задаются URL воркера, его токен, ключ RuCaptcha и таймаут. Внешний модуль запускается командой:

cd site_parser_worker
printf 'WORKER_TOKEN=replace-me\n' > .env
chmod 600 .env
docker-compose up -d --build
docker-compose ps

Запуск локально

Админка:

PYTHONPATH=src .venv/bin/uvicorn vk_parser_app.admin:app --host 0.0.0.0 --port 8080

Парсер:

PYTHONPATH=src .venv/bin/python -m vk_parser_app.workers.parser

Media uploader:

PYTHONPATH=src .venv/bin/python -m vk_parser_app.workers.media_uploader

systemd units

Минимальный vk-admin.service:

[Unit]
Description=VK Parser Admin
After=network.target postgresql.service

[Service]
WorkingDirectory=/opt/vk-parser
Environment=PYTHONPATH=/opt/vk-parser/src
ExecStart=/opt/vk-parser/.venv/bin/uvicorn vk_parser_app.admin:app --host 0.0.0.0 --port 8080
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

vk-parser.service:

[Unit]
Description=VK Parser Worker
After=network.target postgresql.service

[Service]
WorkingDirectory=/opt/vk-parser
Environment=PYTHONPATH=/opt/vk-parser/src
ExecStart=/opt/vk-parser/.venv/bin/python -m vk_parser_app.workers.parser
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

media-uploader.service:

[Unit]
Description=Media Uploader Worker
After=network.target postgresql.service

[Service]
WorkingDirectory=/opt/vk-parser
Environment=PYTHONPATH=/opt/vk-parser/src
ExecStart=/opt/vk-parser/.venv/bin/python -m vk_parser_app.workers.media_uploader
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Текущий pipeline

sources(vk/site)
  -> vk-parser
  -> raw_posts + raw_post_media
  -> jobs(type='media.storage.copy')
  -> media-uploader
  -> локальный Telegram Bot API
  -> raw_posts.storage_post_url

Фото и видео загружаются в Telegram media storage; исходные URL остаются в raw_post_media.

S
Description
No description provided
Readme 5 MiB
Languages
Python 71%
HTML 21.6%
CSS 4.2%
Handlebars 1.7%
JavaScript 0.9%
Other 0.6%