async def time_convert(resoucetime=None): if not resoucetime: return utc_time = datetime.datetime.strptime(resoucetime, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=datetime.timezone.utc) beijing_time = utc_time.astimezone(datetime.timezone(datetime.timedelta(hours=8))) return beijing_time.strftime("%Y-%m-%d %H:%M:%S") async def baidu_query_by_expire_time(ns={}): if ns.get('userid'): userid = ns.get('userid') else: userid = await get_user() db = DBPools() async with db.sqlorContext('kboss') as sor: baiduids = await sor.R('baidu_users', {'user_id': userid}) if baiduids: baiduid = baiduids[0]['baidu_id'] else: return { 'status': False, 'msg': 'User not synchronized' } ns['queryAccountId'] = baiduid ns['pageNo'] = int(ns.get('pageno', 1)) ns['pageSize'] = int(ns.get('pagesize', 100)) method = 'POST' ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) url = 'https://billing.baidubce.com/v1/resource/queryByExpireTime?%s' % ns_format header = { "Host": "billing.baidubce.com" } header = await get_auth_header(method=method, url=url, header=header) async with aiohttp_client.request( method=method, url=url, headers=header, json=ns) as res: data_ = await res.json() print('data_', data_) if data_.get('pageSize'): return { 'status': True, 'msg': 'get baidu resource expire time success', 'data': data_ } else: return { 'status': False, 'msg': 'get baidu resource expire time failed', 'data': data_ } async def calculate_time_diff(time_str=None): # 将字符串时间转换为 datetime 对象 # time_str = '2025-07-13T02:27:43Z' # 按照指定格式解析字符串时间 given_time = datetime.datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=datetime.timezone.utc) # 获取当前时间 current_time = datetime.datetime.now(datetime.timezone.utc) # 计算时间差 time_difference = given_time - current_time # 提取天数 days_difference = time_difference.days return days_difference async def get_resource_expire_time(ns={}): if ns.get('userid'): userid = ns.get('userid') else: userid = await get_user() data = [] baidu_resource_data = await baidu_query_by_expire_time(ns) if baidu_resource_data.get('data'): data_result = baidu_resource_data['data']['result'] if baidu_resource_data['data'].get('result') else [] # if not data_result: # return { # 'status': True, # 'msg': '无资源数据', # 'data': str(baidu_resource_data['data']) # } for baidubaidu_resource in data_result: baidubaidu_resource['id'] = uuid() baidubaidu_resource['name'] = baidubaidu_resource['serviceTypeName'] baidubaidu_resource['instanceid'] = baidubaidu_resource['shortId'] baidubaidu_resource['expiretime'] = await time_convert(baidubaidu_resource['expireTime']) baidubaidu_resource['days'] = await calculate_time_diff(baidubaidu_resource['expireTime']) # 读取数据库表product,匹配跳转链接 db = DBPools() async with db.sqlorContext('kboss') as sor: find_sql = """select * from product where providerpid='baidu_%s' and del_flg='0';""" % baidubaidu_resource['serviceType'] product_li = await sor.sqlExe(find_sql, {}) spec_note_li = json.loads(product_li[0]['spec_note']) if product_li else [] for spec_note in spec_note_li: if spec_note.get('configName') == 'listUrl': baidubaidu_resource['list_url'] = spec_note.get('value') break else: baidubaidu_resource['list_url'] = '' data.append(baidubaidu_resource) return { 'status': True, 'msg': 'get resouce expire time success', 'data': data, # 分页 'pagination': { 'total': baidu_resource_data['data'].get('totalCount'), 'page_size': baidu_resource_data['data'].get('pageSize'), 'current_page': baidu_resource_data['data'].get('pageNo') } } ret = await get_resource_expire_time(params_kw) return ret