From cce3025f7f4e9bd645b0f375d26f147f12ada339 Mon Sep 17 00:00:00 2001 From: yeongpin Date: Mon, 3 Mar 2025 11:58:28 +0800 Subject: [PATCH] feat: Enhance Name Generation and Improve Account Registration Process - Implement realistic name generation with predefined name lists - Modify first name letter for uniqueness - Add more descriptive console output with emojis and translations - Update localization files with new registration-related keys - Optimize random name generation in registration modules --- .env | 4 +-- CHANGELOG.md | 7 ++++ control.py | 59 ------------------------------- cursor_register.py | 73 +++++++++++++++++++++------------------ cursor_register_manual.py | 34 +++++++++++------- locales/en.json | 7 +++- locales/zh_cn.json | 7 +++- locales/zh_tw.json | 7 +++- 8 files changed, 88 insertions(+), 110 deletions(-) diff --git a/.env b/.env index 2d17674..f18a0b4 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -version=1.5.01 -VERSION=1.5.01 +version=1.5.02 +VERSION=1.5.02 diff --git a/CHANGELOG.md b/CHANGELOG.md index 77b0cb0..f877c8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## v1.5.02 +1. Add: Generate Random Name Alias | 增加生成隨機真實姓名 +2. Add: Realistic Name Input | 增加真實姓名輸入 +3. Optimize: Error Handling | 優化錯誤處理 +4. Optimize: Translation | 優化翻譯 +5. Optimize: Performance | 優化性能 + ## v1.5.01 1. Add: Check Latest Version | 增加檢查最新版本 2. Add: Update Command | 增加更新命令 diff --git a/control.py b/control.py index 8ac2ca7..0ebb892 100644 --- a/control.py +++ b/control.py @@ -45,65 +45,6 @@ class BrowserControl: print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.create_new_tab_failed', error=str(e))}{Style.RESET_ALL}") return None - def switch_to_tab(self, browser): - """切换到指定浏览器窗口""" - try: - self.browser = browser - print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.switch_tab_success')}{Style.RESET_ALL}") - return True - except Exception as e: - print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.switch_tab_failed', error=str(e))}{Style.RESET_ALL}") - return False - - def get_current_tab(self): - """获取当前标签页""" - return self.browser - - def wait_for_page_load(self, seconds=2): - """等待页面加载""" - time.sleep(seconds) - - def navigate_to(self, url): - """导航到指定URL""" - try: - print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('control.navigate_to', url=url)}...{Style.RESET_ALL}") - self.browser.get(url) - self.wait_for_page_load() - return True - except Exception as e: - print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.browser_error', error=str(e))}{Style.RESET_ALL}") - return False - - def get_verification_code(self): - """从邮件中获取验证码""" - try: - # 尝试所有可能的样式组合 - selectors = [ - # 新样式 - 'xpath://div[contains(@style, "font-family:-apple-system") and contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px") and contains(@style, "color:#202020")]', - # 带行高的样式 - 'xpath://div[contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px") and contains(@style, "line-height:30px")]', - # rgba 颜色样式 - 'xpath://div[contains(@style, "font-size: 28px") and contains(@style, "letter-spacing: 2px") and contains(@style, "color: rgba(32, 32, 32, 1)")]', - # 宽松样式 - 'xpath://div[contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px")]' - ] - - # 依次尝试每个选择器 - for selector in selectors: - code_div = self.browser.ele(selector) - if code_div: - verification_code = code_div.text.strip() - if verification_code.isdigit() and len(verification_code) == 6: - print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.found_verification_code')}: {verification_code}{Style.RESET_ALL}") - return verification_code - - print(f"{Fore.YELLOW}{EMOJI['ERROR']} {self.translator.get('control.no_valid_verification_code')}{Style.RESET_ALL}") - return None - - except Exception as e: - print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.get_verification_code_error', error=str(e))}{Style.RESET_ALL}") - return None def fill_verification_code(self, code): """填写验证码""" diff --git a/cursor_register.py b/cursor_register.py index 4847182..0bf8d82 100644 --- a/cursor_register.py +++ b/cursor_register.py @@ -10,10 +10,10 @@ from reset_machine_manual import MachineIDResetter os.environ["PYTHONVERBOSE"] = "0" os.environ["PYINSTALLER_VERBOSE"] = "0" -# 初始化colorama +# Initialize colorama init() -# 定义emoji常量 +# Define emoji constants EMOJI = { 'START': '🚀', 'FORM': '📝', @@ -33,7 +33,7 @@ EMOJI = { class CursorRegistration: def __init__(self, translator=None): self.translator = translator - # 设置为显示模式 + # Set to display mode os.environ['BROWSER_HEADLESS'] = 'False' self.browser_manager = BrowserManager() self.browser = None @@ -47,42 +47,49 @@ class CursorRegistration: # 账号信息 self.password = self._generate_password() - self.first_name = self._generate_name() - self.last_name = self._generate_name() - print(f"Password: {self.password}\n") - print(f"First Name: {self.first_name}\n") - print(f"Last Name: {self.last_name}\n") + # Generate first name and last name separately + first_name = random.choice([ + "James", "John", "Robert", "Michael", "William", "David", "Joseph", "Thomas", + "Emma", "Olivia", "Ava", "Isabella", "Sophia", "Mia", "Charlotte", "Amelia", + "Liam", "Noah", "Oliver", "Elijah", "Lucas", "Mason", "Logan", "Alexander" + ]) + self.last_name = random.choice([ + "Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", + "Anderson", "Wilson", "Taylor", "Thomas", "Moore", "Martin", "Jackson", "Lee", + "Thompson", "White", "Harris", "Clark", "Lewis", "Walker", "Hall", "Young" + ]) + + # Modify first letter of first name + new_first_letter = random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + self.first_name = new_first_letter + first_name[1:] + + print(f"\n{Fore.CYAN}{EMOJI['PASSWORD']} {self.translator.get('register.password')}: {self.password} {Style.RESET_ALL}") + print(f"{Fore.CYAN}{EMOJI['FORM']} {self.translator.get('register.first_name')}: {self.first_name} {Style.RESET_ALL}") + print(f"{Fore.CYAN}{EMOJI['FORM']} {self.translator.get('register.last_name')}: {self.last_name} {Style.RESET_ALL}") def _generate_password(self, length=12): """Generate Random Password""" chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*" return ''.join(random.choices(chars, k=length)) - def _generate_name(self, length=6): - """Generate Random Name""" - first_letter = random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ") - rest_letters = ''.join(random.choices("abcdefghijklmnopqrstuvwxyz", k=length-1)) - return first_letter + rest_letters - def setup_email(self): - """设置邮箱""" + """Setup Email""" try: print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.browser_start')}...{Style.RESET_ALL}") - # 使用 new_tempemail 创建临时邮箱,传入 translator + # Create a temporary email using new_tempemail, passing translator from new_tempemail import NewTempEmail - self.temp_email = NewTempEmail(self.translator) # 传入 translator + self.temp_email = NewTempEmail(self.translator) # Pass translator - # 创建临时邮箱 + # Create a temporary email email_address = self.temp_email.create_email() if not email_address: print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.email_create_failed')}{Style.RESET_ALL}") return False - # 保存邮箱地址 + # Save email address self.email_address = email_address - print(f"Email Address: {self.email_address}\n") - self.email_tab = self.temp_email # 传递 NewTempEmail 实例 + self.email_tab = self.temp_email # Pass NewTempEmail instance return True @@ -96,10 +103,10 @@ class CursorRegistration: try: print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.register_start')}...{Style.RESET_ALL}") - # 直接使用 new_signup.py 进行注册 + # Directly use new_signup.py to sign up from new_signup import main as new_signup_main - # 执行新的注册流程,传入 translator + # Execute the new registration process, passing translator result, browser_tab = new_signup_main( email=self.email_address, password=self.password, @@ -111,11 +118,11 @@ class CursorRegistration: ) if result: - # 使用返回的浏览器实例获取账户信息 - self.signup_tab = browser_tab # 保存浏览器实例 + # Use the returned browser instance to get account information + self.signup_tab = browser_tab # Save browser instance success = self._get_account_info() - # 获取信息后关闭浏览器 + # Close browser after getting information if browser_tab: try: browser_tab.quit() @@ -130,7 +137,7 @@ class CursorRegistration: print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.register_process_error', error=str(e))}{Style.RESET_ALL}") return False finally: - # 确保在任何情况下都关闭浏览器 + # Ensure browser is closed in any case if browser_tab: try: browser_tab.quit() @@ -138,7 +145,7 @@ class CursorRegistration: pass def _get_account_info(self): - """获取账户信息和 Token""" + """Get Account Information and Token""" try: self.signup_tab.get(self.settings_url) time.sleep(2) @@ -190,7 +197,7 @@ class CursorRegistration: return False def _save_account_info(self, token, total_usage): - """保存账户信息到文件""" + """Save Account Information to File""" try: # 先更新认证信息 print(f"{Fore.CYAN}{EMOJI['KEY']} {self.translator.get('register.update_cursor_auth_info')}...{Style.RESET_ALL}") @@ -205,7 +212,7 @@ class CursorRegistration: if not resetter.reset_machine_ids(): # 直接调用reset_machine_ids方法 raise Exception("Failed to reset machine ID") - # 保存账户信息到文件 + # Save account information to file with open('cursor_accounts.txt', 'a', encoding='utf-8') as f: f.write(f"\n{'='*50}\n") f.write(f"Email: {self.email_address}\n") @@ -222,7 +229,7 @@ class CursorRegistration: return False def start(self): - """启动注册流程""" + """Start Registration Process""" try: if self.setup_email(): if self.register_cursor(): @@ -230,7 +237,7 @@ class CursorRegistration: return True return False finally: - # 关闭邮箱标签页 + # Close email tab if hasattr(self, 'temp_email'): try: self.temp_email.close() @@ -238,7 +245,7 @@ class CursorRegistration: pass def update_cursor_auth(self, email=None, access_token=None, refresh_token=None): - """更新Cursor的认证信息的便捷函数""" + """Update Cursor Auth Info""" auth_manager = CursorAuth(translator=self.translator) return auth_manager.update_auth(email, access_token, refresh_token) diff --git a/cursor_register_manual.py b/cursor_register_manual.py index be0766e..7b50b26 100644 --- a/cursor_register_manual.py +++ b/cursor_register_manual.py @@ -44,25 +44,33 @@ class CursorRegistration: self.signup_tab = None self.email_tab = None - # Account information + # Generate account information self.password = self._generate_password() - self.first_name = self._generate_name() - self.last_name = self._generate_name() - print(f"Password: {self.password}\n") - print(f"First Name: {self.first_name}\n") - print(f"Last Name: {self.last_name}\n") + # Generate first name and last name separately + first_name = random.choice([ + "James", "John", "Robert", "Michael", "William", "David", "Joseph", "Thomas", + "Emma", "Olivia", "Ava", "Isabella", "Sophia", "Mia", "Charlotte", "Amelia", + "Liam", "Noah", "Oliver", "Elijah", "Lucas", "Mason", "Logan", "Alexander" + ]) + self.last_name = random.choice([ + "Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", + "Anderson", "Wilson", "Taylor", "Thomas", "Moore", "Martin", "Jackson", "Lee", + "Thompson", "White", "Harris", "Clark", "Lewis", "Walker", "Hall", "Young" + ]) + + # Modify first letter of first name + new_first_letter = random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + self.first_name = new_first_letter + first_name[1:] + + print(f"\n{Fore.CYAN}{EMOJI['PASSWORD']} {self.translator.get('register.password')}: {self.password} {Style.RESET_ALL}") + print(f"{Fore.CYAN}{EMOJI['FORM']} {self.translator.get('register.first_name')}: {self.first_name} {Style.RESET_ALL}") + print(f"{Fore.CYAN}{EMOJI['FORM']} {self.translator.get('register.last_name')}: {self.last_name} {Style.RESET_ALL}") def _generate_password(self, length=12): """Generate Random Password""" chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*" return ''.join(random.choices(chars, k=length)) - def _generate_name(self, length=6): - """Generate Random Name""" - first_letter = random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ") - rest_letters = ''.join(random.choices("abcdefghijklmnopqrstuvwxyz", k=length-1)) - return first_letter + rest_letters - def setup_email(self): """Setup Email""" try: @@ -73,7 +81,7 @@ class CursorRegistration: print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_email') if self.translator else '无效的邮箱地址'}{Style.RESET_ALL}") return False - print(f"Email Address: {self.email_address}\n") + print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.email_address')}: {self.email_address}\n{Style.RESET_ALL}") return True except Exception as e: diff --git a/locales/en.json b/locales/en.json index 52ba540..67b83fd 100644 --- a/locales/en.json +++ b/locales/en.json @@ -131,7 +131,12 @@ "register_process_error": "Register Process Error: {error}", "setting_password": "Setting Password", "manual_code_input": "Manual Code Input", - "manual_email_input": "Manual Email Input" + "manual_email_input": "Manual Email Input", + "password": "Password", + "first_name": "First Name", + "last_name": "Last Name", + "exit_signal": "Exit Signal", + "email_address": "Email Address" }, "auth": { "title": "Cursor Auth Manager", diff --git a/locales/zh_cn.json b/locales/zh_cn.json index fed4a05..4ded99e 100644 --- a/locales/zh_cn.json +++ b/locales/zh_cn.json @@ -131,7 +131,12 @@ "update_cursor_auth_info": "更新Cursor认证信息", "setting_password": "设置密码", "manual_code_input": "手动输入验证码", - "manual_email_input": "手动输入邮箱" + "manual_email_input": "手动输入邮箱", + "password": "密码", + "first_name": "名字", + "last_name": "姓氏", + "exit_signal": "退出信号", + "email_address": "邮箱地址" }, "auth": { "title": "Cursor 认证管理器", diff --git a/locales/zh_tw.json b/locales/zh_tw.json index 4e9634d..e63f4b3 100644 --- a/locales/zh_tw.json +++ b/locales/zh_tw.json @@ -112,7 +112,12 @@ "update_cursor_auth_info": "更新Cursor認證信息", "setting_password": "設置密碼", "manual_code_input": "手動輸入驗證碼", - "manual_email_input": "手動輸入郵箱地址" + "manual_email_input": "手動輸入郵箱地址", + "password": "密碼", + "first_name": "名字", + "last_name": "姓氏", + "exit_signal": "退出信號", + "email_address": "郵箱地址" }, "auth": { "title": "Cursor 認證管理器",