Files
cursorregasscountken/account_manager.py
huangzhenpc d28e2f35c8
Some checks failed
Remove old artifacts / remove-old-artifacts (push) Has been cancelled
feat: 改造配置系统,使用API获取配置,支持IMAP和临时邮箱,移除本地env依赖
2025-02-11 12:48:54 +08:00

180 lines
6.1 KiB
Python

import json
import os
import time
from datetime import datetime
import requests
from typing import Dict, Optional
from config import Config
from logger import logging
class AccountManager:
def __init__(self, api_base_url: str = None):
self.config = Config()
self.api_base_url = api_base_url or "https://cursorapi.nosqli.com/admin"
self.api_token = os.getenv("API_TOKEN", "")
self.accounts_file = "accounts.json"
self._ensure_accounts_file()
def _ensure_accounts_file(self):
"""确保accounts.json文件存在"""
if not os.path.exists(self.accounts_file):
with open(self.accounts_file, "w", encoding="utf-8") as f:
json.dump({"accounts": []}, f, ensure_ascii=False, indent=2)
def save_account(self, account_info: Dict) -> bool:
"""
保存账号信息到本地JSON文件
Args:
account_info: 包含账号信息的字典
Returns:
bool: 保存是否成功
"""
try:
# 添加时间戳
account_info["created_at"] = datetime.now().isoformat()
# 读取现有数据
with open(self.accounts_file, "r", encoding="utf-8") as f:
data = json.load(f)
# 添加新账号
data["accounts"].append(account_info)
# 保存回文件
with open(self.accounts_file, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
logging.info(f"账号信息已保存到本地: {account_info['email']}")
return True
except Exception as e:
logging.error(f"保存账号信息到本地失败: {str(e)}")
return False
def sync_to_server(self, account_info: Dict) -> bool:
"""
同步账号信息到服务器
Args:
account_info: 包含账号信息的字典
Returns:
bool: 同步是否成功
"""
try:
# 构建API请求
endpoint = f"{self.api_base_url}/api.account/add"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self.api_token}"
}
# 准备请求数据
data = {
"email": account_info["email"],
"password": account_info["password"],
"first_name": account_info["first_name"],
"last_name": account_info["last_name"],
"access_token": account_info["access_token"],
"refresh_token": account_info["refresh_token"],
"machine_id": account_info.get("machine_id", ""),
"user_agent": account_info.get("user_agent", ""),
"registration_time": datetime.fromisoformat(account_info["registration_time"]).strftime("%Y-%m-%d %H:%M:%S")
}
# 发送POST请求
response = requests.post(
endpoint,
json=data,
headers=headers,
timeout=10
)
response_data = response.json()
if response_data["code"] == 0:
logging.info(f"账号信息已同步到服务器: {account_info['email']}")
return True
elif response_data["code"] == 400:
logging.warning(f"账号已存在: {account_info['email']}")
return False
else:
logging.error(f"同步到服务器失败: {response_data['msg']}")
return False
except Exception as e:
logging.error(f"同步账号信息到服务器失败: {str(e)}")
return False
def get_unused_account(self) -> Optional[Dict]:
"""
从服务器获取一个未使用的账号
Returns:
Optional[Dict]: 账号信息或None
"""
try:
endpoint = f"{self.api_base_url}/api.account/getUnused"
headers = {
"Authorization": f"Bearer {self.api_token}"
}
response = requests.get(
endpoint,
headers=headers,
timeout=10
)
response_data = response.json()
if response_data["code"] == 0:
logging.info("成功获取未使用账号")
return response_data["data"]
elif response_data["code"] == 404:
logging.warning("没有可用的未使用账号")
return None
else:
logging.error(f"获取未使用账号失败: {response_data['msg']}")
return None
except Exception as e:
logging.error(f"获取未使用账号失败: {str(e)}")
return None
def process_account(self, account_info: Dict) -> bool:
"""
处理账号信息:保存到本地并同步到服务器
Args:
account_info: 包含账号信息的字典
Returns:
bool: 处理是否成功
"""
# 保存到本地
local_save_success = self.save_account(account_info)
# 同步到服务器
server_sync_success = self.sync_to_server(account_info)
return local_save_success and server_sync_success
def get_account_info(self, email: str) -> Optional[Dict]:
"""
获取指定邮箱的账号信息
Args:
email: 邮箱地址
Returns:
Optional[Dict]: 账号信息或None
"""
try:
with open(self.accounts_file, "r", encoding="utf-8") as f:
data = json.load(f)
for account in data["accounts"]:
if account["email"] == email:
return account
return None
except Exception as e:
logging.error(f"获取账号信息失败: {str(e)}")
return None