# 推荐服务 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` 环境变量。
