From 7710ea4bb304e963bf1f639a994f40be4041a2da Mon Sep 17 00:00:00 2001 From: yeongpin Date: Wed, 5 Feb 2025 19:21:34 +0800 Subject: [PATCH] Update support 0.45 --- control.py | 43 +++++++++++++++++-------- cursor_register.py | 8 ++--- locales/en.json | 5 ++- locales/zh_cn.json | 5 ++- locales/zh_tw.json | 5 ++- reset_machine_manual.py | 71 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 117 insertions(+), 20 deletions(-) diff --git a/control.py b/control.py index 2629596..64fda3c 100644 --- a/control.py +++ b/control.py @@ -77,7 +77,7 @@ class BrowserControl: return False def select_email_domain(self, domain_index=None): - """选择邮箱域名,如果不指定index则随机选择""" + """选择邮箱域名,如果不指定index则随机选择。避免选择fr.nf域名""" try: print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}...{Style.RESET_ALL}") # 找到下拉框 @@ -95,21 +95,38 @@ class BrowserControl: all_options.extend(other_options) if all_options: - # 如果没有指定索引,随机选择一个 - if domain_index is None: - domain_index = random.randint(0, len(all_options) - 1) + max_attempts = 5 # 最大尝试次数 + attempt = 0 - if domain_index < len(all_options): - # 获取选中选项的文本 - selected_domain = all_options[domain_index].text - print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}: {selected_domain}{Style.RESET_ALL}") + while attempt < max_attempts: + # 如果没有指定索引,随机选择一个 + if domain_index is None: + domain_index = random.randint(0, len(all_options) - 1) - # 点击选择 - all_options[domain_index].click() - time.sleep(1) - print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.select_email_domain_success')}{Style.RESET_ALL}") - return True + if domain_index < len(all_options): + # 获取选中选项的文本 + 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}") + + # 点击选择 + all_options[domain_index].click() + time.sleep(1) + print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.select_email_domain_success')}{Style.RESET_ALL}") + 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}") return False else: diff --git a/cursor_register.py b/cursor_register.py index f016fef..e7bfb9c 100644 --- a/cursor_register.py +++ b/cursor_register.py @@ -102,7 +102,7 @@ class CursorRegistration: # 创建新的浏览器实例用于注册 from browser import BrowserManager - signup_browser_manager = BrowserManager(noheader=True) + signup_browser_manager = BrowserManager(noheader=False) self.signup_tab = signup_browser_manager.init_browser() # 访问注册页面 @@ -144,10 +144,10 @@ class CursorRegistration: # 获取验证码,设置60秒超时 verification_code = None - max_attempts = 10 # 增加到10次尝试 - retry_interval = 5 # 每5秒重试一次 + max_attempts = 20 # 增加到10次尝试 + retry_interval = 10 # 每5秒重试一次 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}") diff --git a/locales/en.json b/locales/en.json index 87a4d01..614a091 100644 --- a/locales/en.json +++ b/locales/en.json @@ -45,7 +45,10 @@ "updating_pair": "Updating Key-Value Pair", "sqlite_success": "SQLite Database Updated Successfully", "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": { "title": "Cursor Registration Tool", diff --git a/locales/zh_cn.json b/locales/zh_cn.json index 65f4d66..4d3ffbc 100644 --- a/locales/zh_cn.json +++ b/locales/zh_cn.json @@ -45,7 +45,10 @@ "updating_pair": "更新键值对", "sqlite_success": "SQLite数据库更新成功", "sqlite_error": "SQLite数据库更新失败: {error}", - "press_enter": "按回车键退出" + "press_enter": "按回车键退出", + "updating_system_ids": "更新系统ID", + "system_ids_updated": "系统ID更新成功", + "system_ids_update_failed": "系统ID更新失败: {error}" }, "register": { "title": "Cursor 注册工具", diff --git a/locales/zh_tw.json b/locales/zh_tw.json index 4539b65..04ba35d 100644 --- a/locales/zh_tw.json +++ b/locales/zh_tw.json @@ -45,7 +45,10 @@ "updating_pair": "更新鍵值對", "sqlite_success": "SQLite數據庫更新成功", "sqlite_error": "SQLite數據庫更新失敗: {error}", - "press_enter": "按回車鍵退出" + "press_enter": "按回車鍵退出", + "updating_system_ids": "更新系統ID", + "system_ids_updated": "系統ID更新成功", + "system_ids_update_failed": "系統ID更新失敗: {error}" }, "register": { "title": "Cursor 註冊工具", diff --git a/reset_machine_manual.py b/reset_machine_manual.py index bb72f1f..c5f0992 100644 --- a/reset_machine_manual.py +++ b/reset_machine_manual.py @@ -5,8 +5,20 @@ import uuid import hashlib import shutil import sqlite3 +import logging 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 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}") 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): """重置机器ID并备份原文件""" try: @@ -136,14 +202,19 @@ class MachineIDResetter: print(f"{Fore.CYAN}{EMOJI['RESET']} {self.translator.get('reset.generating')}...{Style.RESET_ALL}") new_ids = self.generate_new_ids() + # 更新配置文件 config.update(new_ids) 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: json.dump(config, f, indent=4) + # 更新SQLite数据库 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"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}") for key, value in new_ids.items():