- omni/config.py: tg_cfg() читает data/tg.json (вне git), env приоритетнее
- omni/tgsess.py: enabled()/fetch() подтягивают креды из config
- tools/tg_pick.py: перебор пула сессий, проверка is_user_authorized, личные аккаунты исключены
- omni claw pump: 2 канала -> 27 постов через сессию (проверено)
- omni/serve.py: /api/stats += keys{totals}, tg{enabled}
- web/index.html: строка статуса в шапке (ключей / сервисов / TG сессия)
- omni/cli.py radar --apply: пишет полный набор, а не только новые (повторный прогон обнулял файл)
- omni/cli.py radar --import-posts: --since-days + скип известных url до simhash
134 lines
4.6 KiB
Python
134 lines
4.6 KiB
Python
"""Конфиг: пути, лимиты, ключи из env/.env. Никаких секретов в коде."""
|
||
import json
|
||
import os
|
||
import pathlib
|
||
|
||
ROOT = pathlib.Path(__file__).resolve().parent.parent
|
||
DATA = pathlib.Path(os.environ.get("OMNI_DATA") or (ROOT / "data"))
|
||
DB = pathlib.Path(os.environ.get("OMNI_DB") or (DATA / "omni.sqlite3"))
|
||
THEMES = ROOT / "themes.txt"
|
||
|
||
DEFAULTS = {
|
||
"timeout": 25,
|
||
"retries": 2,
|
||
"per_host_delay": 0.6,
|
||
"max_bytes": 4_000_000,
|
||
"limit": 20,
|
||
"lang": "ru",
|
||
"ua": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"),
|
||
"proxy_mode": "off", # off | list | env
|
||
"proxies": [],
|
||
"cookies": {}, # host -> "a=b; c=d" (свои сессии к закрытым площадкам)
|
||
}
|
||
|
||
KEYS = {} # имя -> значение
|
||
CONFIG = {} # прочие настройки
|
||
|
||
|
||
def cookies_for(host):
|
||
"""Cookie-строка под хост: точное совпадение или суффикс (example.com -> www.example.com)."""
|
||
ck = CONFIG.get("cookies") or {}
|
||
if not ck:
|
||
return ""
|
||
host = (host or "").lower().split(":")[0]
|
||
if host in ck:
|
||
return ck[host]
|
||
for k, v in ck.items():
|
||
k = k.lower().lstrip(".")
|
||
if host == k or host.endswith("." + k):
|
||
return v
|
||
return ""
|
||
|
||
|
||
def _load_env_file(path):
|
||
p = pathlib.Path(path)
|
||
if not p.exists():
|
||
return {}
|
||
out = {}
|
||
for line in p.read_text(encoding="utf-8", errors="ignore").splitlines():
|
||
line = line.strip()
|
||
if not line or line.startswith("#") or "=" not in line:
|
||
continue
|
||
k, v = line.split("=", 1)
|
||
out[k.strip()] = v.strip().strip('"').strip("'")
|
||
return out
|
||
|
||
|
||
def load():
|
||
"""Читает .env рядом с проектом и config.json (если есть), собирает ключи."""
|
||
global KEYS, CONFIG
|
||
envf = _load_env_file(ROOT / ".env")
|
||
for k, v in envf.items():
|
||
os.environ.setdefault(k, v)
|
||
cfg = dict(DEFAULTS)
|
||
cf = ROOT / "config.json"
|
||
if cf.exists():
|
||
try:
|
||
cfg.update(json.loads(cf.read_text(encoding="utf-8")))
|
||
except Exception:
|
||
pass
|
||
# cookies, снятые браузером (tools/cf_cookies.py) — файл вне git
|
||
ck_file = DATA / "cookies.json"
|
||
if ck_file.exists():
|
||
try:
|
||
extra = json.loads(ck_file.read_text(encoding="utf-8"))
|
||
if isinstance(extra, dict):
|
||
cfg["cookies"] = {**extra, **(cfg.get("cookies") or {})}
|
||
except Exception:
|
||
pass
|
||
raw = os.environ.get("OMNI_COOKIES") or ""
|
||
if raw:
|
||
try:
|
||
extra = json.loads(raw)
|
||
if isinstance(extra, dict):
|
||
cfg["cookies"] = {**(cfg.get("cookies") or {}), **extra}
|
||
except Exception:
|
||
pass
|
||
for name in ("TAVILY_API_KEY", "EXA_API_KEY", "YOU_API_KEY", "FIRECRAWL_API_KEY",
|
||
"JINA_API_KEY", "SERPER_API_KEY", "BRAVE_API_KEY", "X_BEARER",
|
||
"REDDIT_CLIENT_ID", "REDDIT_SECRET", "TREG_TOKEN", "GITHUB_TOKEN"):
|
||
v = os.environ.get(name)
|
||
if v:
|
||
KEYS[name] = v
|
||
DATA.mkdir(parents=True, exist_ok=True)
|
||
CONFIG = cfg
|
||
return cfg
|
||
|
||
|
||
def tg_cfg():
|
||
"""Креды Telegram-сессии: data/tg.json (вне git) или env. Возвращает dict.
|
||
|
||
Ключи: session (путь к .session без расширения), api_id, api_hash, limit.
|
||
env всегда приоритетнее файла.
|
||
"""
|
||
import os
|
||
out = {"session": "", "api_id": "", "api_hash": "", "limit": "100"}
|
||
f = DATA / "tg.json"
|
||
if f.exists():
|
||
try:
|
||
d = json.loads(f.read_text(encoding="utf-8"))
|
||
for k in out:
|
||
if d.get(k):
|
||
out[k] = str(d[k])
|
||
except Exception:
|
||
pass
|
||
for env, key in (("OMNI_TG_SESSION", "session"), ("OMNI_TG_API_ID", "api_id"),
|
||
("OMNI_TG_API_HASH", "api_hash"), ("OMNI_TG_LIMIT", "limit")):
|
||
if os.environ.get(env):
|
||
out[key] = os.environ[env]
|
||
for env, key in (("OMNI_TG_SESSION", "session"), ("OMNI_TG_API_ID", "api_id"),
|
||
("OMNI_TG_API_HASH", "api_hash"), ("OMNI_TG_LIMIT", "limit")):
|
||
if out[key]:
|
||
os.environ.setdefault(env, out[key])
|
||
return out
|
||
|
||
|
||
def proxies():
|
||
mode = CONFIG.get("proxy_mode", "off")
|
||
if mode == "env":
|
||
v = os.environ.get("OMNI_PROXIES", "")
|
||
return [x.strip() for x in v.split(",") if x.strip()]
|
||
if mode == "list":
|
||
return list(CONFIG.get("proxies") or [])
|
||
return [] |