This commit is contained in:
薇薇安 2026-01-24 11:00:32 +08:00
parent b01920cadf
commit f7c68efb3e
2 changed files with 24 additions and 4 deletions

View File

@ -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密钥权限
# 验证API密钥权限仅当提供了有效的 API key 时)
if self.api_key and self.api_secret:
await self._verify_api_permissions()
else:
logger.info("✓ 使用公开 API跳过权限验证只能获取行情数据")
# 预热读取持仓模式(避免首次下单时才触发 -4061
try:

View File

@ -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)