mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 09:55:03 +00:00
bf176cc02b
- gotosocial.py: клиент GtS (httpx): post_status (markdown), upload_media v2, verify_credentials, delete_status - config.py: gt_social_url/token/visibility/format/channels - channels.py: fediverse-каналы (VESTI_GTS_CHANNELS, префикс gt:), gt: уходит только в fediverse - main.py: _publish_gotosocial + healthz-блок gotosocial + dry_run; status_id (ULID) в ответе - .env.example: GT_SOCIAL_* и VESTI_GTS_CHANNELS - STATUS.md/WALKTHROUGH.md: fediverse-раздел, хронология - openspec: change gotosocial-publisher (proposal/design/tasks/specs), validate чисто
56 lines
2.5 KiB
Python
56 lines
2.5 KiB
Python
# Конфигурация publisher-service. Все секреты/настройки из env (.env).
|
|
# Правило: секреты НЕ в коде, только в .env (не коммитить).
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
BASE = Path(__file__).resolve().parents[3] # /opt/vesti (корень проекта)
|
|
# override=False: env-переменные, уже заданные окружением (Docker: compose environment/env_file),
|
|
# имеют приоритет над .env; на хосте (пустой env) значения подхватываются из .env.
|
|
load_dotenv(BASE / ".env")
|
|
|
|
DEFAULT_CHANNELS = "@dedinit_vesti"
|
|
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
def _channels_list(raw: str | None) -> list[str]:
|
|
"""Разбирает VESTI_BOT_CHANNELS: '@a,@b' -> ['@a','@b']. Пустые отбрасывает."""
|
|
if not raw:
|
|
return [DEFAULT_CHANNELS]
|
|
return [c.strip() for c in raw.split(",") if c.strip()]
|
|
|
|
|
|
@dataclass
|
|
class Settings:
|
|
"""Читает env ПРИ СОЗДАНИИ (после load_dotenv). Секреты — только из env/.env."""
|
|
|
|
bot_token: str = ""
|
|
tg_proxy: str = "" # пусто → читаем из env (TG_PROXY); дефолт SOCKS5 127.0.0.1:1080
|
|
channels: list[str] = None # type: ignore
|
|
port: int = 8410
|
|
api_base: str = "https://api.telegram.org"
|
|
# GoToSocial (fediverse, Mastodon-совместимый API)
|
|
gt_social_url: str = ""
|
|
gt_social_token: str = ""
|
|
gt_social_visibility: str = "public"
|
|
gt_social_format: str = "markdown"
|
|
gt_social_channels: list[str] = None # type: ignore
|
|
|
|
def __post_init__(self):
|
|
if self.channels is None:
|
|
self.channels = _channels_list(os.getenv("VESTI_BOT_CHANNELS", ""))
|
|
self.bot_token = self.bot_token or os.getenv("VESTI_BOT_TOKEN", "")
|
|
self.tg_proxy = self.tg_proxy or os.getenv("TG_PROXY", "socks5://127.0.0.1:1080")
|
|
self.port = self.port or int(os.getenv("PUBLISHER_PORT", "8410"))
|
|
self.gt_social_url = self.gt_social_url or os.getenv("GT_SOCIAL_URL", "")
|
|
self.gt_social_token = self.gt_social_token or os.getenv("GT_SOCIAL_ACCESS_TOKEN", "")
|
|
self.gt_social_visibility = self.gt_social_visibility or os.getenv("GT_SOCIAL_VISIBILITY", "public")
|
|
self.gt_social_format = self.gt_social_format or os.getenv("GT_SOCIAL_FORMAT", "markdown")
|
|
if self.gt_social_channels is None:
|
|
self.gt_social_channels = _channels_list(os.getenv("VESTI_GTS_CHANNELS", ""))
|
|
|
|
|
|
settings = Settings() |