200 lines
7.8 KiB
Python
200 lines
7.8 KiB
Python
import time
|
||
import logging
|
||
import requests
|
||
import json
|
||
from datetime import datetime
|
||
from KeLing.Kit.KlCommon import KlCommon
|
||
from KeLing.Kit.KlErrorCode import KlErrorCode
|
||
|
||
# 配置日志
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||
log = logging.getLogger(__name__)
|
||
|
||
class KlAccount(KlCommon):
|
||
BASE_URL = "https://api.klingai.com"
|
||
ACCOUNT_COSTS_PATH = "/account/costs"
|
||
|
||
@staticmethod
|
||
def query_resource_packs(start_time, end_time, resource_pack_name=None):
|
||
"""
|
||
查询账号下资源包列表及余量
|
||
|
||
:param start_time: 查询的开始时间,Unix时间戳、单位ms
|
||
:param end_time: 查询的结束时间,Unix时间戳、单位ms
|
||
:param resource_pack_name: 资源包名称,用于精准指定查询某个资源包,可为None
|
||
:return: 资源包信息列表
|
||
:raises Exception: 异常信息
|
||
"""
|
||
# 获取JWT令牌
|
||
jwt = KlAccount.get_jwt()
|
||
|
||
# 构建URL
|
||
url = f"{KlAccount.BASE_URL}{KlAccount.ACCOUNT_COSTS_PATH}?start_time={start_time}&end_time={end_time}"
|
||
|
||
# 如果提供了资源包名称,则添加到URL中
|
||
if resource_pack_name:
|
||
url += f"&resource_pack_name={resource_pack_name}"
|
||
|
||
# 发送GET请求
|
||
headers = {
|
||
"Content-Type": "application/json",
|
||
"Authorization": f"Bearer {jwt}"
|
||
}
|
||
|
||
log.info(f"查询账户资源包请求URL:{url}")
|
||
response = requests.get(url, headers=headers)
|
||
|
||
# 检查响应状态码
|
||
if response.status_code != 200:
|
||
raise Exception(f"请求失败,状态码:{response.status_code}")
|
||
|
||
# 解析响应
|
||
response_body = response.text
|
||
try:
|
||
response_json = json.loads(response_body)
|
||
except json.JSONDecodeError as e:
|
||
raise Exception(f"响应解析失败:{str(e)}")
|
||
|
||
log.info(f"查询账户资源包响应:{response_body}")
|
||
|
||
# 检查响应状态
|
||
code = response_json.get("code")
|
||
if code != 0:
|
||
message = response_json.get("message", "未知错误")
|
||
solution = KlErrorCode.get_solution_by_code(code)
|
||
error_msg = f"查询账户资源包失败:[{code}] {message} - {solution}"
|
||
raise Exception(error_msg)
|
||
|
||
# 解析资源包信息
|
||
resource_pack_info_list = []
|
||
data = response_json.get("data", {})
|
||
|
||
# 检查data中的code
|
||
data_code = data.get("code")
|
||
if data_code != 0:
|
||
data_msg = data.get("msg", "未知错误")
|
||
raise Exception(f"查询账户资源包失败:{data_msg}")
|
||
|
||
# 获取资源包列表
|
||
resource_pack_array = data.get("resource_pack_subscribe_infos", [])
|
||
for resource_pack_json in resource_pack_array:
|
||
resource_pack_info = ResourcePackInfo()
|
||
|
||
resource_pack_info.resource_pack_name = resource_pack_json.get("resource_pack_name")
|
||
resource_pack_info.resource_pack_id = resource_pack_json.get("resource_pack_id")
|
||
resource_pack_info.resource_pack_type = resource_pack_json.get("resource_pack_type")
|
||
resource_pack_info.total_quantity = resource_pack_json.get("total_quantity", 0.0)
|
||
resource_pack_info.remaining_quantity = resource_pack_json.get("remaining_quantity", 0.0)
|
||
resource_pack_info.purchase_time = resource_pack_json.get("purchase_time", 0)
|
||
resource_pack_info.effective_time = resource_pack_json.get("effective_time", 0)
|
||
resource_pack_info.invalid_time = resource_pack_json.get("invalid_time", 0)
|
||
resource_pack_info.status = resource_pack_json.get("status")
|
||
|
||
resource_pack_info_list.append(resource_pack_info)
|
||
|
||
return resource_pack_info_list
|
||
|
||
@staticmethod
|
||
def print_resource_pack_info(resource_pack_info_list):
|
||
"""
|
||
打印资源包信息
|
||
|
||
:param resource_pack_info_list: 资源包信息列表
|
||
"""
|
||
if not resource_pack_info_list:
|
||
log.info("未查询到资源包信息")
|
||
return
|
||
|
||
log.info("资源包信息列表:")
|
||
for info in resource_pack_info_list:
|
||
log.info("----------------------------------------")
|
||
log.info(f"资源包名称: {info.resource_pack_name}")
|
||
log.info(f"资源包ID: {info.resource_pack_id}")
|
||
log.info(f"资源包类型: {KlAccount.get_resource_pack_type_desc(info.resource_pack_type)}")
|
||
log.info(f"总量: {info.total_quantity}")
|
||
log.info(f"余量: {info.remaining_quantity}")
|
||
log.info(f"购买时间: {KlAccount.format_timestamp(info.purchase_time)}")
|
||
log.info(f"生效时间: {KlAccount.format_timestamp(info.effective_time)}")
|
||
log.info(f"失效时间: {KlAccount.format_timestamp(info.invalid_time)}")
|
||
log.info(f"状态: {KlAccount.get_status_desc(info.status)}")
|
||
log.info("----------------------------------------")
|
||
|
||
@staticmethod
|
||
def get_resource_pack_type_desc(type_str):
|
||
"""
|
||
获取资源包类型描述
|
||
|
||
:param type_str: 资源包类型
|
||
:return: 资源包类型描述
|
||
"""
|
||
if type_str == "decreasing_total":
|
||
return "总量递减型"
|
||
elif type_str == "constant_period":
|
||
return "周期恒定型"
|
||
else:
|
||
return type_str
|
||
|
||
@staticmethod
|
||
def get_status_desc(status):
|
||
"""
|
||
获取资源包状态描述
|
||
|
||
:param status: 资源包状态
|
||
:return: 资源包状态描述
|
||
"""
|
||
status_map = {
|
||
"toBeOnline": "待生效",
|
||
"online": "生效中",
|
||
"expired": "已到期",
|
||
"runOut": "已用完"
|
||
}
|
||
return status_map.get(status, status)
|
||
|
||
@staticmethod
|
||
def format_timestamp(timestamp):
|
||
"""
|
||
格式化时间戳
|
||
|
||
:param timestamp: 时间戳(毫秒)
|
||
:return: 格式化后的时间字符串
|
||
"""
|
||
if timestamp == 0:
|
||
return "N/A"
|
||
# 转换毫秒时间戳为秒
|
||
seconds = timestamp / 1000
|
||
return datetime.fromtimestamp(seconds).strftime("%Y-%m-%d %H:%M:%S")
|
||
|
||
class ResourcePackInfo:
|
||
"""资源包信息类"""
|
||
def __init__(self):
|
||
self.resource_pack_name = None # 资源包名称
|
||
self.resource_pack_id = None # 资源包ID
|
||
self.resource_pack_type = None # 资源包类型
|
||
self.total_quantity = 0.0 # 总量
|
||
self.remaining_quantity = 0.0 # 余量
|
||
self.purchase_time = 0 # 购买时间
|
||
self.effective_time = 0 # 生效时间
|
||
self.invalid_time = 0 # 失效时间
|
||
self.status = None # 资源包状态
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
# 获取当前时间
|
||
current_time = int(time.time() * 1000) # 毫秒时间戳
|
||
# 设置查询时间范围为过去30天到当前
|
||
startTime = current_time - 30 * 24 * 60 * 60 * 1000
|
||
endTime = current_time
|
||
|
||
# 查询所有资源包
|
||
resource_pack_info_list = KlAccount.query_resource_packs(startTime, endTime)
|
||
|
||
# 打印资源包信息
|
||
KlAccount.print_resource_pack_info(resource_pack_info_list)
|
||
|
||
# 如果需要查询特定资源包,可以使用以下代码
|
||
# specific_pack_name = "视频生成-10000条"
|
||
# specific_resource_pack_info_list = KlAccount.query_resource_packs(startTime, endTime, specific_pack_name)
|
||
# KlAccount.print_resource_pack_info(specific_resource_pack_info_list)
|
||
|
||
except Exception as e:
|
||
log.error(f"查询账户资源包异常: {str(e)}", exc_info=True) |