#!/usr/bin/env python3 """ 查询阿里云账号信息 通过 AccessKey 获取账号详情和权限信息 """ import os import sys from dotenv import load_dotenv # 加载环境变量 load_dotenv() def check_account_info(): """检查阿里云账号信息""" try: import oss2 from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest # 从环境变量读取配置 access_key_id = os.getenv('ALIYUN_OSS_ACCESS_KEY_ID') access_key_secret = os.getenv('ALIYUN_OSS_ACCESS_KEY_SECRET') print(f"🔍 查询阿里云账号信息...") print(f" AccessKeyId: {access_key_id}") if not access_key_id or not access_key_secret: print("❌ AccessKey 配置不完整") return False # 方法1: 通过 OSS 获取账号信息 try: auth = oss2.Auth(access_key_id, access_key_secret) # 尝试列出所有 Bucket(这会显示账号ID) service = oss2.Service(auth, 'https://oss-cn-hangzhou.aliyuncs.com') print(f"\n📋 尝试列出该账号下的所有 Bucket...") buckets = service.list_buckets() if buckets.buckets: print(f"✅ 找到 {len(buckets.buckets)} 个 Bucket:") for bucket in buckets.buckets: print(f" - {bucket.name} (区域: {bucket.location}, 创建时间: {bucket.creation_date})") # 检查是否有 nvlovers if bucket.name == 'nvlovers': print(f" ✅ 找到目标 Bucket: nvlovers") return True print(f"\n❌ 未找到 'nvlovers' Bucket") print(f"💡 建议使用上述任一 Bucket,或创建新的 Bucket") else: print(f"❌ 该账号下没有任何 Bucket") except Exception as e: print(f"❌ OSS 查询失败: {e}") # 分析错误类型 error_str = str(e) if "InvalidAccessKeyId" in error_str: print("💡 AccessKeyId 无效或不存在") elif "SignatureDoesNotMatch" in error_str: print("💡 AccessKeySecret 错误") elif "AccessDenied" in error_str: print("💡 AccessKey 权限不足,无法列出 Bucket") # 方法2: 通过 STS 获取账号信息 try: print(f"\n🔍 尝试获取账号身份信息...") client = AcsClient(access_key_id, access_key_secret, 'cn-hangzhou') request = CommonRequest() request.set_accept_format('json') request.set_domain('sts.cn-hangzhou.aliyuncs.com') request.set_method('POST') request.set_protocol_type('https') request.set_version('2015-04-01') request.set_action_name('GetCallerIdentity') response = client.do_action_with_exception(request) import json result = json.loads(response) if 'AccountId' in result: account_id = result['AccountId'] user_id = result.get('UserId', 'N/A') arn = result.get('Arn', 'N/A') print(f"✅ 账号信息:") print(f" 账号ID: {account_id}") print(f" 用户ID: {user_id}") print(f" ARN: {arn}") return True except ImportError: print("❌ 阿里云 SDK 未安装,请运行:") print(" pip install aliyun-python-sdk-core") print(" pip install aliyun-python-sdk-sts") except Exception as e: print(f"❌ STS 查询失败: {e}") return False except ImportError: print("❌ 依赖模块未安装,请运行:") print(" pip install oss2") print(" pip install aliyun-python-sdk-core") return False except Exception as e: print(f"❌ 查询失败: {e}") return False def suggest_solutions(): """提供解决方案建议""" print(f"\n🔧 解决方案建议:") print(f"1. 如果找到了其他 Bucket,修改 .env 中的 ALIYUN_OSS_BUCKET_NAME") print(f"2. 如果没有 Bucket,登录阿里云控制台创建一个:") print(f" https://oss.console.aliyun.com/") print(f"3. 如果 AccessKey 权限不足,在 RAM 控制台添加 OSS 权限:") print(f" https://ram.console.aliyun.com/") print(f"4. 确保 AccessKey 有以下权限:") print(f" - oss:ListBuckets") print(f" - oss:ListObjects") print(f" - oss:PutObject") print(f" - oss:DeleteObject") def main(): print("🚀 开始查询阿里云账号信息...") success = check_account_info() if not success: suggest_solutions() return 1 return 0 if __name__ == "__main__": sys.exit(main())