From f7c68efb3eb4cff73e62f4e45f9c80aaacba1388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sat, 24 Jan 2026 11:00:32 +0800 Subject: [PATCH] a --- trading_system/binance_client.py | 19 +++++++++++++++---- trading_system/recommendations_main.py | 9 +++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index 1b59032..67b0460 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -31,11 +31,12 @@ class BinanceClient: testnet: 是否使用测试网(如果为None,从config读取) """ # 记录是否明确传入了 api_key 和 api_secret(用于后续判断是否应该从 config 刷新) + # 注意:空字符串 "" 也被视为明确传入(用于推荐服务等只需要公开数据的场景) self._explicit_api_key = api_key is not None self._explicit_api_secret = api_secret is not None - # 如果未提供参数,从config读取(确保使用最新值) - # 注意:如果明确传递了 api_key 和 api_secret,应该使用传递的值,而不是从 config 读取 + # 如果未提供参数(None),从config读取(确保使用最新值) + # 注意:如果明确传递了 api_key 和 api_secret(包括空字符串),应该使用传递的值,而不是从 config 读取 if api_key is None: # 尝试从配置管理器直接获取 if config._config_manager: @@ -46,6 +47,8 @@ class BinanceClient: # 如果还是None,使用config模块的值 if not api_key: api_key = config.BINANCE_API_KEY + # 如果传入的是空字符串,保持为空字符串(不覆盖) + # 这样推荐服务可以使用空字符串来明确表示"只使用公开接口" if api_secret is None: # 尝试从配置管理器直接获取 @@ -57,6 +60,7 @@ class BinanceClient: # 如果还是None,使用config模块的值 if not api_secret: api_secret = config.BINANCE_API_SECRET + # 如果传入的是空字符串,保持为空字符串(不覆盖) if testnet is None: testnet = config.USE_TESTNET @@ -72,6 +76,10 @@ class BinanceClient: else: logger.warning("BinanceClient.__init__: API Key 为空!") + # 如果传入的是空字符串,确保不会被覆盖(用于推荐服务等场景) + if self._explicit_api_key and not api_key: + logger.info("BinanceClient.__init__: 明确传入空 API Key(推荐服务模式:只使用公开接口)") + # 初始化 Redis 缓存(必须在 __init__ 中初始化,不能依赖 _refresh_api_credentials) try: self.redis_cache = RedisCache( @@ -190,8 +198,11 @@ class BinanceClient: # 连接 Redis 缓存 await self.redis_cache.connect() - # 验证API密钥权限 - await self._verify_api_permissions() + # 验证API密钥权限(仅当提供了有效的 API key 时) + if self.api_key and self.api_secret: + await self._verify_api_permissions() + else: + logger.info("✓ 使用公开 API,跳过权限验证(只能获取行情数据)") # 预热读取持仓模式(避免首次下单时才触发 -4061) try: diff --git a/trading_system/recommendations_main.py b/trading_system/recommendations_main.py index 7f0c84f..880cdd3 100644 --- a/trading_system/recommendations_main.py +++ b/trading_system/recommendations_main.py @@ -128,8 +128,17 @@ async def main(): try: # 推荐服务不需要特定账户的 API 密钥,只需要获取行情数据 # 使用空 API 密钥(公开接口)或使用只读权限的密钥 + # 重要:推荐服务不应该读取任何 account_id 的 API key,即使环境变量设置了 ATS_ACCOUNT_ID logger.info("推荐服务初始化(不依赖特定账户,只获取行情数据)") + logger.info("推荐服务明确使用空 API Key,确保不会读取任何账户的密钥") + # 使用空字符串明确表示"只使用公开接口",不会被 config 覆盖 client = BinanceClient(api_key="", api_secret="") # 使用空密钥,只获取公开行情 + # 验证:确保 API key 确实是空的 + if client.api_key: + logger.error(f"❌ 推荐服务 API Key 非空!当前值: {client.api_key[:4]}...{client.api_key[-4:] if len(client.api_key) > 8 else ''}") + logger.error(" 这可能导致推荐服务使用错误的账户密钥,请检查 BinanceClient.__init__ 逻辑") + else: + logger.info("✓ 推荐服务 API Key 确认为空,将只使用公开接口") await client.connect() scanner = MarketScanner(client)