mirror of
https://github.com/yeongpin/cursor-free-vip.git
synced 2025-08-02 20:47:35 +08:00
Update support 0.45
This commit is contained in:
parent
13483eed77
commit
7710ea4bb3
19
control.py
19
control.py
@ -77,7 +77,7 @@ class BrowserControl:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def select_email_domain(self, domain_index=None):
|
def select_email_domain(self, domain_index=None):
|
||||||
"""选择邮箱域名,如果不指定index则随机选择"""
|
"""选择邮箱域名,如果不指定index则随机选择。避免选择fr.nf域名"""
|
||||||
try:
|
try:
|
||||||
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}...{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}...{Style.RESET_ALL}")
|
||||||
# 找到下拉框
|
# 找到下拉框
|
||||||
@ -95,6 +95,10 @@ class BrowserControl:
|
|||||||
all_options.extend(other_options)
|
all_options.extend(other_options)
|
||||||
|
|
||||||
if all_options:
|
if all_options:
|
||||||
|
max_attempts = 5 # 最大尝试次数
|
||||||
|
attempt = 0
|
||||||
|
|
||||||
|
while attempt < max_attempts:
|
||||||
# 如果没有指定索引,随机选择一个
|
# 如果没有指定索引,随机选择一个
|
||||||
if domain_index is None:
|
if domain_index is None:
|
||||||
domain_index = random.randint(0, len(all_options) - 1)
|
domain_index = random.randint(0, len(all_options) - 1)
|
||||||
@ -102,6 +106,14 @@ class BrowserControl:
|
|||||||
if domain_index < len(all_options):
|
if domain_index < len(all_options):
|
||||||
# 获取选中选项的文本
|
# 获取选中选项的文本
|
||||||
selected_domain = all_options[domain_index].text
|
selected_domain = all_options[domain_index].text
|
||||||
|
|
||||||
|
# 检查是否为fr.nf域名
|
||||||
|
if "fr.nf" in selected_domain.lower():
|
||||||
|
print(f"{Fore.YELLOW}{EMOJI['INFO']} 检测到fr.nf域名,重新选择...{Style.RESET_ALL}")
|
||||||
|
domain_index = None # 重置索引以便重新随机选择
|
||||||
|
attempt += 1
|
||||||
|
continue
|
||||||
|
|
||||||
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}: {selected_domain}{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}: {selected_domain}{Style.RESET_ALL}")
|
||||||
|
|
||||||
# 点击选择
|
# 点击选择
|
||||||
@ -110,6 +122,11 @@ class BrowserControl:
|
|||||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.select_email_domain_success')}{Style.RESET_ALL}")
|
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.select_email_domain_success')}{Style.RESET_ALL}")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
attempt += 1
|
||||||
|
|
||||||
|
print(f"{Fore.RED}{EMOJI['ERROR']} 无法找到合适的非fr.nf域名{Style.RESET_ALL}")
|
||||||
|
return False
|
||||||
|
|
||||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.no_available_domain_options', count=len(all_options))}{Style.RESET_ALL}")
|
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.no_available_domain_options', count=len(all_options))}{Style.RESET_ALL}")
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
|
@ -102,7 +102,7 @@ class CursorRegistration:
|
|||||||
|
|
||||||
# 创建新的浏览器实例用于注册
|
# 创建新的浏览器实例用于注册
|
||||||
from browser import BrowserManager
|
from browser import BrowserManager
|
||||||
signup_browser_manager = BrowserManager(noheader=True)
|
signup_browser_manager = BrowserManager(noheader=False)
|
||||||
self.signup_tab = signup_browser_manager.init_browser()
|
self.signup_tab = signup_browser_manager.init_browser()
|
||||||
|
|
||||||
# 访问注册页面
|
# 访问注册页面
|
||||||
@ -144,10 +144,10 @@ class CursorRegistration:
|
|||||||
|
|
||||||
# 获取验证码,设置60秒超时
|
# 获取验证码,设置60秒超时
|
||||||
verification_code = None
|
verification_code = None
|
||||||
max_attempts = 10 # 增加到10次尝试
|
max_attempts = 20 # 增加到10次尝试
|
||||||
retry_interval = 5 # 每5秒重试一次
|
retry_interval = 10 # 每5秒重试一次
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
timeout = 60 # 60秒超时
|
timeout = 160 # 60秒超时
|
||||||
|
|
||||||
print(f"{Fore.CYAN}{EMOJI['WAIT']} {self.translator.get('register.start_getting_verification_code')}...{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}{EMOJI['WAIT']} {self.translator.get('register.start_getting_verification_code')}...{Style.RESET_ALL}")
|
||||||
|
|
||||||
|
@ -45,7 +45,10 @@
|
|||||||
"updating_pair": "Updating Key-Value Pair",
|
"updating_pair": "Updating Key-Value Pair",
|
||||||
"sqlite_success": "SQLite Database Updated Successfully",
|
"sqlite_success": "SQLite Database Updated Successfully",
|
||||||
"sqlite_error": "SQLite Database Update Failed: {error}",
|
"sqlite_error": "SQLite Database Update Failed: {error}",
|
||||||
"press_enter": "Press Enter to Exit"
|
"press_enter": "Press Enter to Exit",
|
||||||
|
"updating_system_ids": "Updating System IDs",
|
||||||
|
"system_ids_updated": "System IDs Updated Successfully",
|
||||||
|
"system_ids_update_failed": "System IDs Update Failed: {error}"
|
||||||
},
|
},
|
||||||
"register": {
|
"register": {
|
||||||
"title": "Cursor Registration Tool",
|
"title": "Cursor Registration Tool",
|
||||||
|
@ -45,7 +45,10 @@
|
|||||||
"updating_pair": "更新键值对",
|
"updating_pair": "更新键值对",
|
||||||
"sqlite_success": "SQLite数据库更新成功",
|
"sqlite_success": "SQLite数据库更新成功",
|
||||||
"sqlite_error": "SQLite数据库更新失败: {error}",
|
"sqlite_error": "SQLite数据库更新失败: {error}",
|
||||||
"press_enter": "按回车键退出"
|
"press_enter": "按回车键退出",
|
||||||
|
"updating_system_ids": "更新系统ID",
|
||||||
|
"system_ids_updated": "系统ID更新成功",
|
||||||
|
"system_ids_update_failed": "系统ID更新失败: {error}"
|
||||||
},
|
},
|
||||||
"register": {
|
"register": {
|
||||||
"title": "Cursor 注册工具",
|
"title": "Cursor 注册工具",
|
||||||
|
@ -45,7 +45,10 @@
|
|||||||
"updating_pair": "更新鍵值對",
|
"updating_pair": "更新鍵值對",
|
||||||
"sqlite_success": "SQLite數據庫更新成功",
|
"sqlite_success": "SQLite數據庫更新成功",
|
||||||
"sqlite_error": "SQLite數據庫更新失敗: {error}",
|
"sqlite_error": "SQLite數據庫更新失敗: {error}",
|
||||||
"press_enter": "按回車鍵退出"
|
"press_enter": "按回車鍵退出",
|
||||||
|
"updating_system_ids": "更新系統ID",
|
||||||
|
"system_ids_updated": "系統ID更新成功",
|
||||||
|
"system_ids_update_failed": "系統ID更新失敗: {error}"
|
||||||
},
|
},
|
||||||
"register": {
|
"register": {
|
||||||
"title": "Cursor 註冊工具",
|
"title": "Cursor 註冊工具",
|
||||||
|
@ -5,8 +5,20 @@ import uuid
|
|||||||
import hashlib
|
import hashlib
|
||||||
import shutil
|
import shutil
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
import logging
|
||||||
from colorama import Fore, Style, init
|
from colorama import Fore, Style, init
|
||||||
|
|
||||||
|
# 设置日志记录
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format='%(asctime)s - %(levelname)s - %(message)s',
|
||||||
|
handlers=[
|
||||||
|
logging.StreamHandler(),
|
||||||
|
logging.FileHandler('reset_machine.log', encoding='utf-8')
|
||||||
|
]
|
||||||
|
)
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# 初始化colorama
|
# 初始化colorama
|
||||||
init()
|
init()
|
||||||
|
|
||||||
@ -109,6 +121,60 @@ class MachineIDResetter:
|
|||||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.sqlite_error', error=str(e))}{Style.RESET_ALL}")
|
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.sqlite_error', error=str(e))}{Style.RESET_ALL}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def update_system_ids(self, new_ids):
|
||||||
|
"""更新系统级别的ID"""
|
||||||
|
try:
|
||||||
|
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.updating_system_ids')}...{Style.RESET_ALL}")
|
||||||
|
|
||||||
|
if sys.platform.startswith("win"):
|
||||||
|
self._update_windows_machine_guid()
|
||||||
|
elif sys.platform == "darwin":
|
||||||
|
self._update_macos_platform_uuid(new_ids)
|
||||||
|
|
||||||
|
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.system_ids_updated')}{Style.RESET_ALL}")
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.system_ids_update_failed', error=str(e))}{Style.RESET_ALL}")
|
||||||
|
logger.error(f"System IDs update failed: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _update_windows_machine_guid(self):
|
||||||
|
"""更新Windows MachineGuid"""
|
||||||
|
try:
|
||||||
|
import winreg
|
||||||
|
key = winreg.OpenKey(
|
||||||
|
winreg.HKEY_LOCAL_MACHINE,
|
||||||
|
"SOFTWARE\\Microsoft\\Cryptography",
|
||||||
|
0,
|
||||||
|
winreg.KEY_WRITE | winreg.KEY_WOW64_64KEY
|
||||||
|
)
|
||||||
|
new_guid = str(uuid.uuid4())
|
||||||
|
winreg.SetValueEx(key, "MachineGuid", 0, winreg.REG_SZ, new_guid)
|
||||||
|
winreg.CloseKey(key)
|
||||||
|
logger.info("Windows MachineGuid updated successfully")
|
||||||
|
except PermissionError:
|
||||||
|
logger.error("Permission denied: Run as administrator to update Windows MachineGuid")
|
||||||
|
raise
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to update Windows MachineGuid: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _update_macos_platform_uuid(self, new_ids):
|
||||||
|
"""更新macOS Platform UUID"""
|
||||||
|
try:
|
||||||
|
uuid_file = "/var/root/Library/Preferences/SystemConfiguration/com.apple.platform.uuid.plist"
|
||||||
|
if os.path.exists(uuid_file):
|
||||||
|
# 使用sudo来执行plutil命令
|
||||||
|
cmd = f'sudo plutil -replace "UUID" -string "{new_ids["telemetry.macMachineId"]}" "{uuid_file}"'
|
||||||
|
result = os.system(cmd)
|
||||||
|
if result == 0:
|
||||||
|
logger.info("macOS Platform UUID updated successfully")
|
||||||
|
else:
|
||||||
|
raise Exception("Failed to execute plutil command")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to update macOS Platform UUID: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
def reset_machine_ids(self):
|
def reset_machine_ids(self):
|
||||||
"""重置机器ID并备份原文件"""
|
"""重置机器ID并备份原文件"""
|
||||||
try:
|
try:
|
||||||
@ -136,14 +202,19 @@ class MachineIDResetter:
|
|||||||
print(f"{Fore.CYAN}{EMOJI['RESET']} {self.translator.get('reset.generating')}...{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}{EMOJI['RESET']} {self.translator.get('reset.generating')}...{Style.RESET_ALL}")
|
||||||
new_ids = self.generate_new_ids()
|
new_ids = self.generate_new_ids()
|
||||||
|
|
||||||
|
# 更新配置文件
|
||||||
config.update(new_ids)
|
config.update(new_ids)
|
||||||
|
|
||||||
print(f"{Fore.CYAN}{EMOJI['FILE']} {self.translator.get('reset.saving_json')}...{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}{EMOJI['FILE']} {self.translator.get('reset.saving_json')}...{Style.RESET_ALL}")
|
||||||
with open(self.db_path, "w", encoding="utf-8") as f:
|
with open(self.db_path, "w", encoding="utf-8") as f:
|
||||||
json.dump(config, f, indent=4)
|
json.dump(config, f, indent=4)
|
||||||
|
|
||||||
|
# 更新SQLite数据库
|
||||||
self.update_sqlite_db(new_ids)
|
self.update_sqlite_db(new_ids)
|
||||||
|
|
||||||
|
# 更新系统ID
|
||||||
|
self.update_system_ids(new_ids)
|
||||||
|
|
||||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.success')}{Style.RESET_ALL}")
|
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.success')}{Style.RESET_ALL}")
|
||||||
print(f"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}")
|
print(f"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}")
|
||||||
for key, value in new_ids.items():
|
for key, value in new_ids.items():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user