2612-есть ок OCR, нужно допиливать бота под новый flow для операторов

This commit is contained in:
2026-01-27 00:17:10 +03:00
parent 7d2ffb54b5
commit 1843cb9c20
22 changed files with 1011 additions and 577 deletions

View File

@@ -0,0 +1,68 @@
import os
import time
import logging
import requests
from typing import Optional
logger = logging.getLogger(__name__)
IAM_TOKEN_URL = "https://iam.api.cloud.yandex.net/iam/v1/tokens"
class YandexAuthManager:
def __init__(self):
self.oauth_token = os.getenv("YANDEX_OAUTH_TOKEN")
# Кэширование IAM токена
self._iam_token = None
self._token_expire_time = 0
if not self.oauth_token:
logger.warning("YANDEX_OAUTH_TOKEN not set. Yandex services will be unavailable.")
def is_configured(self) -> bool:
return bool(self.oauth_token)
def reset_token(self):
"""Сбрасывает кэшированный токен, заставляя получить новый при следующем вызове."""
self._iam_token = None
self._token_expire_time = 0
def get_iam_token(self) -> Optional[str]:
"""
Получает IAM-токен. Если есть живой кэшированный — возвращает его.
Если нет — обменивает OAuth на IAM.
"""
current_time = time.time()
# Если токен есть и он "свежий" (с запасом в 5 минут)
if self._iam_token and current_time < self._token_expire_time - 300:
return self._iam_token
if not self.oauth_token:
logger.error("OAuth token not available.")
return None
logger.info("Obtaining new IAM token from Yandex...")
try:
response = requests.post(
IAM_TOKEN_URL,
json={"yandexPassportOauthToken": self.oauth_token},
timeout=10
)
response.raise_for_status()
data = response.json()
self._iam_token = data["iamToken"]
# Токен обычно живет 12 часов, но мы будем ориентироваться на поле expiresAt если нужно,
# или просто поставим таймер. Для простоты берем 1 час жизни кэша.
self._token_expire_time = current_time + 3600
logger.info("IAM token received successfully.")
return self._iam_token
except Exception as e:
logger.error(f"Failed to get IAM token: {e}")
return None
# Глобальный инстанс
yandex_auth = YandexAuthManager()