最近Ucloud打折,买了个续费同价的香港。2核2G30M 600G流量

询问了客服得知600G上行流量,下行流量不计费。超过600G的部分不会停机,会按照流量收费。

这建站被刷流量刷一晚上不得倾家荡产?

根据Ucloud的官方API我写了个获取已用流量并且自动关机的脚本

脚本参考官方SDK示例

脚本


  • 7月12日更新,加入了掉电关机。参考了模拟主机掉电API
  • 7月15日更新,加入正常关机。参考了关闭轻量应用云主机。加入了距离上次自动关机的时间小于24小时不会执行自动关机。

# -*- coding: utf-8 -*-
import os
import time
import logging
from ucloud.core import exc
from ucloud.client import Client

# 配置参数
region = "改成你自己的"
public_key = "改成你自己的"
private_key = "改成你自己的"
project_id = "改成你自己的"
base_url = "https://api.ucloud.cn"
zone = "改成你自己的"
eip_id = "eip-XXXXX改成你自己的"

# 这个5的意思是剩余5%自动关机
threshold_percentage = 5
# 关机方式: "command" 表示命令行关机, "api_power_down" 表示通过API模拟掉电关机, "api_power_off" 表示通过API正常关机
shutdown_method = "command"
# UHost实例ID(仅在shutdown_method为"api_power_down"或"api_power_off"时使用)
uhost_id = "ulhost-XXXXX改成你自己的"

# 记录上次关机时间的文件
shutdown_time_file = "/tmp/last_shutdown_time"

def check_traffic_and_shutdown():
    client = Client({
        "region": region,
        "public_key": public_key,
        "private_key": private_key,
        "project_id": project_id,
        "base_url": base_url
    })

    try:
        resp = client.unet().get_eip_exclusive_utp_info({
            "Zone": zone,
            "EIPId": eip_id
        })
    except exc.UCloudException as e:
        print(f"错误: {e}")
        return
    
    eip_info = resp.get('EIPExclusiveInfo', {})
    total_size_mb = eip_info.get('TotalSize', 0)
    available_size_mb = eip_info.get('AvailableSize', 0)

    if total_size_mb and available_size_mb:
        used_size_mb = total_size_mb - available_size_mb
        remaining_percentage = (available_size_mb / total_size_mb) * 100

        print(f"总计流量: {total_size_mb} MB")
        print(f"剩余流量: {available_size_mb} MB")
        print(f"已用流量: {used_size_mb} MB")
        print(f"剩余流量百分比: {remaining_percentage:.2f}%")

        if remaining_percentage < threshold_percentage:
            print("剩余流量低于阈值。正在关机...")

            # 检查上次关机时间
            if os.path.exists(shutdown_time_file):
                with open(shutdown_time_file, 'r') as f:
                    last_shutdown_time = float(f.read().strip())
                current_time = time.time()
                # 如果距离上次关机时间小于24小时,则不执行关机
                if current_time - last_shutdown_time < 86400:
                    print("上次关机时间距离现在不足24小时,不执行关机。")
                    return

            # 记录当前关机时间
            with open(shutdown_time_file, 'w') as f:
                f.write(str(time.time()))

            if shutdown_method == "command":
                os.system('shutdown -h now')
                print("系统已通过命令行关机。")
            elif shutdown_method == "api_power_down":
                try:
                    shutdown_resp = client.invoke("PoweroffULHostInstance", {
                        "Region": region,
                        "Zone": zone,
                        "UHostId": uhost_id
                    })
                    print("UHost实例已成功掉电关机。")
                except exc.UCloudException as e:
                    print(f"掉电关机失败: {e}")
            elif shutdown_method == "api_power_off":
                try:
                    shutdown_resp = client.invoke("StopULHostInstance", {
                        "Region": region,
                        "Zone": zone,
                        "UHostId": uhost_id
                    })
                    print("UHost实例已成功关机。")
                except exc.UCloudException as e:
                    print(f"关机失败: {e}")
            else:
                print("无效的关机方式。")
        else:
            print("流量充足。")
    else:
        print("无法获取流量信息。")

if __name__ == '__main__':
    check_traffic_and_shutdown()

配置脚本

如果你没安装python可以先尝试安装python

apt install python3 python3-pip

然后pip安装ucloud-sdk-python3

pip install ucloud-sdk-python3

Ucloud的公钥私钥在这里申请

https://console.ucloud.cn/uaccount/api_manage

EIPID在这获取

https://console.ucloud.cn/uapi/detail?id=DescribeULHostInstance

填入资源ID点击发送请求可以找到EIPID

IPId那一栏,eip开头的就是。

Zone和Region可以在这里找

https://docs.ucloud.cn/api/summary/regionlist

project_id在这里找

我不确定每个人的是否一不一样,最好去这里看看

https://console.ucloud.cn/uapi/detail?id=GetEIPExclusiveUTPInfo

定时运行

打开终端并编辑crontab文件:

crontab -e

crontab文件中添加一行来每小时执行Python脚本。例如:

0 * * * * /usr/bin/python3 /path/to/your_script.py

这里的/usr/bin/python3是Python解释器的路径,/path/to/your_script.py是你的Python脚本的路径。

30Mbps一小时大概消耗13.18GB,600*0.05=30 设置5%剩余流量关机差不多合适,如果你想极限点也可以自己设置。

最后修改:2024 年 07 月 15 日
如果觉得我的文章对你有用,请随意赞赏