可打包程序运行切换下一步实现突破cursor0.45
This commit is contained in:
@@ -5,9 +5,13 @@ import logging
|
||||
import subprocess
|
||||
import uuid
|
||||
import hashlib
|
||||
import sys
|
||||
import time
|
||||
from typing import Optional, Dict, Tuple
|
||||
from pathlib import Path
|
||||
from utils.config import Config
|
||||
from utils.cursor_registry import CursorRegistry
|
||||
from cursor_auth_manager import CursorAuthManager
|
||||
|
||||
def get_hardware_id() -> str:
|
||||
"""获取硬件唯一标识"""
|
||||
@@ -32,35 +36,6 @@ def get_hardware_id() -> str:
|
||||
# 如果获取失败,使用UUID作为备选方案
|
||||
return str(uuid.uuid4())
|
||||
|
||||
class CursorAuthManager:
|
||||
def __init__(self):
|
||||
self.cursor_path = Path(os.path.expanduser("~")) / "AppData" / "Local" / "Programs" / "Cursor"
|
||||
self.app_path = self.cursor_path / "resources" / "app"
|
||||
self.package_json = self.app_path / "package.json"
|
||||
|
||||
def update_auth(self, email: str, access_token: str, refresh_token: str) -> bool:
|
||||
"""更新Cursor认证信息"""
|
||||
try:
|
||||
# 读取package.json
|
||||
with open(self.package_json, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
# 更新认证信息
|
||||
data["email"] = email
|
||||
data["accessToken"] = access_token
|
||||
data["refreshToken"] = refresh_token
|
||||
|
||||
# 保存更新后的文件
|
||||
with open(self.package_json, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=2)
|
||||
|
||||
logging.info(f"认证信息更新成功: {email}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"更新认证信息失败: {str(e)}")
|
||||
return False
|
||||
|
||||
class AccountSwitcher:
|
||||
def __init__(self):
|
||||
self.cursor_path = Path(os.path.expanduser("~")) / "AppData" / "Local" / "Programs" / "Cursor"
|
||||
@@ -69,6 +44,7 @@ class AccountSwitcher:
|
||||
self.auth_manager = CursorAuthManager()
|
||||
self.config = Config()
|
||||
self.hardware_id = get_hardware_id()
|
||||
self.registry = CursorRegistry() # 添加注册表操作工具类
|
||||
|
||||
def get_device_info(self) -> dict:
|
||||
"""获取设备信息"""
|
||||
@@ -384,6 +360,142 @@ class AccountSwitcher:
|
||||
"activation_records": []
|
||||
}
|
||||
|
||||
def restart_cursor(self) -> bool:
|
||||
"""重启Cursor编辑器
|
||||
|
||||
Returns:
|
||||
bool: 是否成功重启
|
||||
"""
|
||||
try:
|
||||
logging.info("正在重启Cursor...")
|
||||
if sys.platform == "win32":
|
||||
# Windows系统
|
||||
# 关闭Cursor
|
||||
os.system("taskkill /f /im Cursor.exe 2>nul")
|
||||
time.sleep(2)
|
||||
# 获取Cursor安装路径
|
||||
cursor_exe = self.cursor_path / "Cursor.exe"
|
||||
if cursor_exe.exists():
|
||||
# 启动Cursor
|
||||
os.startfile(str(cursor_exe))
|
||||
logging.info("Cursor重启成功")
|
||||
return True
|
||||
else:
|
||||
logging.error(f"未找到Cursor程序: {cursor_exe}")
|
||||
return False
|
||||
elif sys.platform == "darwin":
|
||||
# macOS系统
|
||||
os.system("killall Cursor 2>/dev/null")
|
||||
time.sleep(2)
|
||||
os.system("open -a Cursor")
|
||||
logging.info("Cursor重启成功")
|
||||
return True
|
||||
elif sys.platform == "linux":
|
||||
# Linux系统
|
||||
os.system("pkill -f cursor")
|
||||
time.sleep(2)
|
||||
os.system("cursor &")
|
||||
logging.info("Cursor重启成功")
|
||||
return True
|
||||
else:
|
||||
logging.error(f"不支持的操作系统: {sys.platform}")
|
||||
return False
|
||||
except Exception as e:
|
||||
logging.error(f"重启Cursor时发生错误: {str(e)}")
|
||||
return False
|
||||
|
||||
def refresh_cursor_auth(self) -> Tuple[bool, str]:
|
||||
"""刷新Cursor授权
|
||||
|
||||
Returns:
|
||||
Tuple[bool, str]: (是否成功, 提示消息)
|
||||
"""
|
||||
try:
|
||||
# 获取未使用的账号
|
||||
endpoint = "https://cursorapi.nosqli.com/admin/api.account/getUnused"
|
||||
data = {
|
||||
"machine_id": self.hardware_id
|
||||
}
|
||||
headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
try:
|
||||
# 添加SSL验证选项和超时设置
|
||||
response = requests.post(
|
||||
endpoint,
|
||||
json=data,
|
||||
headers=headers,
|
||||
timeout=30, # 增加超时时间
|
||||
verify=False, # 禁用SSL验证
|
||||
)
|
||||
# 禁用SSL警告
|
||||
requests.packages.urllib3.disable_warnings()
|
||||
|
||||
response_data = response.json()
|
||||
|
||||
if response_data.get("code") == 200:
|
||||
account_data = response_data.get("data", {})
|
||||
|
||||
# 获取账号信息
|
||||
email = account_data.get("email", "")
|
||||
access_token = account_data.get("access_token", "")
|
||||
refresh_token = account_data.get("refresh_token", "")
|
||||
expire_time = account_data.get("expire_time", "")
|
||||
days_left = account_data.get("days_left", 0)
|
||||
|
||||
if not all([email, access_token, refresh_token]):
|
||||
return False, "获取账号信息不完整"
|
||||
|
||||
# 更新Cursor认证信息
|
||||
if not self.auth_manager.update_auth(email, access_token, refresh_token):
|
||||
return False, "更新Cursor认证信息失败"
|
||||
|
||||
# 重置机器码
|
||||
if not self.reset_machine_id():
|
||||
return False, "重置机器码失败"
|
||||
|
||||
# 刷新注册表
|
||||
if not self.registry.refresh_registry():
|
||||
logging.warning("注册表刷新失败,但不影响主要功能")
|
||||
|
||||
# 重启Cursor
|
||||
if not self.auth_manager.restart_cursor():
|
||||
return False, "重启Cursor失败"
|
||||
# 重启Cursor
|
||||
# if not self.restart_cursor():
|
||||
# logging.warning("Cursor重启失败,请手动重启")
|
||||
# return True, f"授权刷新成功,请手动重启Cursor编辑器\n邮箱: {email}\n到期时间: {expire_time}\n剩余天数: {days_left}天"
|
||||
|
||||
return True, f"授权刷新成功,Cursor编辑器已重启\n邮箱: {email}\n"
|
||||
|
||||
elif response_data.get("code") == 404:
|
||||
return False, "没有可用的未使用账号"
|
||||
else:
|
||||
error_msg = response_data.get("msg", "未知错误")
|
||||
logging.error(f"获取未使用账号失败: {error_msg}")
|
||||
return False, f"获取账号失败: {error_msg}"
|
||||
|
||||
except requests.exceptions.SSLError as e:
|
||||
logging.error(f"SSL验证失败: {str(e)}")
|
||||
return False, "SSL验证失败,请检查网络设置"
|
||||
except requests.exceptions.ConnectionError as e:
|
||||
logging.error(f"网络连接错误: {str(e)}")
|
||||
return False, "网络连接失败,请检查网络设置"
|
||||
except requests.exceptions.Timeout as e:
|
||||
logging.error(f"请求超时: {str(e)}")
|
||||
return False, "请求超时,请稍后重试"
|
||||
except requests.RequestException as e:
|
||||
logging.error(f"请求失败: {str(e)}")
|
||||
return False, f"网络请求失败: {str(e)}"
|
||||
except Exception as e:
|
||||
logging.error(f"未知错误: {str(e)}")
|
||||
return False, f"发生未知错误: {str(e)}"
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"刷新授权过程出错: {str(e)}")
|
||||
return False, f"刷新失败: {str(e)}"
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user