python实现腾讯云轻量云流量超标自动关闭系统

发布时间:2022-1-19 11:14

前几天在LOC上看到说良心云的轻量云流量超标后会额外扣超出的流量费,吓得我赶紧学着也弄了个脚本来监控轻量云,当流量超过自己设定的预警值后,自动关闭轻量云,避免超流量要付额外的流量钱。

但是...发现这些说法是不准确滴,良心云依旧是良心的,当轻量云流量包超过后,腾讯云会自动关闭你的轻量云,不会出现轻量云超流量后被扣流量费的问题。

但是...脚本也写好了,还是给有需要的人吧,这个脚本可以根据自己设定的预警值来进行关闭VPS。

PS:这个脚本只针对腾讯云的轻量云,其他的估计是用不了。

使用前需要安装几个依赖库

pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python
pip install json

之后创建一个.py文件,将下面的代码保存,Linux系统需要把脚本设置为777权限否则关闭了系统。

或自行下载 https://github.com/fungjcode/python_tools

修改脚本中,SecretId 和 SecretKey为你自己的,并填写好实例地域和ID即可。

可以自己调整all_proportion的值来设置预警值。

最后,制作一个定时计划任务来定时运行这个脚本即可了。

"""
腾讯云 轻量云监控流量超标自动关机
"""

import json
import os
import time
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.lighthouse.v20200324 import lighthouse_client, models

def main(SecretId, SecretKey, region, InstanceIds, all_proportion):
    """
    GOGO
    :param SecretId: str 腾讯云账号SecretId
    :param SecretKey: str 腾讯云账号SecretKey
    :param region: str 实例地域
    :param InstanceIds: str 实例ID
    :param all_proportion: int 预警值
    """
    qrest = qcloud(SecretId, SecretKey, region, InstanceIds)
    if qrest != False:
        # 取数
        TrafficPackageSet = qrest['InstanceTrafficPackageSet'][0]['TrafficPackageSet']
        # 使用量
        TrafficUsed = TrafficPackageSet[0]['TrafficUsed']
        # 总量
        TrafficPackageTotal = TrafficPackageSet[0]['TrafficPackageTotal']
        # 使用比例,保留两位小数
        use_proportion = round(TrafficUsed / TrafficPackageTotal, 2)
        print('当前流量使用比例为:{0}%'.format(use_proportion * 100))
        # 判断使用量是否超标
        if use_proportion > all_proportion:
            # 超标,关机保平安
            print('当前流量已经使用操作预警值,服务器将在3秒钟后关闭...')
            shut_down()
        else:
            # 没有超标,结束脚本
            print('流量正常...')
            exit()


def qcloud(SecretId, SecretKey, region, InstanceIds):
    """
    腾讯云的SDK不管他
    :param SecretId: str 腾讯云账号SecretId
    :param SecretKey: str 腾讯云账号SecretKey
    :param region: str 实例地域
    :param InstanceIds: str 实例ID
    :return: json 腾讯云实例流量情况
    """
    try:
        cred = credential.Credential(SecretId, SecretKey)
        region = region
        httpProfile = HttpProfile()
        httpProfile.endpoint = "lighthouse.tencentcloudapi.com"
        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        client = lighthouse_client.LighthouseClient(cred, region, clientProfile)
        req = models.DescribeInstancesTrafficPackagesRequest()
        params = {
            "InstanceIds": [InstanceIds]
        }
        req.from_json_string(json.dumps(params))

        resp = client.DescribeInstancesTrafficPackages(req)
        return json.loads(resp.to_json_string())
    except TencentCloudSDKException as err:
        print(err)
        return False


def shut_down():
    """
    关闭系统
    """
    os.system('shutdown -s -t 3')

if __name__ == '__main__':
    """
    腾讯云API库安装
    pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python
    流量包解释
    https://cloud.tencent.com/document/api/1207/47576#InstanceTrafficPackage
    腾讯云账号ID获取地址
    https://console.cloud.tencent.com/cam/capi
    实例地域
    "ap-beijing", "ap-chengdu", "ap-guangzhou", "ap-hongkong", "ap-nanjing", "ap-shanghai", "ap-singapore", "ap-tokyo", "eu-moscow", "na-siliconvalley"
    """
    # SecretId
    SecretId = "你的SecretId"
    # SecretKey
    SecretKey = "你的SecretKey "
    # 实例地域
    region = "ap-guangzhou"
    # 轻量云实例ID
    InstanceIds = "你的轻量云实例ID"
    # 预计比例0.95代表95%,0.9就是90%,具体自行修改
    all_proportion = 0.95
    # 执行
    nowtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    print('---------' + str(nowtime) + ' 程序开始执行------------')
    main(SecretId, SecretKey, region, InstanceIds, all_proportion)
Vue3学习笔记之依赖注入Provide/Inject 网站建设

Vue3学习笔记之依赖注入Provide/Inject

Provide / Inject 通常,当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果...
Vue3全局实例上挂载属性方法案例讲解 网站建设

Vue3全局实例上挂载属性方法案例讲解

在大多数开发需求中,我们有时需要将某个数据,或者某个函数方法,挂载到,全局实例身上,以便于,在项目全局的任何位置都能够调用其方法,或读取其数据。 在Vue2 中,我们是在 main.js 中 直...