import logging import re from typing import Dict, Any, Optional import requests from requests.exceptions import RequestException # 常量定义 _BASE_URL = "https://chat.notdiamond.ai" _API_BASE_URL = "https://spuckhogycrxcbomznwo.supabase.co" _USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36' class AuthManager: """ AuthManager类用于管理身份验证过程,包括获取API密钥、用户信息和处理刷新令牌等操作。 """ def __init__(self, email: str, password: str): self._email: str = email self._password: str = password self._api_key: str = "" self._user_info: Dict[str, Any] = {} self._refresh_token: str = "" self._session: requests.Session = requests.session() self._logger: logging.Logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def login(self) -> None: """使用电子邮件和密码进行用户登录,并获取用户信息。""" url = f"{_API_BASE_URL}/auth/v1/token?grant_type=password" headers = self._get_headers(with_content_type=True) data = { "email": self._email, "password": self._password, "gotrue_meta_security": {} } try: response = self._make_request('POST', url, headers=headers, json=data) self._user_info = response.json() self._refresh_token = self._user_info.get('refresh_token', '') self._log_values() except RequestException as e: self._logger.error(f"\033[91m登录请求错误: {e}\033[0m") def refresh_user_token(self) -> None: """使用刷新令牌来请求一个新的访问令牌并更新实例变量。""" url = f"{_API_BASE_URL}/auth/v1/token?grant_type=refresh_token" headers = self._get_headers(with_content_type=True) data = {"refresh_token": self._refresh_token} try: response = self._make_request('POST', url, headers=headers, json=data) self._user_info = response.json() self._refresh_token = self._user_info.get('refresh_token', '') self._log_values() except RequestException as e: self._logger.error(f"刷新令牌请求错误: {e}") def get_jwt_value(self) -> str: """返回访问令牌。""" return self._user_info.get('access_token', '') def _log_values(self) -> None: """记录刷新令牌到日志中。""" self._logger.info(f"\033[92mRefresh Token: {self._refresh_token}\033[0m") def _fetch_apikey(self) -> str: """获取API密钥。""" if self._api_key: return self._api_key try: login_url = f"{_BASE_URL}/login" response = self._make_request('GET', login_url) match = re.search(r'