腾讯云API__CVM

获取CVM数据
其实直接存self.cvm_list更方便,但是为了测试redis,就写了一下

import json
from tcecloud.bms.v20180813.models import Instance
from tcecloud.common import credential
from tcecloud.common.profile.client_profile import ClientProfile
from tcecloud.common.profile.http_profile import HttpProfile
from tcecloud.common.exception.cloud_sdk_exception import CloudSDKException
from tcecloud.cvm.v20170312 import cvm_client, models
from datetime import datetime
import re
import pandas as pd
import redis


def modify_index():
    ## 修改nginx页面
    now = datetime.now()
    date = str(now.date()) + '.xlsx'

    output = "C:/Users/Administrator/Downloads/nginx-1.26.3/nginx-1.26.3/html/index.html"
    with open(output, "r", encoding="utf-8") as f:
        html = f.read()

    # 匹配href和download属性中任意值,保留引号结构
    pattern = r'^\s*<a\b.*?\bhref="([^"]+)".*?\bdownload="([^"]+)"'
    replaced_str = re.sub(pattern, lambda match: f'<a href="{date}" download="{date}"', html, flags=re.MULTILINE | re.DOTALL)
    # 保存结果
    with open(output, "w", encoding="utf-8") as f:
        f.write(replaced_str)
    print('index,Done!!')

class GetCVMInfo():
    def __init__(self):
        self.cvm_list = []

    def get_cvm(self, secret_id, secret_key, limit, offset):
        '''
        单次获取CVM信息
        '''
        cred = credential.Credential(secret_id, secret_key)
        http_profile = HttpProfile()
        http_profile.endpoint = "cvm.api3.zjcftce.com"
        client_profile = ClientProfile()
        client_profile.httpProfile = http_profile
        client = cvm_client.CvmClient(cred, "sz", client_profile)
        req = models.DescribeInstancesRequest()
        params = {
            "Limit": limit,
            "Offset": offset
        }
        req.from_json_string(json.dumps(params))
        resp = client.DescribeInstances(req)
        return resp.to_json_string()

    def create_redis_conn(self, product):
        self.r = redis.StrictRedis(host='10.135.114.14', port=6379, db=0, password='123456')
        self.r.delete(product)

    def get_cvm_info(self, secretId, secretKey, product):
        '''
        遍历获取整个租户的CVM信息
        '''
        Limit = 100
        Offset = 0
        InstanceList = []
        dict_cvm = json.loads(self.get_cvm(secretId, secretKey, Limit, Offset))
        TotalCount = dict_cvm.get('TotalCount', 0)
        Title = list(dict_cvm.get('InstanceSet', {})[0].keys())
        while TotalCount > 0:
            params = {
                "Limit": Limit,
                "Offset": Offset
            }
            dict_cvm = json.loads(self.get_cvm(secretId, secretKey, Limit, Offset))
            Offset += Limit
            TotalCount -= Limit
            for Instance in dict_cvm['InstanceSet']:
                temp = Instance
                temp['部落'] = product
                self.r.rpush(product, json.dumps(temp, ensure_ascii=False).encode('utf-8'))

    def redis_to_list(self, product):
        r = redis.StrictRedis(host='10.135.114.14', port=6379, db=0, password='123456')
        items = r.lrange(product, 0, -1)
        for item in items:
            self.cvm_list.append(json.loads(item.decode('utf-8')))

    def write_to_excel(self):
        now = datetime.now()
        day = str(now.date())
        file = "C:/Users/Administrator/Downloads/nginx-1.26.3/nginx-1.26.3/html/" + day + ".xlsx"
        df = pd.DataFrame(self.cvm_list)
        df.to_excel(file, index=False)

try:
    product_dict = {
        '深圳':{"id": "XXX", "key": "YYY"},
        '上海':{"id": "XXX", "key": "YYY"}
    }
    Class_cvm = GetCVMInfo()

    for product in product_dict.keys():
        Class_cvm.create_redis_conn(product)
        id = product_dict[product]['id']
        key = product_dict[product]['key']
        print('开始获取' + product + '信息')
        Class_cvm.get_cvm_info(id, key, product)
        print(product + '信息获取结束')
        Class_cvm.redis_to_list(product)

    Class_cvm.write_to_excel()
    modify_index()

except CloudSDKException as err:
    print(err)
posted @ 2025-10-10 10:16  WiseHYH  阅读(28)  评论(0)    收藏  举报