diff --git a/account_sync.py b/account_sync.py index 719d4e6..9197a4f 100644 --- a/account_sync.py +++ b/account_sync.py @@ -13,9 +13,9 @@ from urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) class AccountSync: - def __init__(self, api_choice: int = 1, max_retries: int = 3, retry_delay: int = 5): + def __init__(self, max_retries: int = 3, retry_delay: int = 5): self.api_base_url = "https://cursorapi.nosqli.com/admin" # API地址写死 - self.api_choice = api_choice # 1=听泉助手池, 2=高质量号池 + self.max_retries = max_retries self.retry_delay = retry_delay @@ -28,9 +28,8 @@ class AccountSync: retry_count = 0 while retry_count < self.max_retries: try: - # 根据选择确定API端点 - endpoint = f"{self.api_base_url}/api.account/{'addpool' if self.api_choice == 2 else 'add'}" - logging.info(f"使用API端点: {endpoint}") + # 构建API请求 + endpoint = f"{self.api_base_url}/api.account/add" headers = { "Content-Type": "application/json", "Accept": "application/json" @@ -61,7 +60,6 @@ class AccountSync: "last_name": account_info.get("last_name", ""), "ip_address": proxy_host, "proxy_info": current_proxies, - "proxy_data": account_info.get("proxy_data", ""), "country": account_info.get("country", ""), "batch_index": account_info.get("batch_index", "") } diff --git a/browser_utils.py b/browser_utils.py index 88240bb..e0e5fa7 100644 --- a/browser_utils.py +++ b/browser_utils.py @@ -100,39 +100,25 @@ class BrowserManager: background_file.write(background_js) return plugin_folder - def get_proxy(self, use_api=False, mode=False, proxy_choice=None, custom_api=None): + def get_proxy(self, use_api=False, mode=False): """ 获取代理配置 Args: use_api: 是否使用API获取代理 mode: 如果开启 返回格式要改变成 host port username password - proxy_choice: 代理选择 (1=本地代理, 2=全局代理) - custom_api: 自定义代理API地址 Returns: str 或 tuple: 代理URL或(host, port, username, password)元组 """ - logging.info(f"获取代理配置, use_api={use_api}, mode={mode}, proxy_choice={proxy_choice}") + logging.info(f"获取代理配置, use_api={use_api}, mode={mode}") if use_api: try: # 从API获取代理 import requests logging.info("正在从API获取代理...") + response = requests.get("https://cursorapi.nosqli.com/admin/api.proxyinfo/getproxyarmybendi") + #response = requests.get("https://cursorapi.nosqli.com/admin/api.GlobalProxyip/get_proxy") + - # 根据选择使用不同的API - if custom_api: - api_url = custom_api - logging.info(f"使用自定义API: {api_url}") - elif proxy_choice == 1: - api_url = "https://cursorapi.nosqli.com/admin/api.proxyinfo/getproxyarmybendi" - logging.info("使用本地代理API") - elif proxy_choice == 2 or proxy_choice is None: # 如果未指定或选择全局代理 - api_url = "https://cursorapi.nosqli.com/admin/api.GlobalProxyip/get_proxy" - logging.info("使用全局代理API") - else: - logging.warning(f"未知的代理选择: {proxy_choice},使用cn代理") - api_url = "https://cursorapi.nosqli.com/admin/api.proxyinfo/getproxyarmybendi" - - response = requests.get(api_url) logging.info(f"API响应状态码: {response.status_code}") if response.status_code == 200: @@ -145,13 +131,12 @@ class BrowserManager: proxy_port = proxy_info.get("port") proxy_username = proxy_info.get("username", "") proxy_password = proxy_info.get("password", "") - proxy_data = proxy_info.get("proxy_data", "") logging.info(f"解析到代理信息 - host:{proxy_host}, port:{proxy_port}") if proxy_host and proxy_port: if mode: logging.info(f"使用API代理(mode=True): 返回元组格式") - return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data + return proxy_host, proxy_port, proxy_username, proxy_password else: proxy_url = f"http://{proxy_host}:{proxy_port}" logging.info(f"使用API代理: {proxy_url}") @@ -165,9 +150,8 @@ class BrowserManager: proxy_port = os.getenv("PROXY_PORT", PROXY_PORT) proxy_username = os.getenv("PROXY_USERNAME", PROXY_USERNAME ) proxy_password = os.getenv("PROXY_PASSWORD", PROXY_PASSWORD) - proxy_data = os.getenv("PROXY_DATA", "") logging.info(f"使用默认代理信息(mode=True): host={proxy_host}, port={proxy_port}") - return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data + return proxy_host, proxy_port, proxy_username, proxy_password else: default_proxy = os.getenv("BROWSER_PROXY", PROXY_URL) logging.info(f"使用默认代理: {default_proxy}") @@ -181,9 +165,8 @@ class BrowserManager: proxy_port = os.getenv("PROXY_PORT", PROXY_PORT) proxy_username = os.getenv("PROXY_USERNAME", PROXY_USERNAME) proxy_password = os.getenv("PROXY_PASSWORD", PROXY_PASSWORD) - proxy_data = os.getenv("PROXY_DATA", "") logging.info(f"异常情况下使用默认代理信息(mode=True)") - return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data + return proxy_host, proxy_port, proxy_username, proxy_password else: default_proxy = os.getenv("BROWSER_PROXY", PROXY_URL) logging.info(f"使用默认代理: {default_proxy}") @@ -195,81 +178,38 @@ class BrowserManager: proxy_port = os.getenv("PROXY_PORT", PROXY_PORT) proxy_username = os.getenv("PROXY_USERNAME", PROXY_USERNAME) proxy_password = os.getenv("PROXY_PASSWORD", PROXY_PASSWORD) - proxy_data = os.getenv("PROXY_DATA", "") logging.info(f"不使用API,返回默认代理信息(mode=True)") - return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data + return proxy_host, proxy_port, proxy_username, proxy_password else: default_proxy = os.getenv("BROWSER_PROXY", PROXY_URL) logging.info(f"不使用API,直接返回默认代理: {default_proxy}") return default_proxy - def get_plugin_folder(self): - """获取代理插件文件夹路径""" - # 使用当前目录下的kdl_Chromium_Proxy文件夹 - current_directory = os.path.dirname(os.path.abspath(__file__)) - plugin_folder = os.path.join(current_directory, 'kdl_Chromium_Proxy') - - # 确保文件夹存在 - if not os.path.exists(plugin_folder): - os.makedirs(plugin_folder) + def init_browser(self, user_agent=None): + """ + 初始化浏览器 + Args: + user_agent: 用户代理字符串 + Returns: + tuple: (browser实例, 代理信息元组(host, port, username, password)) + """ + logging.info("正在初始化浏览器...") - logging.info(f"代理插件文件夹路径: {plugin_folder}") - return plugin_folder - - def init_browser(self, user_agent=None, proxy_choice=None, custom_api=None): - """ - 初始化浏览器实例 - Args: - user_agent: 自定义User-Agent - proxy_choice: 代理选择 (1=本地代理, 2=全局代理) - custom_api: 自定义代理API地址 - Returns: - tuple: (browser实例, 代理信息元组) - """ - try: - # 获取代理配置 - proxy_info = self.get_proxy(use_api=True, mode=True, proxy_choice=proxy_choice, custom_api=custom_api) - proxy_host, proxy_port, proxy_username, proxy_password, proxy_data = proxy_info + co = self._get_browser_options(user_agent) - # 创建代理认证插件 - plugin_folder = self.create_proxyauth_extension( - proxy_host=proxy_host, - proxy_port=proxy_port, - proxy_username=proxy_username, - proxy_password=proxy_password - ) - - # 设置浏览器选项 - co = ChromiumOptions() - co.set_argument("--hide-crash-restore-bubble") - co.set_pref("credentials_enable_service", False) - - # 添加代理插件 - co.add_extension(plugin_folder) - - # 设置用户代理 - if user_agent: - co.set_user_agent(user_agent) - - # 设置无头模式 - co.headless(True) - - # Mac系统特殊处理 - if sys.platform == "darwin": - co.set_argument("--no-sandbox") - co.set_argument("--disable-gpu") - - # 创建浏览器实例 - browser = Chromium(co) - self.browser = browser - self.current_proxy_info = proxy_info - - logging.info("浏览器实例创建成功") - return browser, proxy_info - - except Exception as e: - logging.error(f"初始化浏览器失败: {str(e)}") - raise + logging.info("正在启动临时浏览器...") + try: + browser = Chromium(co) + self.browser = browser + logging.info("浏览器初始化成功") + # 返回浏览器实例和代理信息 + return browser, self.current_proxy_info + except Exception as e: + logging.error(f"浏览器初始化失败: {str(e)}") + if "DevToolsActivePort file doesn't exist" in str(e): + logging.error("可能是Chrome实例未正确关闭,请检查进程") + raise + def _get_browser_options(self, user_agent=None): """获取浏览器配置""" diff --git a/cursor_pro_register.py b/cursor_pro_register.py index 47039f9..6780c37 100644 --- a/cursor_pro_register.py +++ b/cursor_pro_register.py @@ -465,21 +465,14 @@ class EmailGenerator: } -def get_user_agent(proxy_choice=None, custom_api=None): - """获取user_agent - Args: - proxy_choice: 代理选择 (1=本地代理, 2=全局代理) - custom_api: 自定义代理API地址 - """ +def get_user_agent(): + """获取user_agent""" browser_manager = None try: # 使用JavaScript获取user agent logging.info("初始化临时浏览器以获取User-Agent...") browser_manager = BrowserManager() - browser, proxy_info = browser_manager.init_browser( - proxy_choice=proxy_choice, - custom_api=custom_api - ) + browser, proxy_info = browser_manager.init_browser() user_agent = browser.latest_tab.run_js("return navigator.userAgent") logging.info(f"获取到User-Agent: {user_agent}") proxy_host, proxy_port, proxy_username, proxy_password = proxy_info @@ -512,55 +505,10 @@ def print_end_message(): if __name__ == "__main__": print_logo() browser_manager = None - + account_sync = AccountSync() try: logging.info("\n=== 初始化程序 ===") - - # 选择账号同步API - print("\n请选择账号同步API:") - print("1. 听泉助手池") - print("2. 高质量号池") - - while True: - try: - sync_api_choice = int(input("请输入选项 (1 或 2): ").strip()) - if sync_api_choice in [1, 2]: - break - else: - print("无效的选项,请重新输入") - except ValueError: - print("请输入有效的数字") - - # 根据选择创建AccountSync实例 - account_sync = AccountSync(api_choice=sync_api_choice) - - # 选择代理模式 - print("\n请选择代理模式:") - print("1. 本地代理") - print("2. 全局代理") - print("3. 自定义代理API") - - while True: - try: - proxy_choice = int(input("请输入选项 (1、2 或 3): ").strip()) - if proxy_choice in [1, 2, 3]: - break - else: - print("无效的选项,请重新输入") - except ValueError: - print("请输入有效的数字") - - # 如果选择自定义API,获取API地址 - custom_api = None - if proxy_choice == 3: - custom_api = input("请输入自定义代理API地址: ").strip() - if not custom_api: - print("API地址不能为空,将使用默认全局代理") - proxy_choice = 2 - - # 将代理选择保存为全局变量,供后续使用 - global_proxy_choice = proxy_choice - global_custom_api = custom_api + # 提示用户选择操作模式 print("\n请选择操作模式:") @@ -599,8 +547,8 @@ if __name__ == "__main__": logging.info("正在初始化浏览器...") - # 获取user_agent,传递代理选择参数 - user_agent = get_user_agent(proxy_choice=global_proxy_choice, custom_api=global_custom_api) + # 获取user_agent + user_agent = get_user_agent() if not user_agent: logging.error("获取user agent失败,使用默认值") user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" @@ -696,20 +644,14 @@ if __name__ == "__main__": logging.info("创建新的浏览器实例...") browser_manager = BrowserManager() - # 使用选择的代理模式初始化浏览器 - browser, proxy_info = browser_manager.init_browser( - user_agent, - proxy_choice=global_proxy_choice, - custom_api=global_custom_api - ) + browser, proxy_info = browser_manager.init_browser(user_agent) - proxy_host, proxy_port, proxy_username, proxy_password, proxy_data = proxy_info + proxy_host, proxy_port, proxy_username, proxy_password = proxy_info current_proxies = { 'http': f'http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}', 'https': f'http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}' } logging.info(f"API将使用相同代理: {proxy_host}:{proxy_port}") - logging.info(f"API将使用相同代理: {proxy_data}") # 生成邮箱 email_generator = EmailGenerator(selected_domain=selected_domain) # 传递选定的域名 @@ -735,61 +677,59 @@ if __name__ == "__main__": timeout_accounts += 1 continue - # 执行注册流程 - registration_result = sign_up_account(browser, tab, registration_start_time) - if not registration_result: - logging.warning("注册过程失败或超时,跳过当前账号,继续下一个...") - continue + if sign_up_account(browser, tab, registration_start_time): + # 检查是否超时 + if check_timeout(registration_start_time): + logging.warning("放弃当前注册,继续下一个账号") + timeout_accounts += 1 + continue + + logging.info("正在获取会话令牌...") + token = get_cursor_session_token(tab, start_time=registration_start_time) + if token: + # 检查是否超时 + if check_timeout(registration_start_time): + logging.warning("放弃当前注册,继续下一个账号") + timeout_accounts += 1 + continue + + logging.info("更新认证信息...") + + logging.info("重置机器码...") - # 检查是否超时 - if check_timeout(registration_start_time): - logging.warning("放弃当前注册,继续下一个账号") - timeout_accounts += 1 - continue - - logging.info("正在获取会话令牌...") - token = get_cursor_session_token(tab, start_time=registration_start_time) - if not token: - logging.error("获取会话令牌失败,跳过当前注册,继续下一个账号...") - continue + + + logging.info(f"API将使用相同代理: {proxy_host}:{proxy_port}") - # 检查是否超时 - if check_timeout(registration_start_time): - logging.warning("放弃当前注册,继续下一个账号") - timeout_accounts += 1 - continue - - logging.info("更新认证信息...") - logging.info("重置机器码...") - - logging.info(f"API将使用相同代理: {proxy_host}:{proxy_port}") + # 保存成功注册的账号信息 + account_data = { + "email": account, + "password": password, + "token": token, + "register_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "first_name": first_name, + "last_name": last_name, + 'user_agent': user_agent, + 'proxy_host': proxy_host, + 'proxy_port': proxy_port, + 'proxy_username': proxy_username, + 'proxy_password': proxy_password + } - # 保存成功注册的账号信息 - account_data = { - "email": account, - "password": password, - "token": token, - "register_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "first_name": first_name, - "last_name": last_name, - 'user_agent': user_agent, - 'proxy_host': proxy_host, - 'proxy_port': proxy_port, - 'proxy_username': proxy_username, - 'proxy_password': proxy_password, - 'proxy_data': proxy_data - } - - logging.info("更新认证信息...") - - # 添加到成功账号列表 - successful_accounts.append(account_data) - - # # 同步到服务器 - if account_sync.sync_account(account_data): - logging.info("账号已成功同步到服务器") - else: - logging.warning("账号同步到服务器失败") + logging.info("更新认证信息...") + + # 添加到成功账号列表 + successful_accounts.append(account_data) + + # # 同步到服务器 + if account_sync.sync_account(account_data): + logging.info("账号已成功同步到服务器") + else: + logging.warning("账号同步到服务器失败") + + + else: + logging.error("获取会话令牌失败,注册流程未完成") # 计算本次注册用时 registration_elapsed = time.time() - registration_start_time diff --git a/kdl_Chromium_Proxy/background.js b/kdl_Chromium_Proxy/background.js index f3a5c77..8aaf2f1 100644 --- a/kdl_Chromium_Proxy/background.js +++ b/kdl_Chromium_Proxy/background.js @@ -4,8 +4,8 @@ rules: { singleProxy: { scheme: "http", - host: "60.188.78.8", - port: parseInt(20138) + host: "60.188.79.117", + port: parseInt(20162) }, bypassList: [] }