diff --git a/.env b/.env index 570ef21..261f48c 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -version=1.7.11 -VERSION=1.7.11 +version=1.7.12 +VERSION=1.7.12 diff --git a/CHANGELOG.md b/CHANGELOG.md index 642d2c1..40f89fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log -## v1.7.11 ( Pre - Release 版本 ) +## v1.7.12 +1. Add: Changelog Show in Menu | 增加更新日志在菜單中 +2. Remake Create Mail Logic | 重做創建郵箱邏輯 +3. Fix: Some Issues | 修復一些問題 + +## v1.7.11 ( Skip & Merge to v1.7.12 ) 1. Add: Multi-language Support | 增加多語言支持 2. Add: German Language | 增加德語 3. Add: Dutch Language | 增加荷蘭語 diff --git a/locales/de.json b/locales/de.json index 350016c..beea12c 100644 --- a/locales/de.json +++ b/locales/de.json @@ -227,7 +227,7 @@ }, "email": { "starting_browser": "Browser Starten", - "visiting_site": "Besuche mail.tm", + "visiting_site": "Besuche mail domains", "create_success": "E-Mail Erfolgreich Erstellt", "create_failed": "E-Mail Erstellen Fehlgeschlagen", "create_error": "E-Mail-Erstellungsfehler: {error}", @@ -249,7 +249,8 @@ "failed_to_get_available_domains": "Verfügbare Domains Erhalten Fehlgeschlagen", "domains_excluded": "Ausgeschlossene Domains: {domains}", "failed_to_create_account": "Konto Erstellen Fehlgeschlagen", - "account_creation_error": "Konto-Erstellungsfehler: {error}" + "account_creation_error": "Konto-Erstellungsfehler: {error}", + "domain_blocked": "Domain Blocked: {domain}" }, "update": { "title": "Cursor Auto-Update Deaktivieren", @@ -274,7 +275,8 @@ "update_confirm": "Möchten Sie die neueste Version aktualisieren? (Y/n)", "update_skipped": "Update überspringen.", "invalid_choice": "Ungültige Auswahl. Bitte geben Sie 'Y' oder 'n' ein.", - "development_version": "Entwickler-Version {current} > {latest}" + "development_version": "Entwickler-Version {current} > {latest}", + "changelog_title": "Changelog" }, "totally_reset": { "title": "Cursor Vollständig Zurücksetzen", diff --git a/locales/en.json b/locales/en.json index 9cc3ccc..e9d3213 100644 --- a/locales/en.json +++ b/locales/en.json @@ -228,7 +228,7 @@ }, "email": { "starting_browser": "Starting Browser", - "visiting_site": "Visiting mail.tm", + "visiting_site": "Visiting mail domains", "create_success": "Email Created Successfully", "create_failed": "Failed to Create Email", "create_error": "Email Creation Error: {error}", @@ -259,7 +259,8 @@ "blocked_domains_loaded_timeout_error": "Blocked Domains Loaded Timeout Error: {error}", "available_domains_loaded": "Available Domains Loaded: {count}", "domains_filtered": "Domains Filtered: {count}", - "trying_to_create_email": "Trying to create email: {email}" + "trying_to_create_email": "Trying to create email: {email}", + "domain_blocked": "Domain Blocked: {domain}" }, "update": { "title": "Disable Cursor Auto Update", @@ -284,7 +285,8 @@ "update_confirm": "Do you want to update to the latest version? (Y/n)", "update_skipped": "Skipping update.", "invalid_choice": "Invalid choice. Please enter 'Y' or 'n'.", - "development_version": "Development Version {current} > {latest}" + "development_version": "Development Version {current} > {latest}", + "changelog_title": "Changelog" }, "totally_reset": { "title": "Totally Reset Cursor", diff --git a/locales/fr.json b/locales/fr.json index a795fb9..e40c889 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -227,7 +227,7 @@ }, "email": { "starting_browser": "Démarrage du Navigateur", - "visiting_site": "Visite de mail.tm", + "visiting_site": "Visite de mail domains", "create_success": "E-mail Créé avec Succès", "create_failed": "Échec de la Création de l'E-mail", "create_error": "Erreur de Création de l'E-mail : {error}", @@ -249,7 +249,8 @@ "failed_to_get_available_domains": "Échec de l'Obtention des Domaines Disponibles", "domains_excluded": "Domaines Exclus : {domains}", "failed_to_create_account": "Échec de la Création du Compte", - "account_creation_error": "Erreur de Création du Compte : {error}" + "account_creation_error": "Erreur de Création du Compte : {error}", + "domain_blocked": "Domaine Bloqué : {domain}" }, "update": { "title": "Désactivation de la Mise à Jour Automatique de Cursor", @@ -274,7 +275,8 @@ "update_confirm": "Voulez-vous mettre à jour vers la version la plus récente? (O/n)", "update_skipped": "Mise à jour ignorée.", "invalid_choice": "Choix invalide. Veuillez entrer 'O' ou 'n'.", - "development_version": "Version de Développement {current} > {latest}" + "development_version": "Version de Développement {current} > {latest}", + "changelog_title": "Journal des modifications" }, "totally_reset": { "title": "Réinitialiser Complètement Cursor", diff --git a/locales/nl.json b/locales/nl.json index ee47591..8dc4821 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -227,7 +227,7 @@ }, "email": { "starting_browser": "Browser starten", - "visiting_site": "Bezoek mail.tm", + "visiting_site": "Bezoek mail domains", "create_success": "E-mail succesvol aangemaakt", "create_failed": "E-mail aanmaken mislukt", "create_error": "E-mail aanmaakfout: {error}", @@ -249,7 +249,8 @@ "failed_to_get_available_domains": "Verkrijgen van beschikbare domeinen mislukt", "domains_excluded": "Uitgesloten domeinen: {domains}", "failed_to_create_account": "Account aanmaken mislukt", - "account_creation_error": "Account aanmaakfout: {error}" + "account_creation_error": "Account aanmaakfout: {error}", + "domain_blocked": "Domein geblokkeerd: {domain}" }, "update": { "title": "Cursor automatische update uitschakelen", @@ -274,7 +275,8 @@ "update_confirm": "Wil je de nieuwste versie gebruiken? (Y/n)", "update_skipped": "Update overgeslagen.", "invalid_choice": "Ongeldige keuze. Voer 'Y' of 'n' in.", - "development_version": "Ontwikkelversie {current} > {latest}" + "development_version": "Ontwikkelversie {current} > {latest}", + "changelog_title": "Changelog" }, "totally_reset": { "title": "Cursor volledig herstellen", diff --git a/locales/vi.json b/locales/vi.json index efc3226..f8917f8 100644 --- a/locales/vi.json +++ b/locales/vi.json @@ -226,7 +226,7 @@ }, "email": { "starting_browser": "Đang Khởi Động Trình Duyệt", - "visiting_site": "Đang Truy Cập mail.tm", + "visiting_site": "Đang Truy Cập mail domains", "create_success": "Tạo Email Thành Công", "create_failed": "Tạo Email Thất Bại", "create_error": "Lỗi Tạo Email: {error}", @@ -257,7 +257,8 @@ "blocked_domains_loaded_timeout_error": "Lỗi Hết Thời Gian Tải Tên Miền Bị Chặn: {error}", "available_domains_loaded": "Đã Tải Tên Miền Khả Dụng: {count}", "domains_filtered": "Tên Miền Đã Lọc: {count}", - "trying_to_create_email": "Đang cố gắng tạo email: {email}" + "trying_to_create_email": "Đang cố gắng tạo email: {email}", + "domain_blocked": "Tên Miền Bị Chặn: {domain}" }, "update": { "title": "Tắt Tự Động Cập Nhật Cursor", @@ -282,7 +283,8 @@ "update_confirm": "Bạn Có Muốn Cập Nhật Lên Phiên Bản Mới Nhất Không? (Y/n)", "update_skipped": "Bỏ Qua Cập Nhật.", "invalid_choice": "Lựa Chọn Không Hợp Lệ. Vui Lòng Nhập 'Y' Hoặc 'n'.", - "development_version": "Phiên Bản Phát Triển {current} > {latest}" + "development_version": "Phiên Bản Phát Triển {current} > {latest}", + "changelog_title": "Changelog" }, "totally_reset": { "title": "Đặt lại hoàn toàn Cursor", diff --git a/locales/zh_cn.json b/locales/zh_cn.json index 0fcee3e..ccfac40 100644 --- a/locales/zh_cn.json +++ b/locales/zh_cn.json @@ -224,7 +224,7 @@ }, "email": { "starting_browser": "启动浏览器", - "visiting_site": "访问 mail.tm", + "visiting_site": "访问 邮箱服务网站", "create_success": "邮箱创建成功", "create_failed": "邮箱创建失败", "create_error": "邮箱创建错误: {error}", @@ -255,7 +255,8 @@ "blocked_domains_loaded_timeout_error": "加载被屏蔽的域名超时错误: {error}", "available_domains_loaded": "获取到 {count} 个可用域名", "domains_filtered": "过滤后剩餘 {count} 個可用域名", - "trying_to_create_email": "尝试创建邮箱: {email}" + "trying_to_create_email": "尝试创建邮箱: {email}", + "domain_blocked": "域名被屏蔽: {domain}" }, "update": { "title": "禁用 Cursor 自动更新", @@ -280,7 +281,8 @@ "update_confirm": "是否要更新到最新版本? (Y/n)", "update_skipped": "跳过更新。", "invalid_choice": "选择无效。请输入 'Y' 或 'n'.", - "development_version": "开发版本 {current} > {latest}" + "development_version": "开发版本 {current} > {latest}", + "changelog_title": "更新日志" }, "totally_reset": { "title": "完全重置 Cursor", diff --git a/locales/zh_tw.json b/locales/zh_tw.json index 9dc62b9..833aeea 100644 --- a/locales/zh_tw.json +++ b/locales/zh_tw.json @@ -204,7 +204,7 @@ }, "email": { "starting_browser": "啟動瀏覽器", - "visiting_site": "訪問 mail.tm", + "visiting_site": "訪問 郵箱網站", "create_success": "郵箱創建成功", "create_failed": "郵箱創建失敗", "create_error": "郵箱創建錯誤: {error}", @@ -260,7 +260,8 @@ "update_confirm": "是否要更新到最新版本? (Y/n)", "update_skipped": "跳過更新。", "invalid_choice": "選擇無效。請輸入 'Y' 或 'n'.", - "development_version": "開發版本 {current} > {latest}" + "development_version": "開發版本 {current} > {latest}", + "changelog_title": "更新日志" }, "totally_reset": { "title": "完全重置 Cursor", diff --git a/main.py b/main.py index db6fe5d..3ca82a4 100644 --- a/main.py +++ b/main.py @@ -317,6 +317,43 @@ def check_latest_version(): if is_newer_version_available: print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.new_version_available', current=version, latest=latest_version)}{Style.RESET_ALL}") + # get and show changelog + try: + changelog_url = "https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/CHANGELOG.md" + changelog_response = requests.get(changelog_url, timeout=10) + + if changelog_response.status_code == 200: + changelog_content = changelog_response.text + + # get latest version changelog + latest_version_pattern = f"## v{latest_version}" + changelog_sections = changelog_content.split("## v") + + latest_changes = None + for section in changelog_sections: + if section.startswith(latest_version): + latest_changes = section + break + + if latest_changes: + print(f"\n{Fore.CYAN}{'─' * 40}{Style.RESET_ALL}") + print(f"{Fore.CYAN}{translator.get('updater.changelog_title')}:{Style.RESET_ALL}") + + # show changelog content (max 10 lines) + changes_lines = latest_changes.strip().split('\n') + for i, line in enumerate(changes_lines[1:11]): # skip version number line, max 10 lines + if line.strip(): + print(f"{Fore.WHITE}{line.strip()}{Style.RESET_ALL}") + + # if changelog more than 10 lines, show ellipsis + if len(changes_lines) > 11: + print(f"{Fore.WHITE}...{Style.RESET_ALL}") + + print(f"{Fore.CYAN}{'─' * 40}{Style.RESET_ALL}") + except Exception as changelog_error: + # get changelog failed + pass + # Ask user if they want to update while True: choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('updater.update_confirm', choices='Y/n')}: {Style.RESET_ALL}").lower() diff --git a/new_tempemail.py b/new_tempemail.py index 1e9da7c..f2c7227 100644 --- a/new_tempemail.py +++ b/new_tempemail.py @@ -14,17 +14,8 @@ init() class NewTempEmail: def __init__(self, translator=None): self.translator = translator - # Randomly choose between mail.tm and mail.gw - self.services = [ - {"name": "mail.tm", "api_url": "https://api.mail.tm"}, - {"name": "mail.gw", "api_url": "https://api.mail.gw"} - ] - self.selected_service = random.choice(self.services) - self.api_url = self.selected_service["api_url"] - self.token = None - self.email = None - self.password = None - self.blocked_domains = self.get_blocked_domains() + self.page = None + self.setup_browser() def get_blocked_domains(self): """Get blocked domains list""" @@ -91,184 +82,132 @@ class NewTempEmail: return filtered_domains - def _generate_credentials(self): - """generate random username and password""" - username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10)) - password = ''.join(random.choices(string.ascii_letters + string.digits + string.punctuation, k=12)) - return username, password - def create_email(self): - """create temporary email""" - max_retries = 3 # Maximum number of retries - attempt = 0 # Current attempt count + def get_extension_block(self): + """获取插件路径""" + root_dir = os.getcwd() + extension_path = os.path.join(root_dir, "PBlock") - while attempt < max_retries: - attempt += 1 + if hasattr(sys, "_MEIPASS"): + extension_path = os.path.join(sys._MEIPASS, "PBlock") + + if not os.path.exists(extension_path): + raise FileNotFoundError(f"插件不存在: {extension_path}") + + return extension_path + + def setup_browser(self): + """设置浏览器""" + try: + if self.translator: + print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.starting_browser')}{Style.RESET_ALL}") + else: + print(f"{Fore.CYAN}ℹ️ 正在启动浏览器...{Style.RESET_ALL}") + + # 创建浏览器选项 + co = ChromiumOptions() + co.set_argument("--headless=new") + + co.auto_port() # 自动设置端口 + + # 加载 uBlock 插件 try: - if self.translator: - print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.visiting_site').replace('mail.tm', self.selected_service['name'])}{Style.RESET_ALL}") - else: - print(f"{Fore.CYAN}ℹ️ 正在访问 {self.selected_service['name']}...{Style.RESET_ALL}") - - # Get available domain list - try: - domains_response = requests.get(f"{self.api_url}/domains", timeout=10) - if domains_response.status_code != 200: - print(f"{Fore.RED}❌ {self.translator.get('email.domains_list_error', error=domains_response.status_code)}{Style.RESET_ALL}") - print(f"{Fore.RED}❌ {self.translator.get('email.domains_list_error', error=domains_response.text)}{Style.RESET_ALL}") - raise Exception(f"{self.translator.get('email.failed_to_get_available_domains') if self.translator else 'Failed to get available domains'}") - - domains = domains_response.json()["hydra:member"] - print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.available_domains_loaded', count=len(domains))}{Style.RESET_ALL}") - - if not domains: - raise Exception(f"{self.translator.get('email.no_available_domains') if self.translator else '没有可用域名'}") - except Exception as e: - print(f"{Fore.RED}❌ 获取域名列表时出错: {str(e)}{Style.RESET_ALL}") - raise - - # Exclude blocked domains - try: - filtered_domains = self.exclude_blocked_domains(domains) - if self.translator: - print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.domains_filtered', count=len(filtered_domains))}{Style.RESET_ALL}") - else: - print(f"{Fore.CYAN}ℹ️ 过滤后剩余 {len(filtered_domains)} 个可用域名{Style.RESET_ALL}") - - if not filtered_domains: - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.all_domains_blocked')}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 所有域名都被屏蔽了,尝试切换服务{Style.RESET_ALL}") - - # Switch to another service - for service in self.services: - if service["api_url"] != self.api_url: - self.selected_service = service - self.api_url = service["api_url"] - if self.translator: - print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.switching_service', service=service['name'])}{Style.RESET_ALL}") - else: - print(f"{Fore.CYAN}ℹ️ 切换到 {service['name']} 服务{Style.RESET_ALL}") - return self.create_email() # Recursively call - - raise Exception(f"{self.translator.get('email.no_available_domains_after_filtering') if self.translator else '过滤后没有可用域名'}") - except Exception as e: - print(f"{Fore.RED}❌ 过滤域名时出错: {str(e)}{Style.RESET_ALL}") - raise - - # Generate random username and password - try: - username, password = self._generate_credentials() - self.password = password - - # Create email account - selected_domain = filtered_domains[0]['domain'] - email = f"{username}@{selected_domain}" - - if self.translator: - print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.trying_to_create_email', email=email)}{Style.RESET_ALL}") - else: - print(f"{Fore.CYAN}ℹ️ 尝试创建邮箱: {email}{Style.RESET_ALL}") - - account_data = { - "address": email, - "password": password - } - except Exception as e: - print(f"{Fore.RED}❌ 生成凭据时出错: {str(e)}{Style.RESET_ALL}") - raise - - # Create account - try: - create_response = requests.post(f"{self.api_url}/accounts", json=account_data, timeout=15) - - if create_response.status_code != 201: - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.failed_to_create_account', error=create_response.status_code)}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 创建账户失败: 状态码 {create_response.status_code}{Style.RESET_ALL}") - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.failed_to_create_account', error=create_response.text)}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 响应内容: {create_response.text}{Style.RESET_ALL}") - - # If it's a domain problem, try the next available domain - if len(filtered_domains) > 1 and ("domain" in create_response.text.lower() or "address" in create_response.text.lower()): - print(f"{Fore.YELLOW}⚠️ 尝试使用下一个可用域名...{Style.RESET_ALL}") - # Add current domain to blocked list - if selected_domain not in self.blocked_domains: - self.blocked_domains.append(selected_domain) - # Recursively call yourself - return self.create_email() - - raise Exception(f"{self.translator.get('email.failed_to_create_account') if self.translator else '创建账户失败'}") - except Exception as e: - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.failed_to_create_account', error=str(e))}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 创建账户时出错: {str(e)}{Style.RESET_ALL}") - raise - - # Get access token - try: - token_data = { - "address": email, - "password": password - } - - token_response = requests.post(f"{self.api_url}/token", json=token_data, timeout=10) - if token_response.status_code != 200: - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.failed_to_get_access_token', error=token_response.status_code)}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 获取令牌失败: 状态码 {token_response.status_code}{Style.RESET_ALL}") - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.failed_to_get_access_token', error=token_response.text)}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 响应内容: {token_response.text}{Style.RESET_ALL}") - raise Exception(f"{self.translator.get('email.failed_to_get_access_token') if self.translator else '获取访问令牌失败'}") - - self.token = token_response.json()["token"] - self.email = email - except Exception as e: - print(f"{Fore.RED}❌ 获取令牌时出错: {str(e)}{Style.RESET_ALL}") - raise - - if self.translator: - print(f"{Fore.GREEN}✅ {self.translator.get('email.create_success')}: {email}{Style.RESET_ALL}") - else: - print(f"{Fore.GREEN}✅ 创建邮箱成功: {email}{Style.RESET_ALL}") - return email - + extension_path = self.get_extension_block() + co.set_argument("--allow-extensions-in-incognito") + co.add_extension(extension_path) except Exception as e: - if attempt < max_retries: - print(f"{Fore.YELLOW}⚠️ 尝试重新创建邮箱... (尝试 {attempt}/{max_retries}){Style.RESET_ALL}") + if self.translator: + print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.extension_load_error')}: {str(e)}{Style.RESET_ALL}") else: - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.create_error')}: {str(e)}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 创建邮箱出错: {str(e)}{Style.RESET_ALL}") - return None - + print(f"{Fore.YELLOW}⚠️ 加载插件失败: {str(e)}{Style.RESET_ALL}") + + self.page = ChromiumPage(co) + return True + except Exception as e: + if self.translator: + print(f"{Fore.RED}❌ {self.translator.get('email.browser_start_error')}: {str(e)}{Style.RESET_ALL}") + else: + print(f"{Fore.RED}❌ 启动浏览器失败: {str(e)}{Style.RESET_ALL}") + return False + + def create_email(self): + """创建临时邮箱""" + try: + if self.translator: + print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.visiting_site')}{Style.RESET_ALL}") + else: + print(f"{Fore.CYAN}ℹ️ 正在访问 smailpro.com...{Style.RESET_ALL}") + + # 加载被屏蔽域名列表 + self.blocked_domains = self.get_blocked_domains() + + # 访问网站 + self.page.get("https://smailpro.com/") + time.sleep(2) + + # 点击创建邮箱按钮 + create_button = self.page.ele('xpath://button[@title="Create temporary email"]') + if create_button: + create_button.click() + time.sleep(1) + + # 点击弹窗中的 Create 按钮 + modal_create_button = self.page.ele('xpath://button[contains(text(), "Create")]') + if modal_create_button: + modal_create_button.click() + time.sleep(2) + + # 获取邮箱地址 - 修改选择器 + email_div = self.page.ele('xpath://div[@class="text-base sm:text-lg md:text-xl text-gray-700"]') + if email_div: + email = email_div.text.strip() + if '@' in email: # 验证是否是有效的邮箱地址 + # 检查域名是否被屏蔽 + domain = email.split('@')[1] + if self.blocked_domains and domain in self.blocked_domains: + if self.translator: + print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.domain_blocked')}: {domain}{Style.RESET_ALL}") + else: + print(f"{Fore.YELLOW}⚠️ 域名已被屏蔽: {domain},尝试重新创建邮箱{Style.RESET_ALL}") + # 重新创建邮箱 + return self.create_email() + + if self.translator: + print(f"{Fore.GREEN}✅ {self.translator.get('email.create_success')}: {email}{Style.RESET_ALL}") + else: + print(f"{Fore.GREEN}✅ 创建邮箱成功: {email}{Style.RESET_ALL}") + return email + if self.translator: + print(f"{Fore.RED}❌ {self.translator.get('email.create_failed')}{Style.RESET_ALL}") + else: + print(f"{Fore.RED}❌ 创建邮箱失败{Style.RESET_ALL}") + return None + + except Exception as e: + if self.translator: + print(f"{Fore.RED}❌ {self.translator.get('email.create_error')}: {str(e)}{Style.RESET_ALL}") + else: + print(f"{Fore.RED}❌ 创建邮箱出错: {str(e)}{Style.RESET_ALL}") + return None + def close(self): - """close browser""" + """关闭浏览器""" if self.page: self.page.quit() def refresh_inbox(self): - """refresh inbox""" + """刷新邮箱""" try: if self.translator: print(f"{Fore.CYAN}🔄 {self.translator.get('email.refreshing')}{Style.RESET_ALL}") else: print(f"{Fore.CYAN}🔄 正在刷新邮箱...{Style.RESET_ALL}") - # Use API to get latest email - headers = {"Authorization": f"Bearer {self.token}"} - response = requests.get(f"{self.api_url}/messages", headers=headers) - - if response.status_code == 200: + # 点击刷新按钮 + refresh_button = self.page.ele('xpath://button[@id="refresh"]') + if refresh_button: + refresh_button.click() + time.sleep(2) # 等待刷新完成 if self.translator: print(f"{Fore.GREEN}✅ {self.translator.get('email.refresh_success')}{Style.RESET_ALL}") else: @@ -276,9 +215,9 @@ class NewTempEmail: return True if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.refresh_failed')}{Style.RESET_ALL}") + print(f"{Fore.RED}❌ {self.translator.get('email.refresh_button_not_found')}{Style.RESET_ALL}") else: - print(f"{Fore.RED}❌ 刷新邮箱失败{Style.RESET_ALL}") + print(f"{Fore.RED}❌ 未找到刷新按钮{Style.RESET_ALL}") return False except Exception as e: @@ -289,26 +228,19 @@ class NewTempEmail: return False def check_for_cursor_email(self): - """Check if there is a Cursor verification email""" + """检查是否有 Cursor 的验证邮件""" try: - # Use API to get email list - headers = {"Authorization": f"Bearer {self.token}"} - response = requests.get(f"{self.api_url}/messages", headers=headers) - - if response.status_code == 200: - messages = response.json()["hydra:member"] - for message in messages: - if message["from"]["address"] == "no-reply@cursor.sh" and "Verify your email address" in message["subject"]: - # Get email content - message_id = message["id"] - message_response = requests.get(f"{self.api_url}/messages/{message_id}", headers=headers) - if message_response.status_code == 200: - if self.translator: - print(f"{Fore.GREEN}✅ {self.translator.get('email.verification_found')}{Style.RESET_ALL}") - else: - print(f"{Fore.GREEN}✅ 找到验证邮件{Style.RESET_ALL}") - return True - + # 查找验证邮件 - 使用更精确的选择器 + email_div = self.page.ele('xpath://div[contains(@class, "p-2") and contains(@class, "cursor-pointer") and contains(@class, "bg-white") and contains(@class, "shadow") and .//b[text()="no-reply@cursor.sh"] and .//span[text()="Verify your email address"]]') + if email_div: + if self.translator: + print(f"{Fore.GREEN}✅ {self.translator.get('email.verification_found')}{Style.RESET_ALL}") + else: + print(f"{Fore.GREEN}✅ 找到验证邮件{Style.RESET_ALL}") + # 使用 JavaScript 点击元素 + self.page.run_js('arguments[0].click()', email_div) + time.sleep(2) # 等待邮件内容加载 + return True if self.translator: print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_not_found')}{Style.RESET_ALL}") else: @@ -322,75 +254,31 @@ class NewTempEmail: print(f"{Fore.RED}❌ 检查验证邮件出错: {str(e)}{Style.RESET_ALL}") return False - def get_verification_code(self, max_retries=3): - """get verification code with retry mechanism""" - for attempt in range(1, max_retries + 1): - try: - # Check if token is valid - if not self.token: + def get_verification_code(self): + """获取验证码""" + try: + # 查找验证码元素 + code_element = self.page.ele('xpath://td//div[contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px")]') + if code_element: + code = code_element.text.strip() + if code.isdigit() and len(code) == 6: if self.translator: - print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.no_token_retry')}{Style.RESET_ALL}") + print(f"{Fore.GREEN}✅ {self.translator.get('email.verification_code_found')}: {code}{Style.RESET_ALL}") else: - print(f"{Fore.YELLOW}⚠️ 未获取到有效令牌,尝试重新创建邮箱... (尝试 {attempt}/{max_retries}){Style.RESET_ALL}") - - # Try to recreate email - self.create_email() - if not self.token: - continue # Skip to next attempt if still no token - - # Use API to get email list - headers = {"Authorization": f"Bearer {self.token}"} - response = requests.get(f"{self.api_url}/messages", headers=headers) - - if response.status_code == 200: - messages = response.json()["hydra:member"] - for message in messages: - if message["from"]["address"] == "no-reply@cursor.sh" and "Verify your email address" in message["subject"]: - # Get email content - message_id = message["id"] - message_response = requests.get(f"{self.api_url}/messages/{message_id}", headers=headers) - - if message_response.status_code == 200: - # Extract verification code from email content - email_content = message_response.json()["text"] - # Find 6-digit verification code - import re - code_match = re.search(r'\b\d{6}\b', email_content) - - if code_match: - code = code_match.group(0) - if self.translator: - print(f"{Fore.GREEN}✅ {self.translator.get('email.verification_code_found')}: {code}{Style.RESET_ALL}") - else: - print(f"{Fore.GREEN}✅ 获取验证码成功: {code}{Style.RESET_ALL}") - return code - - if attempt < max_retries: - wait_time = 10 * attempt # Increase wait time with each attempt - if self.translator: - print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_code_retry', attempt=attempt, max=max_retries, wait=wait_time)}{Style.RESET_ALL}") - else: - print(f"{Fore.YELLOW}⚠️ 未找到有效的验证码,将在 {wait_time} 秒后重试... (尝试 {attempt}/{max_retries}){Style.RESET_ALL}") - time.sleep(wait_time) - else: - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.verification_code_not_found')}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 未找到有效的验证码{Style.RESET_ALL}") - except Exception as e: - if attempt < max_retries: - if self.translator: - print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_code_error_retry', error=str(e), attempt=attempt, max=max_retries)}{Style.RESET_ALL}") - else: - print(f"{Fore.YELLOW}⚠️ 获取验证码出错: {str(e)},将重试... (尝试 {attempt}/{max_retries}){Style.RESET_ALL}") - time.sleep(get_random_wait_time(self.config, 'page_load_wait')) - else: - if self.translator: - print(f"{Fore.RED}❌ {self.translator.get('email.verification_code_error')}: {str(e)}{Style.RESET_ALL}") - else: - print(f"{Fore.RED}❌ 获取验证码出错: {str(e)}{Style.RESET_ALL}") - - return None + print(f"{Fore.GREEN}✅ 获取验证码成功: {code}{Style.RESET_ALL}") + return code + if self.translator: + print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_code_not_found')}{Style.RESET_ALL}") + else: + print(f"{Fore.YELLOW}⚠️ 未找到有效的验证码{Style.RESET_ALL}") + return None + + except Exception as e: + if self.translator: + print(f"{Fore.RED}❌ {self.translator.get('email.verification_code_error')}: {str(e)}{Style.RESET_ALL}") + else: + print(f"{Fore.RED}❌ 获取验证码出错: {str(e)}{Style.RESET_ALL}") + return None def main(translator=None): temp_email = NewTempEmail(translator) @@ -403,7 +291,7 @@ def main(translator=None): else: print(f"\n{Fore.CYAN}📧 临时邮箱地址: {email}{Style.RESET_ALL}") - # Test refresh function + # 测试刷新功能 while True: if translator: choice = input(f"\n{translator.get('email.refresh_prompt')}: ").lower() @@ -418,4 +306,4 @@ def main(translator=None): temp_email.close() if __name__ == "__main__": - main() \ No newline at end of file + main() \ No newline at end of file