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

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

代码仓库

我把东西都打包到GitHub了,时不时我就去更新一下加点新功能进去。大家需要的话帮忙点个 Star!

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

背景介绍

平常对模型进行训练、微调的时候,我在 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")

测试效果

容器部署

首先需要一个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
目录
相关文章
|
3天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
21 5
|
5天前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
23 7
|
2月前
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
115 1
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
2月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
1月前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
120 7
|
2月前
|
存储 网络协议 API
详解Python中的Requests会话管理
详解Python中的Requests会话管理
|
1月前
|
测试技术 API 数据安全/隐私保护
Python连接到Jira实例、登录、查询、修改和创建bug
通过使用Python和Jira的REST API,可以方便地连接到Jira实例并进行各种操作,包括查询、修改和创建Bug。`jira`库提供了简洁的接口,使得这些操作变得简单易行。无论是自动化测试还是开发工作流的集成,这些方法都可以极大地提高效率和准确性。希望通过本文的介绍,您能够更好地理解和应用这些技术。
132 0
|
2月前
|
Python
Python中的push方法详解与实例
Python中的push方法详解与实例
41 3
|
2月前
|
数据可视化 Python
Python绘制基频曲线——实例解析与应用探讨
Python绘制基频曲线——实例解析与应用探讨
25 0
|
2月前
|
监控 安全 中间件
Python requests 如何避免被 Gzip 炸弹攻击
Python requests 如何避免被 Gzip 炸弹攻击
39 0
下一篇
DataWorks