forked from mirrors/cursor-free-vip
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4eac8a9e0e |
@@ -1,6 +1,11 @@
|
|||||||
# Change Log
|
# 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 | 增加多語言支持
|
1. Add: Multi-language Support | 增加多語言支持
|
||||||
2. Add: German Language | 增加德語
|
2. Add: German Language | 增加德語
|
||||||
3. Add: Dutch Language | 增加荷蘭語
|
3. Add: Dutch Language | 增加荷蘭語
|
||||||
|
|||||||
@@ -227,7 +227,7 @@
|
|||||||
},
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"starting_browser": "Browser Starten",
|
"starting_browser": "Browser Starten",
|
||||||
"visiting_site": "Besuche mail.tm",
|
"visiting_site": "Besuche mail domains",
|
||||||
"create_success": "E-Mail Erfolgreich Erstellt",
|
"create_success": "E-Mail Erfolgreich Erstellt",
|
||||||
"create_failed": "E-Mail Erstellen Fehlgeschlagen",
|
"create_failed": "E-Mail Erstellen Fehlgeschlagen",
|
||||||
"create_error": "E-Mail-Erstellungsfehler: {error}",
|
"create_error": "E-Mail-Erstellungsfehler: {error}",
|
||||||
@@ -249,7 +249,8 @@
|
|||||||
"failed_to_get_available_domains": "Verfügbare Domains Erhalten Fehlgeschlagen",
|
"failed_to_get_available_domains": "Verfügbare Domains Erhalten Fehlgeschlagen",
|
||||||
"domains_excluded": "Ausgeschlossene Domains: {domains}",
|
"domains_excluded": "Ausgeschlossene Domains: {domains}",
|
||||||
"failed_to_create_account": "Konto Erstellen Fehlgeschlagen",
|
"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": {
|
"update": {
|
||||||
"title": "Cursor Auto-Update Deaktivieren",
|
"title": "Cursor Auto-Update Deaktivieren",
|
||||||
@@ -274,7 +275,8 @@
|
|||||||
"update_confirm": "Möchten Sie die neueste Version aktualisieren? (Y/n)",
|
"update_confirm": "Möchten Sie die neueste Version aktualisieren? (Y/n)",
|
||||||
"update_skipped": "Update überspringen.",
|
"update_skipped": "Update überspringen.",
|
||||||
"invalid_choice": "Ungültige Auswahl. Bitte geben Sie 'Y' oder 'n' ein.",
|
"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": {
|
"totally_reset": {
|
||||||
"title": "Cursor Vollständig Zurücksetzen",
|
"title": "Cursor Vollständig Zurücksetzen",
|
||||||
|
|||||||
@@ -228,7 +228,7 @@
|
|||||||
},
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"starting_browser": "Starting Browser",
|
"starting_browser": "Starting Browser",
|
||||||
"visiting_site": "Visiting mail.tm",
|
"visiting_site": "Visiting mail domains",
|
||||||
"create_success": "Email Created Successfully",
|
"create_success": "Email Created Successfully",
|
||||||
"create_failed": "Failed to Create Email",
|
"create_failed": "Failed to Create Email",
|
||||||
"create_error": "Email Creation Error: {error}",
|
"create_error": "Email Creation Error: {error}",
|
||||||
@@ -259,7 +259,8 @@
|
|||||||
"blocked_domains_loaded_timeout_error": "Blocked Domains Loaded Timeout Error: {error}",
|
"blocked_domains_loaded_timeout_error": "Blocked Domains Loaded Timeout Error: {error}",
|
||||||
"available_domains_loaded": "Available Domains Loaded: {count}",
|
"available_domains_loaded": "Available Domains Loaded: {count}",
|
||||||
"domains_filtered": "Domains Filtered: {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": {
|
"update": {
|
||||||
"title": "Disable Cursor Auto Update",
|
"title": "Disable Cursor Auto Update",
|
||||||
@@ -284,7 +285,8 @@
|
|||||||
"update_confirm": "Do you want to update to the latest version? (Y/n)",
|
"update_confirm": "Do you want to update to the latest version? (Y/n)",
|
||||||
"update_skipped": "Skipping update.",
|
"update_skipped": "Skipping update.",
|
||||||
"invalid_choice": "Invalid choice. Please enter 'Y' or 'n'.",
|
"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": {
|
"totally_reset": {
|
||||||
"title": "Totally Reset Cursor",
|
"title": "Totally Reset Cursor",
|
||||||
|
|||||||
@@ -227,7 +227,7 @@
|
|||||||
},
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"starting_browser": "Démarrage du Navigateur",
|
"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_success": "E-mail Créé avec Succès",
|
||||||
"create_failed": "Échec de la Création de l'E-mail",
|
"create_failed": "Échec de la Création de l'E-mail",
|
||||||
"create_error": "Erreur de Création de l'E-mail : {error}",
|
"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",
|
"failed_to_get_available_domains": "Échec de l'Obtention des Domaines Disponibles",
|
||||||
"domains_excluded": "Domaines Exclus : {domains}",
|
"domains_excluded": "Domaines Exclus : {domains}",
|
||||||
"failed_to_create_account": "Échec de la Création du Compte",
|
"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": {
|
"update": {
|
||||||
"title": "Désactivation de la Mise à Jour Automatique de Cursor",
|
"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_confirm": "Voulez-vous mettre à jour vers la version la plus récente? (O/n)",
|
||||||
"update_skipped": "Mise à jour ignorée.",
|
"update_skipped": "Mise à jour ignorée.",
|
||||||
"invalid_choice": "Choix invalide. Veuillez entrer 'O' ou 'n'.",
|
"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": {
|
"totally_reset": {
|
||||||
"title": "Réinitialiser Complètement Cursor",
|
"title": "Réinitialiser Complètement Cursor",
|
||||||
|
|||||||
@@ -227,7 +227,7 @@
|
|||||||
},
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"starting_browser": "Browser starten",
|
"starting_browser": "Browser starten",
|
||||||
"visiting_site": "Bezoek mail.tm",
|
"visiting_site": "Bezoek mail domains",
|
||||||
"create_success": "E-mail succesvol aangemaakt",
|
"create_success": "E-mail succesvol aangemaakt",
|
||||||
"create_failed": "E-mail aanmaken mislukt",
|
"create_failed": "E-mail aanmaken mislukt",
|
||||||
"create_error": "E-mail aanmaakfout: {error}",
|
"create_error": "E-mail aanmaakfout: {error}",
|
||||||
@@ -249,7 +249,8 @@
|
|||||||
"failed_to_get_available_domains": "Verkrijgen van beschikbare domeinen mislukt",
|
"failed_to_get_available_domains": "Verkrijgen van beschikbare domeinen mislukt",
|
||||||
"domains_excluded": "Uitgesloten domeinen: {domains}",
|
"domains_excluded": "Uitgesloten domeinen: {domains}",
|
||||||
"failed_to_create_account": "Account aanmaken mislukt",
|
"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": {
|
"update": {
|
||||||
"title": "Cursor automatische update uitschakelen",
|
"title": "Cursor automatische update uitschakelen",
|
||||||
@@ -274,7 +275,8 @@
|
|||||||
"update_confirm": "Wil je de nieuwste versie gebruiken? (Y/n)",
|
"update_confirm": "Wil je de nieuwste versie gebruiken? (Y/n)",
|
||||||
"update_skipped": "Update overgeslagen.",
|
"update_skipped": "Update overgeslagen.",
|
||||||
"invalid_choice": "Ongeldige keuze. Voer 'Y' of 'n' in.",
|
"invalid_choice": "Ongeldige keuze. Voer 'Y' of 'n' in.",
|
||||||
"development_version": "Ontwikkelversie {current} > {latest}"
|
"development_version": "Ontwikkelversie {current} > {latest}",
|
||||||
|
"changelog_title": "Changelog"
|
||||||
},
|
},
|
||||||
"totally_reset": {
|
"totally_reset": {
|
||||||
"title": "Cursor volledig herstellen",
|
"title": "Cursor volledig herstellen",
|
||||||
|
|||||||
@@ -226,7 +226,7 @@
|
|||||||
},
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"starting_browser": "Đang Khởi Động Trình Duyệt",
|
"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_success": "Tạo Email Thành Công",
|
||||||
"create_failed": "Tạo Email Thất Bại",
|
"create_failed": "Tạo Email Thất Bại",
|
||||||
"create_error": "Lỗi Tạo Email: {error}",
|
"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}",
|
"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}",
|
"available_domains_loaded": "Đã Tải Tên Miền Khả Dụng: {count}",
|
||||||
"domains_filtered": "Tên Miền Đã Lọc: {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": {
|
"update": {
|
||||||
"title": "Tắt Tự Động Cập Nhật Cursor",
|
"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_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.",
|
"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'.",
|
"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": {
|
"totally_reset": {
|
||||||
"title": "Đặt lại hoàn toàn Cursor",
|
"title": "Đặt lại hoàn toàn Cursor",
|
||||||
|
|||||||
@@ -224,7 +224,7 @@
|
|||||||
},
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"starting_browser": "启动浏览器",
|
"starting_browser": "启动浏览器",
|
||||||
"visiting_site": "访问 mail.tm",
|
"visiting_site": "访问 邮箱服务网站",
|
||||||
"create_success": "邮箱创建成功",
|
"create_success": "邮箱创建成功",
|
||||||
"create_failed": "邮箱创建失败",
|
"create_failed": "邮箱创建失败",
|
||||||
"create_error": "邮箱创建错误: {error}",
|
"create_error": "邮箱创建错误: {error}",
|
||||||
@@ -255,7 +255,8 @@
|
|||||||
"blocked_domains_loaded_timeout_error": "加载被屏蔽的域名超时错误: {error}",
|
"blocked_domains_loaded_timeout_error": "加载被屏蔽的域名超时错误: {error}",
|
||||||
"available_domains_loaded": "获取到 {count} 个可用域名",
|
"available_domains_loaded": "获取到 {count} 个可用域名",
|
||||||
"domains_filtered": "过滤后剩餘 {count} 個可用域名",
|
"domains_filtered": "过滤后剩餘 {count} 個可用域名",
|
||||||
"trying_to_create_email": "尝试创建邮箱: {email}"
|
"trying_to_create_email": "尝试创建邮箱: {email}",
|
||||||
|
"domain_blocked": "域名被屏蔽: {domain}"
|
||||||
},
|
},
|
||||||
"update": {
|
"update": {
|
||||||
"title": "禁用 Cursor 自动更新",
|
"title": "禁用 Cursor 自动更新",
|
||||||
@@ -280,7 +281,8 @@
|
|||||||
"update_confirm": "是否要更新到最新版本? (Y/n)",
|
"update_confirm": "是否要更新到最新版本? (Y/n)",
|
||||||
"update_skipped": "跳过更新。",
|
"update_skipped": "跳过更新。",
|
||||||
"invalid_choice": "选择无效。请输入 'Y' 或 'n'.",
|
"invalid_choice": "选择无效。请输入 'Y' 或 'n'.",
|
||||||
"development_version": "开发版本 {current} > {latest}"
|
"development_version": "开发版本 {current} > {latest}",
|
||||||
|
"changelog_title": "更新日志"
|
||||||
},
|
},
|
||||||
"totally_reset": {
|
"totally_reset": {
|
||||||
"title": "完全重置 Cursor",
|
"title": "完全重置 Cursor",
|
||||||
|
|||||||
@@ -204,7 +204,7 @@
|
|||||||
},
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"starting_browser": "啟動瀏覽器",
|
"starting_browser": "啟動瀏覽器",
|
||||||
"visiting_site": "訪問 mail.tm",
|
"visiting_site": "訪問 郵箱網站",
|
||||||
"create_success": "郵箱創建成功",
|
"create_success": "郵箱創建成功",
|
||||||
"create_failed": "郵箱創建失敗",
|
"create_failed": "郵箱創建失敗",
|
||||||
"create_error": "郵箱創建錯誤: {error}",
|
"create_error": "郵箱創建錯誤: {error}",
|
||||||
@@ -260,7 +260,8 @@
|
|||||||
"update_confirm": "是否要更新到最新版本? (Y/n)",
|
"update_confirm": "是否要更新到最新版本? (Y/n)",
|
||||||
"update_skipped": "跳過更新。",
|
"update_skipped": "跳過更新。",
|
||||||
"invalid_choice": "選擇無效。請輸入 'Y' 或 'n'.",
|
"invalid_choice": "選擇無效。請輸入 'Y' 或 'n'.",
|
||||||
"development_version": "開發版本 {current} > {latest}"
|
"development_version": "開發版本 {current} > {latest}",
|
||||||
|
"changelog_title": "更新日志"
|
||||||
},
|
},
|
||||||
"totally_reset": {
|
"totally_reset": {
|
||||||
"title": "完全重置 Cursor",
|
"title": "完全重置 Cursor",
|
||||||
|
|||||||
37
main.py
37
main.py
@@ -317,6 +317,43 @@ def check_latest_version():
|
|||||||
if is_newer_version_available:
|
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}")
|
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
|
# Ask user if they want to update
|
||||||
while True:
|
while True:
|
||||||
choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('updater.update_confirm', choices='Y/n')}: {Style.RESET_ALL}").lower()
|
choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('updater.update_confirm', choices='Y/n')}: {Style.RESET_ALL}").lower()
|
||||||
|
|||||||
396
new_tempemail.py
396
new_tempemail.py
@@ -14,17 +14,8 @@ init()
|
|||||||
class NewTempEmail:
|
class NewTempEmail:
|
||||||
def __init__(self, translator=None):
|
def __init__(self, translator=None):
|
||||||
self.translator = translator
|
self.translator = translator
|
||||||
# Randomly choose between mail.tm and mail.gw
|
self.page = None
|
||||||
self.services = [
|
self.setup_browser()
|
||||||
{"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()
|
|
||||||
|
|
||||||
def get_blocked_domains(self):
|
def get_blocked_domains(self):
|
||||||
"""Get blocked domains list"""
|
"""Get blocked domains list"""
|
||||||
@@ -91,184 +82,132 @@ class NewTempEmail:
|
|||||||
|
|
||||||
return filtered_domains
|
return filtered_domains
|
||||||
|
|
||||||
def _generate_credentials(self):
|
|
||||||
"""generate random username and password"""
|
def get_extension_block(self):
|
||||||
username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10))
|
"""获取插件路径"""
|
||||||
password = ''.join(random.choices(string.ascii_letters + string.digits + string.punctuation, k=12))
|
root_dir = os.getcwd()
|
||||||
return username, password
|
extension_path = os.path.join(root_dir, "PBlock")
|
||||||
|
|
||||||
|
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:
|
||||||
|
extension_path = self.get_extension_block()
|
||||||
|
co.set_argument("--allow-extensions-in-incognito")
|
||||||
|
co.add_extension(extension_path)
|
||||||
|
except Exception as e:
|
||||||
|
if self.translator:
|
||||||
|
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.extension_load_error')}: {str(e)}{Style.RESET_ALL}")
|
||||||
|
else:
|
||||||
|
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):
|
def create_email(self):
|
||||||
"""create temporary email"""
|
"""创建临时邮箱"""
|
||||||
max_retries = 3 # Maximum number of retries
|
try:
|
||||||
attempt = 0 # Current attempt count
|
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}")
|
||||||
|
|
||||||
while attempt < max_retries:
|
# 加载被屏蔽域名列表
|
||||||
attempt += 1
|
self.blocked_domains = self.get_blocked_domains()
|
||||||
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:
|
self.page.get("https://smailpro.com/")
|
||||||
domains_response = requests.get(f"{self.api_url}/domains", timeout=10)
|
time.sleep(2)
|
||||||
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}")
|
create_button = self.page.ele('xpath://button[@title="Create temporary email"]')
|
||||||
|
if create_button:
|
||||||
|
create_button.click()
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
if not domains:
|
# 点击弹窗中的 Create 按钮
|
||||||
raise Exception(f"{self.translator.get('email.no_available_domains') if self.translator else '没有可用域名'}")
|
modal_create_button = self.page.ele('xpath://button[contains(text(), "Create")]')
|
||||||
except Exception as e:
|
if modal_create_button:
|
||||||
print(f"{Fore.RED}❌ 获取域名列表时出错: {str(e)}{Style.RESET_ALL}")
|
modal_create_button.click()
|
||||||
raise
|
time.sleep(2)
|
||||||
|
|
||||||
# Exclude blocked domains
|
# 获取邮箱地址 - 修改选择器
|
||||||
try:
|
email_div = self.page.ele('xpath://div[@class="text-base sm:text-lg md:text-xl text-gray-700"]')
|
||||||
filtered_domains = self.exclude_blocked_domains(domains)
|
if email_div:
|
||||||
if self.translator:
|
email = email_div.text.strip()
|
||||||
print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.domains_filtered', count=len(filtered_domains))}{Style.RESET_ALL}")
|
if '@' in email: # 验证是否是有效的邮箱地址
|
||||||
else:
|
# 检查域名是否被屏蔽
|
||||||
print(f"{Fore.CYAN}ℹ️ 过滤后剩余 {len(filtered_domains)} 个可用域名{Style.RESET_ALL}")
|
domain = email.split('@')[1]
|
||||||
|
if self.blocked_domains and domain in self.blocked_domains:
|
||||||
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:
|
if self.translator:
|
||||||
print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.switching_service', service=service['name'])}{Style.RESET_ALL}")
|
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.domain_blocked')}: {domain}{Style.RESET_ALL}")
|
||||||
else:
|
else:
|
||||||
print(f"{Fore.CYAN}ℹ️ 切换到 {service['name']} 服务{Style.RESET_ALL}")
|
print(f"{Fore.YELLOW}⚠️ 域名已被屏蔽: {domain},尝试重新创建邮箱{Style.RESET_ALL}")
|
||||||
return self.create_email() # Recursively call
|
# 重新创建邮箱
|
||||||
|
return self.create_email()
|
||||||
|
|
||||||
raise Exception(f"{self.translator.get('email.no_available_domains_after_filtering') if self.translator else '过滤后没有可用域名'}")
|
if self.translator:
|
||||||
except Exception as e:
|
print(f"{Fore.GREEN}✅ {self.translator.get('email.create_success')}: {email}{Style.RESET_ALL}")
|
||||||
print(f"{Fore.RED}❌ 过滤域名时出错: {str(e)}{Style.RESET_ALL}")
|
else:
|
||||||
raise
|
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
|
||||||
|
|
||||||
# Generate random username and password
|
except Exception as e:
|
||||||
try:
|
if self.translator:
|
||||||
username, password = self._generate_credentials()
|
print(f"{Fore.RED}❌ {self.translator.get('email.create_error')}: {str(e)}{Style.RESET_ALL}")
|
||||||
self.password = password
|
else:
|
||||||
|
print(f"{Fore.RED}❌ 创建邮箱出错: {str(e)}{Style.RESET_ALL}")
|
||||||
# Create email account
|
return None
|
||||||
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
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
if attempt < max_retries:
|
|
||||||
print(f"{Fore.YELLOW}⚠️ 尝试重新创建邮箱... (尝试 {attempt}/{max_retries}){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
|
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""close browser"""
|
"""关闭浏览器"""
|
||||||
if self.page:
|
if self.page:
|
||||||
self.page.quit()
|
self.page.quit()
|
||||||
|
|
||||||
def refresh_inbox(self):
|
def refresh_inbox(self):
|
||||||
"""refresh inbox"""
|
"""刷新邮箱"""
|
||||||
try:
|
try:
|
||||||
if self.translator:
|
if self.translator:
|
||||||
print(f"{Fore.CYAN}🔄 {self.translator.get('email.refreshing')}{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}🔄 {self.translator.get('email.refreshing')}{Style.RESET_ALL}")
|
||||||
else:
|
else:
|
||||||
print(f"{Fore.CYAN}🔄 正在刷新邮箱...{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}🔄 正在刷新邮箱...{Style.RESET_ALL}")
|
||||||
|
|
||||||
# Use API to get latest email
|
# 点击刷新按钮
|
||||||
headers = {"Authorization": f"Bearer {self.token}"}
|
refresh_button = self.page.ele('xpath://button[@id="refresh"]')
|
||||||
response = requests.get(f"{self.api_url}/messages", headers=headers)
|
if refresh_button:
|
||||||
|
refresh_button.click()
|
||||||
if response.status_code == 200:
|
time.sleep(2) # 等待刷新完成
|
||||||
if self.translator:
|
if self.translator:
|
||||||
print(f"{Fore.GREEN}✅ {self.translator.get('email.refresh_success')}{Style.RESET_ALL}")
|
print(f"{Fore.GREEN}✅ {self.translator.get('email.refresh_success')}{Style.RESET_ALL}")
|
||||||
else:
|
else:
|
||||||
@@ -276,9 +215,9 @@ class NewTempEmail:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
if self.translator:
|
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:
|
else:
|
||||||
print(f"{Fore.RED}❌ 刷新邮箱失败{Style.RESET_ALL}")
|
print(f"{Fore.RED}❌ 未找到刷新按钮{Style.RESET_ALL}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -289,26 +228,19 @@ class NewTempEmail:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def check_for_cursor_email(self):
|
def check_for_cursor_email(self):
|
||||||
"""Check if there is a Cursor verification email"""
|
"""检查是否有 Cursor 的验证邮件"""
|
||||||
try:
|
try:
|
||||||
# Use API to get email list
|
# 查找验证邮件 - 使用更精确的选择器
|
||||||
headers = {"Authorization": f"Bearer {self.token}"}
|
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"]]')
|
||||||
response = requests.get(f"{self.api_url}/messages", headers=headers)
|
if email_div:
|
||||||
|
if self.translator:
|
||||||
if response.status_code == 200:
|
print(f"{Fore.GREEN}✅ {self.translator.get('email.verification_found')}{Style.RESET_ALL}")
|
||||||
messages = response.json()["hydra:member"]
|
else:
|
||||||
for message in messages:
|
print(f"{Fore.GREEN}✅ 找到验证邮件{Style.RESET_ALL}")
|
||||||
if message["from"]["address"] == "no-reply@cursor.sh" and "Verify your email address" in message["subject"]:
|
# 使用 JavaScript 点击元素
|
||||||
# Get email content
|
self.page.run_js('arguments[0].click()', email_div)
|
||||||
message_id = message["id"]
|
time.sleep(2) # 等待邮件内容加载
|
||||||
message_response = requests.get(f"{self.api_url}/messages/{message_id}", headers=headers)
|
return True
|
||||||
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
|
|
||||||
|
|
||||||
if self.translator:
|
if self.translator:
|
||||||
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_not_found')}{Style.RESET_ALL}")
|
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_not_found')}{Style.RESET_ALL}")
|
||||||
else:
|
else:
|
||||||
@@ -322,75 +254,31 @@ class NewTempEmail:
|
|||||||
print(f"{Fore.RED}❌ 检查验证邮件出错: {str(e)}{Style.RESET_ALL}")
|
print(f"{Fore.RED}❌ 检查验证邮件出错: {str(e)}{Style.RESET_ALL}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def get_verification_code(self, max_retries=3):
|
def get_verification_code(self):
|
||||||
"""get verification code with retry mechanism"""
|
"""获取验证码"""
|
||||||
for attempt in range(1, max_retries + 1):
|
try:
|
||||||
try:
|
# 查找验证码元素
|
||||||
# Check if token is valid
|
code_element = self.page.ele('xpath://td//div[contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px")]')
|
||||||
if not self.token:
|
if code_element:
|
||||||
|
code = code_element.text.strip()
|
||||||
|
if code.isdigit() and len(code) == 6:
|
||||||
if self.translator:
|
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:
|
else:
|
||||||
print(f"{Fore.YELLOW}⚠️ 未获取到有效令牌,尝试重新创建邮箱... (尝试 {attempt}/{max_retries}){Style.RESET_ALL}")
|
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
|
||||||
|
|
||||||
# Try to recreate email
|
except Exception as e:
|
||||||
self.create_email()
|
if self.translator:
|
||||||
if not self.token:
|
print(f"{Fore.RED}❌ {self.translator.get('email.verification_code_error')}: {str(e)}{Style.RESET_ALL}")
|
||||||
continue # Skip to next attempt if still no token
|
else:
|
||||||
|
print(f"{Fore.RED}❌ 获取验证码出错: {str(e)}{Style.RESET_ALL}")
|
||||||
# Use API to get email list
|
return None
|
||||||
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
|
|
||||||
|
|
||||||
def main(translator=None):
|
def main(translator=None):
|
||||||
temp_email = NewTempEmail(translator)
|
temp_email = NewTempEmail(translator)
|
||||||
@@ -403,7 +291,7 @@ def main(translator=None):
|
|||||||
else:
|
else:
|
||||||
print(f"\n{Fore.CYAN}📧 临时邮箱地址: {email}{Style.RESET_ALL}")
|
print(f"\n{Fore.CYAN}📧 临时邮箱地址: {email}{Style.RESET_ALL}")
|
||||||
|
|
||||||
# Test refresh function
|
# 测试刷新功能
|
||||||
while True:
|
while True:
|
||||||
if translator:
|
if translator:
|
||||||
choice = input(f"\n{translator.get('email.refresh_prompt')}: ").lower()
|
choice = input(f"\n{translator.get('email.refresh_prompt')}: ").lower()
|
||||||
|
|||||||
Reference in New Issue
Block a user