from alibabacloud_tea_openapi import models as open_api_models from alibabacloud_credentials.client import Client as CredClient from alibabacloud_bssopenapi20171214.client import Client as BssOpenApi20171214Client from alibabacloud_bssopenapi20171214 import models as bss_open_api_20171214_models from alibabacloud_tea_util import models as util_models import subprocess import json import os class SsoLoginResponse: def __init__(self, mode, access_key_id, access_key_secret, sts_token): self.mode = mode self.access_key_id = access_key_id self.access_key_secret = access_key_secret self.sts_token = sts_token def get_sts_token(): try: result = subprocess.run( ["acs-sso", "login", "--profile", "sso"], capture_output=True, text=True, check=True ) output = result.stdout data = json.loads(output) response = SsoLoginResponse( mode=data.get("mode"), access_key_id=data.get("access_key_id"), access_key_secret=data.get("access_key_secret"), sts_token=data.get("sts_token") ) return response except subprocess.CalledProcessError as e: raise Exception(f"Failed to execute command: {e}") from e except json.JSONDecodeError as e: raise Exception(f"Failed to parse JSON: {e}") from e class AliCloud: def __init__(self): # get cerdential from sso if os.environ.get("LOCAL_DEV") is not None: resp = get_sts_token() config = open_api_models.Config( type='sts', access_key_id= resp.access_key_id, access_key_secret= resp.access_key_secret, security_token= resp.sts_token, endpoint='business.ap-southeast-1.aliyuncs.com', ) else: credentialsClient = CredClient() config = open_api_models.Config( endpoint='business.ap-southeast-1.aliyuncs.com', credential=credentialsClient) self.client =BssOpenApi20171214Client(config) def get_cost_and_usage(self, pay_month): query_bill_request = bss_open_api_20171214_models.DescribeInstanceBillRequest( billing_cycle=pay_month, #'2025-03' ) runtime = util_models.RuntimeOptions() result = [] try: resp=self.client.describe_instance_bill_with_options(query_bill_request, runtime) except Exception as error: print(error.message) raise error print(resp.body) result.extend(resp.body.data.items) while resp.body.data.next_token is not None: query_bill_request = bss_open_api_20171214_models.DescribeInstanceBillRequest( billing_cycle=pay_month, next_token=resp.body.data.next_token ) try: resp=self.client.describe_instance_bill_with_options(query_bill_request, runtime) except Exception as error: print(error.message) raise error print(resp.body) result.extend(resp.body.data.items) return result