从API密钥管理服务获取API密钥,失败时使用备用方案 Args: source_name (str): 源名称 Returns: str: API密钥 Raises: Exception: 如果主备用方案都无法获取API密钥
(source_name)
| 57 | |
| 58 | @staticmethod |
| 59 | def get_api_key(source_name): |
| 60 | """从API密钥管理服务获取API密钥,失败时使用备用方案 |
| 61 | |
| 62 | Args: |
| 63 | source_name (str): 源名称 |
| 64 | |
| 65 | Returns: |
| 66 | str: API密钥 |
| 67 | |
| 68 | Raises: |
| 69 | Exception: 如果主备用方案都无法获取API密钥 |
| 70 | """ |
| 71 | logger = logging.getLogger(__name__) |
| 72 | # 防止日志向上传播,避免重复打印 |
| 73 | logger.propagate = False |
| 74 | |
| 75 | try: |
| 76 | # 优先尝试调用API密钥管理服务API |
| 77 | response = requests.post( |
| 78 | f"{API_KEY_MANAGER_URL}{API_KEY_MANAGER_GET_ENDPOINT}", |
| 79 | json={"source_name": source_name}, |
| 80 | timeout=INNER_TIMEOUT |
| 81 | ) |
| 82 | |
| 83 | if response.status_code == 200: |
| 84 | result = response.json() |
| 85 | logger.info(f"成功从API密钥管理服务获取 {source_name} 的API密钥") |
| 86 | return result["api_key"] |
| 87 | else: |
| 88 | # 如果API调用失败,记录警告并尝试备用方案 |
| 89 | logger.warning(f"API密钥服务返回错误状态码: {response.status_code},尝试使用备用方案") |
| 90 | raise Exception(f"API service returned status code: {response.status_code}") |
| 91 | |
| 92 | except Exception as e: |
| 93 | # 连接失败时,尝试使用备用方案:从pool_mapping中获取API密钥 |
| 94 | logger.warning(f"无法连接到API密钥管理服务 (已离线): {str(e)},使用兜底离线配获取API密钥") |
| 95 | |
| 96 | try: |
| 97 | if source_name not in pool_mapping: |
| 98 | raise ValueError(f"兜底离线配中未找到源 '{source_name}' 的配置") |
| 99 | |
| 100 | source_pool = pool_mapping[source_name] |
| 101 | if not source_pool: |
| 102 | raise ValueError(f"源 '{source_name}' 的API密钥池为空") |
| 103 | |
| 104 | # 从所有账户的所有API密钥中随机选择一个 |
| 105 | all_api_keys = [] |
| 106 | for account, keys in source_pool.items(): |
| 107 | for key_info in keys: |
| 108 | if "api_key" in key_info: |
| 109 | all_api_keys.append(key_info["api_key"]) |
| 110 | |
| 111 | if not all_api_keys: |
| 112 | raise ValueError(f"源 '{source_name}' 的兜底离线配中没有有效的API密钥") |
| 113 | |
| 114 | selected_api_key = random.choice(all_api_keys) |
| 115 | logger.warning(f"使用兜底离线配置为源 '{source_name}' 随机选择了一个API密钥") |
| 116 | return selected_api_key |
no outgoing calls