From ea6c5e5a7db6ecc3391dae07a986a89fea84002c Mon Sep 17 00:00:00 2001 From: gitadmin Date: Sun, 30 Aug 2026 12:33:10 +0300 Subject: [PATCH] =?UTF-8?q?[ZILANT]=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BF=D1=83=D1=81=D1=82=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/version-and-docs.mdc | 2 +- .env | 2 ++ .env.example | 2 ++ README.md | 2 +- VERSION | 2 +- docs/ARCHITECTURE.md | 2 ++ docs/CHANGELOG.md | 10 ++++++ vk_load.py | 52 ++++++++++++++++++++++++------ 8 files changed, 62 insertions(+), 12 deletions(-) diff --git a/.cursor/rules/version-and-docs.mdc b/.cursor/rules/version-and-docs.mdc index ec4da70..6a742f0 100644 --- a/.cursor/rules/version-and-docs.mdc +++ b/.cursor/rules/version-and-docs.mdc @@ -20,4 +20,4 @@ alwaysApply: true 5. Не поднимать версию за косметические правки без изменения поведения. -Текущая базовая версия: **1.0.4**. +Текущая базовая версия: **1.1.0**. diff --git a/.env b/.env index b84d172..3532aa6 100644 --- a/.env +++ b/.env @@ -104,6 +104,8 @@ RESPONDER_BOT_NAME = "posto_1638_bot" ORG_MESSAGE_TAG = "#оргинфаЗиланткона" # tag to detect posts to not repost from VK VK_NO_REPOST_TAG = "#окоЗиланта" +# Минимум букв в тексте VK-поста (без учёта цифр/знаков). Меньше — «пустой пост», не в публикацию +VK_POST_MIN_LETTERS = 5 # Minutes delay before publishing an event diff --git a/.env.example b/.env.example index 5e801b6..731d890 100644 --- a/.env.example +++ b/.env.example @@ -85,6 +85,8 @@ MAX_TEXT_LENGTH=4000 ORG_MESSAGE_TAG=#оргинфаЗиланткона # VK posts with no repost tag are skipped by poster VK_NO_REPOST_TAG=#окоЗиланта +# Минимум букв (isalpha) в тексте VK-поста. Меньше — в БД как «- = Пустой пост = -», не для публикации +VK_POST_MIN_LETTERS=5 # --- Публикация событий ------------------------------------------------------ # Задержка перед публикацией события (минуты). В БД время в UTC. diff --git a/README.md b/README.md index 1e0a2b7..207a290 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Zilant / VOLK — Telegram poster и подписки -**Версия:** 1.0.4 ([`VERSION`](VERSION)) +**Версия:** 1.1.0 ([`VERSION`](VERSION)) Автоматическая публикация постов и событий в Telegram-канал, веб-редактор, бот подписок с сезонными deep link. diff --git a/VERSION b/VERSION index ee90284..9084fa2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.4 +1.1.0 diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 8d705ff..6842862 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -92,6 +92,8 @@ cp .env.example .env | `MDB_*`, `MDBASE` | MariaDB | | `POSTER_BOT_TOKEN`, `RESPONDER_BOT_TOKEN` | Токены ботов | | `PZK_PREFIX`, `EVT_PREFIX`, `DESC_PREFIX` | Ссылки ZILANT | +| `VK_NO_REPOST_TAG` | Тег VK, отключающий автопубликацию | +| `VK_POST_MIN_LETTERS` | Минимум букв в тексте VK-поста (иначе «пустой пост», не публиковать) | | `VOLK_*` | API VOLK (при `WORKMODE=VOLK`) | | `RA_KEY`, `RA_MODEL` | RouterAI для shortname | diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 0b280de..e18f6ad 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -3,6 +3,16 @@ Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/). Версия проекта — в файле [`VERSION`](../VERSION) (SemVer). +## [1.1.0] - 2026-08-30 + +### Added + +- Импорт VK (`vk_load.py`): посты с числом букв меньше `VK_POST_MIN_LETTERS` (по умолчанию 5) сохраняются с названием `- = Пустой пост = -` и без отметки «к публикации». + +### Documentation + +- Параметр `VK_POST_MIN_LETTERS` в `.env.example` и `.env`. + ## [1.0.4] - 2026-08-30 ### Changed diff --git a/vk_load.py b/vk_load.py index ac04283..2a9926c 100644 --- a/vk_load.py +++ b/vk_load.py @@ -19,6 +19,14 @@ VK_API_VERSION = os.getenv('VK_API_VERSION', '5.131') IS_EVENT = os.getenv('IS_EVENT', 'false').lower() in ('true', '1', 'yes', 'on') AUTO_PUBLISH = os.getenv('AUTO_PUBLISH', 'false').lower() in ('true', '1', 'yes', 'on') VK_NO_REPOST_TAG = os.getenv('VK_NO_REPOST_TAG', '') # Тег для отключения автопубликации +# Минимум букв (isalpha), чтобы пост не считался пустым (видео без описания и т.п.) +try: + VK_POST_MIN_LETTERS = int((os.getenv('VK_POST_MIN_LETTERS') or '5').strip().strip('"').strip("'")) +except ValueError: + VK_POST_MIN_LETTERS = 5 +if VK_POST_MIN_LETTERS < 0: + VK_POST_MIN_LETTERS = 0 +EMPTY_POST_SHORTNAME = "- = Пустой пост = -" LOG_FILE = os.getenv('LOG_FILE', 'vk_loader.log') # Путь к лог-файлу LOG_PREFIX = "VK_loader" # Уникальный префикс для идентификации скрипта @@ -86,6 +94,12 @@ def get_vk_posts(): log_message(error_msg) raise Exception(error_msg) + +def count_letters(text): + """Количество букв в тексте (Unicode isalpha), без цифр и знаков.""" + return sum(1 for c in (text or "") if c.isalpha()) + + def process_post(post): """Извлекает необходимые данные из поста VK, включая обработку репостов""" post_id = post['id'] @@ -144,11 +158,15 @@ def process_post(post): # Формируем текст поста: если это репост, добавляем префикс и информацию об оригинале post_text = source_post.get('text', '') + own_text = post.get('text', '') + letter_count = count_letters(post_text) if is_repost: + letter_count += count_letters(own_text) # Если у репоста есть свой текст, добавляем его перед текстом оригинала - if post.get('text', '').strip(): - post_text = f"{post['text']}\n\n---\n\n{post_text}" + if own_text.strip(): + post_text = f"{own_text}\n\n---\n\n{post_text}" post_text = repost_prefix + post_text + repost_info + is_empty_text = letter_count < VK_POST_MIN_LETTERS return { 'vk_post_id': post_id, @@ -161,7 +179,9 @@ def process_post(post): 'poll_options': poll_options, 'poll_multiple': poll_multiple, 'poll_end_date': poll_end_date, - 'is_repost': is_repost + 'is_repost': is_repost, + 'is_empty_text': is_empty_text, + 'letter_count': letter_count, } def save_to_database(posts): @@ -175,9 +195,14 @@ def save_to_database(posts): try: # Проверка наличия тега VK_NO_REPOST_TAG в тексте поста post_text = post.get('text', '') + is_empty_text = post.get('is_empty_text', False) should_auto_publish = AUTO_PUBLISH + shortname = None - if VK_NO_REPOST_TAG and VK_NO_REPOST_TAG in post_text: + if is_empty_text: + should_auto_publish = False + shortname = EMPTY_POST_SHORTNAME + elif VK_NO_REPOST_TAG and VK_NO_REPOST_TAG in post_text: # Если тег найден, отключаем автопубликацию независимо от AUTO_PUBLISH should_auto_publish = False @@ -201,16 +226,21 @@ def save_to_database(posts): int(post['poll_multiple']), post['poll_end_date'], IS_EVENT, - int(should_auto_publish), # Значение с учетом проверки тега - None, # shortname - пока не используется, устанавливаем NULL - None # action_number - пока не используется, устанавливаем NULL + int(should_auto_publish), + shortname, + None # action_number )) if cursor.rowcount > 0: new_posts_count += 1 # Логируем добавление нового поста с указанием причины отключения автопубликации auto_publish_reason = 'Да' if not should_auto_publish: - if VK_NO_REPOST_TAG and VK_NO_REPOST_TAG in post_text: + if is_empty_text: + auto_publish_reason = ( + f'Нет (пустой текст: {post.get("letter_count", 0)} букв ' + f'< {VK_POST_MIN_LETTERS})' + ) + elif VK_NO_REPOST_TAG and VK_NO_REPOST_TAG in post_text: auto_publish_reason = 'Нет (найден тег ' + VK_NO_REPOST_TAG + ')' else: auto_publish_reason = 'Нет' @@ -246,7 +276,11 @@ def vk_load_10(): Возвращает количество добавленных постов """ # Стартовая информация - start_msg = f"Старт скрипта | База: {DB_CONFIG['database']}@{DB_CONFIG['host']} | IS_EVENT: {IS_EVENT} | AUTO_PUBLISH: {AUTO_PUBLISH}" + start_msg = ( + f"Старт скрипта | База: {DB_CONFIG['database']}@{DB_CONFIG['host']} | " + f"IS_EVENT: {IS_EVENT} | AUTO_PUBLISH: {AUTO_PUBLISH} | " + f"VK_POST_MIN_LETTERS: {VK_POST_MIN_LETTERS}" + ) print(start_msg) log_message(start_msg)