mirror of
https://github.com/yeongpin/cursor-free-vip.git
synced 2025-08-02 20:47:35 +08:00
Merge pull request #836 from cjahv/main
新增 AccountManager 类,支持推荐邮箱及账户信息统一保存
This commit is contained in:
commit
849de8fac2
97
account_manager.py
Normal file
97
account_manager.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
import os
|
||||||
|
from colorama import Fore, Style
|
||||||
|
import re
|
||||||
|
|
||||||
|
# Define emoji constants
|
||||||
|
EMOJI = {
|
||||||
|
'SUCCESS': '✅',
|
||||||
|
'ERROR': '❌',
|
||||||
|
'INFO': 'ℹ️'
|
||||||
|
}
|
||||||
|
|
||||||
|
class AccountManager:
|
||||||
|
def __init__(self, translator=None):
|
||||||
|
self.translator = translator
|
||||||
|
self.accounts_file = 'cursor_accounts.txt'
|
||||||
|
|
||||||
|
def save_account_info(self, email, password, token, total_usage):
|
||||||
|
"""Save account information to file"""
|
||||||
|
try:
|
||||||
|
with open(self.accounts_file, 'a', encoding='utf-8') as f:
|
||||||
|
f.write(f"\n{'='*50}\n")
|
||||||
|
f.write(f"Email: {email}\n")
|
||||||
|
f.write(f"Password: {password}\n")
|
||||||
|
f.write(f"Token: {token}\n")
|
||||||
|
f.write(f"Usage Limit: {total_usage}\n")
|
||||||
|
f.write(f"{'='*50}\n")
|
||||||
|
|
||||||
|
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.account_info_saved') if self.translator else 'Account information saved'}...{Style.RESET_ALL}")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
error_msg = self.translator.get('register.save_account_info_failed', error=str(e)) if self.translator else f'Failed to save account information: {str(e)}'
|
||||||
|
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_last_email_domain(self):
|
||||||
|
"""Get the domain from the last used email"""
|
||||||
|
try:
|
||||||
|
if not os.path.exists(self.accounts_file):
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Only read the last 1KB of data from the file
|
||||||
|
with open(self.accounts_file, 'rb') as f:
|
||||||
|
# Get file size
|
||||||
|
f.seek(0, os.SEEK_END)
|
||||||
|
file_size = f.tell()
|
||||||
|
|
||||||
|
if file_size == 0:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Determine the number of bytes to read, maximum 1KB
|
||||||
|
read_size = min(1024, file_size)
|
||||||
|
|
||||||
|
# Move to the appropriate position to start reading
|
||||||
|
f.seek(file_size - read_size)
|
||||||
|
|
||||||
|
# Read the end data
|
||||||
|
data = f.read(read_size).decode('utf-8', errors='ignore')
|
||||||
|
|
||||||
|
# Split by lines and search in reverse
|
||||||
|
lines = data.split('\n')
|
||||||
|
for line in reversed(lines):
|
||||||
|
if line.strip().startswith('Email:'):
|
||||||
|
email = line.split('Email:')[1].strip()
|
||||||
|
# Extract domain part (after @)
|
||||||
|
if '@' in email:
|
||||||
|
return email.split('@')[1]
|
||||||
|
return None
|
||||||
|
|
||||||
|
# If no email is found in the last 1KB
|
||||||
|
return None
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
error_msg = self.translator.get('account.get_last_email_domain_failed', error=str(e)) if self.translator else f'Failed to get the last used email domain: {str(e)}'
|
||||||
|
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def suggest_email(self, first_name, last_name):
|
||||||
|
"""Generate a suggested email based on first and last name with the last used domain"""
|
||||||
|
try:
|
||||||
|
# Get the last used email domain
|
||||||
|
domain = self.get_last_email_domain()
|
||||||
|
if not domain:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Generate email prefix from first and last name (lowercase)
|
||||||
|
email_prefix = f"{first_name.lower()}.{last_name.lower()}"
|
||||||
|
|
||||||
|
# Combine prefix and domain
|
||||||
|
suggested_email = f"{email_prefix}@{domain}"
|
||||||
|
|
||||||
|
return suggested_email
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
error_msg = self.translator.get('account.suggest_email_failed', error=str(e)) if self.translator else f'Failed to suggest email: {str(e)}'
|
||||||
|
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
|
||||||
|
return None
|
@ -7,6 +7,7 @@ from cursor_auth import CursorAuth
|
|||||||
from reset_machine_manual import MachineIDResetter
|
from reset_machine_manual import MachineIDResetter
|
||||||
from get_user_token import get_token_from_cookie
|
from get_user_token import get_token_from_cookie
|
||||||
from config import get_config
|
from config import get_config
|
||||||
|
from account_manager import AccountManager
|
||||||
|
|
||||||
os.environ["PYTHONVERBOSE"] = "0"
|
os.environ["PYTHONVERBOSE"] = "0"
|
||||||
os.environ["PYINSTALLER_VERBOSE"] = "0"
|
os.environ["PYINSTALLER_VERBOSE"] = "0"
|
||||||
@ -67,11 +68,28 @@ class CursorRegistration:
|
|||||||
def setup_email(self):
|
def setup_email(self):
|
||||||
"""Setup Email"""
|
"""Setup Email"""
|
||||||
try:
|
try:
|
||||||
|
# Try to get a suggested email
|
||||||
|
account_manager = AccountManager(self.translator)
|
||||||
|
suggested_email = account_manager.suggest_email(self.first_name, self.last_name)
|
||||||
|
|
||||||
|
if suggested_email:
|
||||||
|
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.suggest_email', suggested_email=suggested_email) if self.translator else f'Suggested email: {suggested_email}'}")
|
||||||
|
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.use_suggested_email_or_enter') if self.translator else 'Type "yes" to use this email or enter your own email:'}")
|
||||||
|
user_input = input().strip()
|
||||||
|
|
||||||
|
if user_input.lower() == 'yes' or user_input.lower() == 'y':
|
||||||
|
self.email_address = suggested_email
|
||||||
|
else:
|
||||||
|
# User input is their own email address
|
||||||
|
self.email_address = user_input
|
||||||
|
else:
|
||||||
|
# If there's no suggested email
|
||||||
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.manual_email_input') if self.translator else 'Please enter your email address:'}")
|
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.manual_email_input') if self.translator else 'Please enter your email address:'}")
|
||||||
self.email_address = input().strip()
|
self.email_address = input().strip()
|
||||||
|
|
||||||
|
# Validate if the email is valid
|
||||||
if '@' not in self.email_address:
|
if '@' not in self.email_address:
|
||||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_email') if self.translator else '无效的邮箱地址'}{Style.RESET_ALL}")
|
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_email') if self.translator else 'Invalid email address'}{Style.RESET_ALL}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.email_address')}: {self.email_address}" + "\n" + f"{Style.RESET_ALL}")
|
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.email_address')}: {self.email_address}" + "\n" + f"{Style.RESET_ALL}")
|
||||||
@ -88,7 +106,7 @@ class CursorRegistration:
|
|||||||
code = input().strip()
|
code = input().strip()
|
||||||
|
|
||||||
if not code.isdigit() or len(code) != 6:
|
if not code.isdigit() or len(code) != 6:
|
||||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_code') if self.translator else '无效的验证码'}{Style.RESET_ALL}")
|
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_code') if self.translator else 'Invalid verification code'}{Style.RESET_ALL}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return code
|
return code
|
||||||
@ -224,17 +242,12 @@ class CursorRegistration:
|
|||||||
if not resetter.reset_machine_ids(): # Call reset_machine_ids method directly
|
if not resetter.reset_machine_ids(): # Call reset_machine_ids method directly
|
||||||
raise Exception("Failed to reset machine ID")
|
raise Exception("Failed to reset machine ID")
|
||||||
|
|
||||||
# Save account information to file
|
# Save account information to file using AccountManager
|
||||||
with open('cursor_accounts.txt', 'a', encoding='utf-8') as f:
|
account_manager = AccountManager(self.translator)
|
||||||
f.write(f"\n{'='*50}\n")
|
if account_manager.save_account_info(self.email_address, self.password, token, total_usage):
|
||||||
f.write(f"Email: {self.email_address}\n")
|
|
||||||
f.write(f"Password: {self.password}\n")
|
|
||||||
f.write(f"Token: {token}\n")
|
|
||||||
f.write(f"Usage Limit: {total_usage}\n")
|
|
||||||
f.write(f"{'='*50}\n")
|
|
||||||
|
|
||||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.account_info_saved')}...{Style.RESET_ALL}")
|
|
||||||
return True
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.save_account_info_failed', error=str(e))}{Style.RESET_ALL}")
|
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.save_account_info_failed', error=str(e))}{Style.RESET_ALL}")
|
||||||
|
@ -191,6 +191,8 @@
|
|||||||
"setting_password": "Setting Password",
|
"setting_password": "Setting Password",
|
||||||
"manual_code_input": "Manual Code Input",
|
"manual_code_input": "Manual Code Input",
|
||||||
"manual_email_input": "Manual Email Input",
|
"manual_email_input": "Manual Email Input",
|
||||||
|
"suggest_email": "Suggested email: {suggested_email}",
|
||||||
|
"use_suggested_email_or_enter": "Type \"yes\" to use this email or enter your own email:",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"first_name": "First Name",
|
"first_name": "First Name",
|
||||||
"last_name": "Last Name",
|
"last_name": "Last Name",
|
||||||
|
@ -191,6 +191,8 @@
|
|||||||
"setting_password": "设置密码",
|
"setting_password": "设置密码",
|
||||||
"manual_code_input": "手动输入验证码",
|
"manual_code_input": "手动输入验证码",
|
||||||
"manual_email_input": "手动输入邮箱",
|
"manual_email_input": "手动输入邮箱",
|
||||||
|
"suggest_email": "推荐邮箱地址: {suggested_email}",
|
||||||
|
"use_suggested_email_or_enter": "输入\"yes\"使用此邮箱或直接输入您想使用的邮箱地址:",
|
||||||
"password": "密码",
|
"password": "密码",
|
||||||
"first_name": "名字",
|
"first_name": "名字",
|
||||||
"last_name": "姓氏",
|
"last_name": "姓氏",
|
||||||
|
@ -188,6 +188,8 @@
|
|||||||
"setting_password": "設置密碼",
|
"setting_password": "設置密碼",
|
||||||
"manual_code_input": "手動輸入驗證碼",
|
"manual_code_input": "手動輸入驗證碼",
|
||||||
"manual_email_input": "手動輸入郵箱地址",
|
"manual_email_input": "手動輸入郵箱地址",
|
||||||
|
"suggest_email": "推薦郵箱地址: {suggested_email}",
|
||||||
|
"use_suggested_email_or_enter": "輸入\"yes\"使用此郵箱或直接輸入您想使用的郵箱地址:",
|
||||||
"password": "密碼",
|
"password": "密碼",
|
||||||
"first_name": "名字",
|
"first_name": "名字",
|
||||||
"last_name": "姓氏",
|
"last_name": "姓氏",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user