# 推荐服务 API Key 修复说明 ## 问题描述 推荐服务(`recommendations_main.py`)仍然在使用真实的 API key,导致可能使用错误的账户(如 account_id=2)进行下单。 ## 根本原因 1. **推荐服务不应该使用任何账户的 API key**:推荐服务只需要获取公开行情数据,不需要认证。 2. **`config.py` 在导入时会读取 `ATS_ACCOUNT_ID`**:如果推荐服务的 supervisor 配置中设置了 `ATS_ACCOUNT_ID=2`,那么 `config.py` 会读取 account_id=2 的 API key。 3. **`BinanceClient.__init__` 可能被覆盖**:即使传入空字符串,如果 `config._config_manager` 存在,可能会在某个地方被覆盖。 ## 修复方案 ### 1. 修复 `BinanceClient.__init__` 逻辑 确保传入空字符串时不会被 config 覆盖: ```python # 如果传入的是空字符串,保持为空字符串(不覆盖) # 这样推荐服务可以使用空字符串来明确表示"只使用公开接口" ``` ### 2. 修复 `connect` 方法 当 API key 为空时,跳过权限验证: ```python # 验证API密钥权限(仅当提供了有效的 API key 时) if self.api_key and self.api_secret: await self._verify_api_permissions() else: logger.info("✓ 使用公开 API,跳过权限验证(只能获取行情数据)") ``` ### 3. 在推荐服务中添加验证 在 `recommendations_main.py` 中添加验证逻辑,确保 API key 确实是空的: ```python # 验证:确保 API key 确实是空的 if client.api_key: logger.error(f"❌ 推荐服务 API Key 非空!当前值: {client.api_key[:4]}...") logger.error(" 这可能导致推荐服务使用错误的账户密钥,请检查 BinanceClient.__init__ 逻辑") else: logger.info("✓ 推荐服务 API Key 确认为空,将只使用公开接口") ``` ## 检查清单 1. ✅ 确保 `recommendations_main.py` 传入空字符串:`BinanceClient(api_key="", api_secret="")` 2. ✅ 确保 `BinanceClient.__init__` 不会覆盖空字符串 3. ✅ 确保 `connect` 方法在 API key 为空时跳过权限验证 4. ✅ 在推荐服务中添加验证逻辑,确保 API key 确实是空的 ## 验证方法 1. 查看推荐服务的日志,确认显示: - `✓ 推荐服务 API Key 确认为空,将只使用公开接口` - `✓ 使用公开 API,跳过权限验证(只能获取行情数据)` 2. 如果看到以下日志,说明仍有问题: - `❌ 推荐服务 API Key 非空!` - `初始化币安客户端: gqtx...sYmj, l3IB...I6NA`(显示真实的 API key) ## 注意事项 1. **推荐服务不应该设置 `ATS_ACCOUNT_ID`**:推荐服务的 supervisor 配置不应该设置 `ATS_ACCOUNT_ID`,或者应该明确设置为空。 2. **推荐服务不应该下单**:推荐服务只生成推荐,不应该进行任何下单操作。 3. **如果推荐服务仍然使用真实的 API key**:检查 supervisor 配置,确保推荐服务进程没有设置 `ATS_ACCOUNT_ID`。 ## 后续优化 1. 考虑在 `config.py` 中添加一个标志,区分推荐服务和交易服务。 2. 考虑在推荐服务启动时,明确清除 `ATS_ACCOUNT_ID` 环境变量。