AutoDL Python实现 自动续签 防止实例过期释放 小脚本 定时任务 apscheduler requests

news2025/2/27 7:27:58

背景介绍

请添加图片描述
平常对模型进行训练、微调的时候,我在 AutoDL 有一台主机。
但是有些主机环境我配置好了,又不想让它过期,可能过段时间还会再用。
我一不留神就会超过15天,导致我的机器给释放了很难受。
所以写了一个Python的小脚本,获取列表、时间快过期了就进行无卡开机关机,这样便完成续签。

安装依赖

需要的前置依赖大概有这些(有些是系统已经带了)

import os
from dotenv import load_dotenv
import requests
import json
import time
import logging
from datetime import datetime
import pytz
from apscheduler.schedulers.blocking import BlockingScheduler

编写代码请添加图片描述

import os
from dotenv import load_dotenv
import requests
import json
import time
import logging
from datetime import datetime
import pytz
from apscheduler.schedulers.blocking import BlockingScheduler


load_dotenv()
authorization = os.getenv('Authorization')
min_day = os.getenv('MIN_DAY')

logging.basicConfig(
    filename='main.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s')

headers = {
    "Authorization": authorization,
    "Content-Type": "application/json;charset=UTF-8",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
}


def open_machine(instance_uuid: str = None):
    if not instance_uuid:
        return False
    url = "https://www.autodl.com/api/v1/instance/power_on"
    body = {
        "instance_uuid": str(instance_uuid),
        "payload": "non_gpu"
    }

    response = requests.post(url=url, headers=headers, data=json.dumps(body))
    json_data = response.json()
    logging.info(f"uuid: {instance_uuid}, open")
    logging.info(f"{instance_uuid} response: {json_data}")
    if json_data['code'] == "Success":
        return True
    return False


def close_machine(instance_uuid: str = None):
    if not instance_uuid:
        return False
    url = "https://www.autodl.com/api/v1/instance/power_off"
    body = {
        "instance_uuid": str(instance_uuid)
    }
    response = requests.post(url=url, headers=headers, data=json.dumps(body))
    json_data = response.json()
    logging.info(f"uuid: {instance_uuid}, close")
    logging.info(f"{instance_uuid} response: {json_data}")
    if json_data['code'] == "Success":
        return True
    return False


def check_instance(page: int = 1):
    url = "https://www.autodl.com/api/v1/instance"
    body = {
        "date_from": "",
        "date_to": "",
        "page_index": page,
        "page_size": 100,
        "status": [],
        "charge_type": []
    }
    response = requests.post(url=url, headers=headers, data=json.dumps(body))
    json_data = response.json()
    if json_data['code'] == "Success":
        data_list = json_data['data']['list']
        for each_data in data_list:
            uuid = each_data.get('uuid', '')
            if uuid == "":
                return
            machine_alias = each_data.get('machine_alias', '')
            region_name = each_data.get('region_name', '')
            status = each_data.get('status', '')
            status_at = each_data.get('status_at', '')
            phone = each_data.get('phone', '')

            status_at_time = datetime.fromisoformat(status_at)
            current_date = datetime.now(pytz.timezone('Asia/Shanghai'))
            date_difference = current_date - status_at_time
            date_difference_day = date_difference.days
            logging.info(f"now: {current_date.strftime('%Y-%m-%d %H:%M:%S')}, "
                         f"phone: {phone}, name: {region_name} {machine_alias} {uuid}, "
                         f"status: {status}, date_diff: {date_difference_day}天")
            # 小于1天
            if date_difference_day >= int(min_day):
                logging.info(f"准备续费: {uuid}")
                # 续费逻辑
                open_machine(uuid)
                time.sleep(60)
                close_machine(uuid)
                time.sleep(5)
            else:
                logging.info(f"等待下次扫描: {uuid}")
                # 不作操作
                pass
    else:
        return


def main():
    if not authorization:
        logging.error("Authorization is None !")
        exit(-1)
    logging.info(f"now: {datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S')}")
    check_instance()


if __name__ == "__main__":
    scheduler = BlockingScheduler()
    scheduler.add_job(main, 'interval', hours=1)
    try:
        # 启动调度器
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        print("KeyboardInterrupt Or SystemExit")

测试效果

请添加图片描述

代码仓库

我把东西都打包到GitHub了,时不时我就去更新一下加点新功能进去。

https://github.com/turbo-duck/autodl-keeper/tree/main

请添加图片描述

容器部署

首先需要一个Dockerfile

FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
RUN touch main.log
ENV ENV_FILE_PATH .env
CMD ["sh", "-c", "if [ -f $ENV_FILE_PATH ]; then export $(cat $ENV_FILE_PATH | xargs); fi && python main.py"]

对其进行打包

docker build -t autodl-keeper .

打包后运行

docker run --env-file .env autodl-keeper

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩手游多开还停留在模拟器阶段?不如试试云手机

在手游的世界里,尤其是回合制和资源类游戏,采用多开账号以获取更多游戏资源或者体验不同的游戏策略,是许多玩家的需求。但其实,目前大多数玩家在实现手游多开时,还停留在使用模拟器的阶段。但实际上,有一种…

直播平台美颜技术分析:视频美颜SDK功能实现原理

本篇文章,笔者将深入分析视频美颜SDK的功能实现原理,探讨其在直播平台中的应用。 一、视频美颜技术概述 通过这些功能,用户可以在直播过程中呈现更加理想的自己,从而提高观众的观看体验和互动积极性。 二、视频美颜SDK的功能 1…

Java多线程基础知识-1

什么是程序? 可执行的文件。 什么是进程? 进程是程序一次动态执行的过程,它是资源分配与管理的基本单位。 什么线程? 线程是进程创建的,它是调度和执行的基本单位。线程不拥有系统资源,只拥有一点必不可…

YOLOv10训练自己的数据集(图像目标检测)

目录 1、下载代码 2、环境配置 3、准备数据集 4、yolov10训练 可能会出现报错: 1、下载代码 源码地址:https://github.com/THU-MIG/yolov10 2、环境配置 打开源代码,在Terminal中,使用conda 创建虚拟环境配置 命令如下&a…

Echarts各类图表常用配置项说明,附示例代码

前言: 哈喽,大家好,我是前端菜鸟的自我修养!今天给大家分享【 Echarts各类图表常用配置项说明 】,并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家&#xff0…

剖析影响大米码垛机性能的关键因素

在现代化粮食加工产业链中,大米码垛机以其高效、精准的自动化操作,成为提升生产效率、降低劳动强度的得力助手。然而,要想充分发挥大米码垛机的性能优势,我们必须深入了解影响其性能的关键因素。星派将深入剖析这些关键因素&#…

Vue的学习(6.20)

一、Vue的特点 1.采用组件化模式(xxx.vue包含htmlcssjs) 2.声明式编码,编码人员无需直接操作DOM,提高开发效率 3.使用虚拟DOM优秀的DIFF算法(DIFF是用于新旧虚拟DOM的比较),尽量复用DOM节点 …

数学建模理论学习:线性规划模型

三要素:目标函数、约束条件(s.t.)、决策变量(x) 目标函数:z ax1 bx2 cx3 ... 其中c为一个序列,从左到右依次从x1到xn的系数 解决下面的线性规划问题: % 目标函数系数&#xf…

人工智能指数报告

2024人工智能指数报告(一):研发 前言 全面分析人工智能的发展现状。 从2017年开始,斯坦福大学人工智能研究所(HAI)每年都会发布一份人工智能的研究报告,人工智能指数报告(AII&…

java收徒 java辅导 java试用期辅导 java零基础学习

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末报名辅导🌟 感兴趣的可以先收藏起来,还有大家…

全面升级,票据识别新纪元:合合信息TextIn多票识别2.0

票据识别 - 自动化业务的守门员 发票、票据识别,是OCR技术和RPA、CMS系统结合的一个典型场景,从覆盖率、覆盖面的角度来说,应该也是结合得最成功的场景之一。 产品简介 国内通用票据识别V2.0(简称“多票识别2.0”)是…

顶级管理者的新视角:管理状态而非时间

在快节奏的商业环境中,时间管理常被看作是提升效率和效果的关键因素。然而,对于顶级管理者来说,仅仅管理时间可能并不足够。一个更深层、更全面的管理方式——管理状态,正在成为新的趋势。在这篇文章中,我们将探讨为什…

Flutter 项目设置 Flutter 版本

即便使用了 fvm 设置了版本,AdroidStudio Setting 中如果不修改路径,Editor 依然会编译错误。目前还没看懂如何通过命令、文件来记录AdroidStudio Setting中的设置。 fvm list 来查看 flutter 路径:

【每天学会一个渗透测试工具】AppScan安装及使用指南

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 https://www.hcl-software.com/appscan AppScan是一种综合型漏洞扫描工具,采用SaaS解决方案,它将所以…

神经网络学习3-卷积层

膨胀卷积,也被称为空洞卷积或扩张卷积,是一种特殊的卷积运算,它在标准卷积的基础上引入了一个额外的超参数,即膨胀率(dilation rate)。这个超参数决定了在卷积核的元素之间插入多少额外的空间。通过这种方式…

HTTP!!!

HTTP 一 : 请求报文1.2 : 首行1.3 :请求头(header)1.4 : 空行1.5 : 正文 body 二: 响应报文2.2 : 首行 三 : URL 一 : 请求报文 一个HTTP 请求报文, 分成四个部分 首行 GET https://cn.bing.com/?FORMZ9FD1 HTTP/1.1请求头(header)空行正文(body) 1.2 : 首行 首行又分为三个…

C#开发-集合使用和技巧(八)集合中的排序Sort、OrderBy、OrderByDescending

C#开发-集合使用和技巧&#xff08;八&#xff09;集合中的排序Sort、OrderBy、OrderByDescending List<T>.Sort()方法签名使用场景示例升序实现效果 降序实现效果 IEnumerable<T>.OrderBy()方法签名使用场景示例实现效果 Enumerable<T>.OrderByDescending()…

动态网页制作技术

动态网页制作技术是一种利用脚本语言、数据库和服务器端程序来生成动态内容的网页技术。以下是常用的动态网页制作技术&#xff1a; 1.PHP&#xff1a;PHP是一种广泛使用的服务器端脚本语言&#xff0c;可以嵌入到HTML中&#xff0c;用于生成动态网页内容。它可以与各种数据库进…

FuTalk设计周刊-Vol.033

&#x1f525;AI漫谈 热点捕手 1、Stable Video Diffusion —— Stable Diffusion 推出的 AI 生成视频模型 Stable Video Diffusion 也是开源的&#xff0c;可以免费下载部署。支持文本/图片生成视频&#xff0c;最高支持 576*1024 分辨率 25 帧。 链接https://huggingface.…

APP开发需要多少钱?定制开发智慧指南

在移动互联网飞速发展的今天&#xff0c;APP已经成为人们日常生活和工作中不可或缺的一部分。那么&#xff0c;开发一款 APP 到底需要多少钱呢&#xff1f;APP 开发的费用因人而异&#xff0c;不同的开发公司、不同的开发团队、不同的项目需求&#xff0c;都会导致开发费用有所…