Alist S3 上传指定目录脚本文档
本文最后更新于 2024-10-04,文章内容可能已经过时。
自动生成子文件夹并上传至 Alist S3 脚本配置文档
此文档将指导你如何使用修改后的 Python 脚本,其中包括以下功能:
- 手动设置主文件夹名称。
- 在主文件夹下自动生成一个 backup+时间的子文件夹。
- 上传本地文件至 Alist S3 存储,并保存在 主文件夹/backup+时间目录中。
本教程使用Alist中的S3协议进行搭建对接的123云盘
1,先进入Alist的官网安装并运行,由于网络上此教程太多,我这边不过多教学,官网的一键安装也十分方便(Alist官网地址:alist.nn.ci)
2,进入Alist后台->存储->添加 来添加存储,我们以123pan为例

3,成功添加

4,进入123盘,在根目录新建desktop以及mobile文件夹用于存储手机和电脑访问时候呈现出不同尺寸的图片,并且检查是否正常创建

5,进入Alist后台创建S3协议的密钥以及id
在设置->对象存储中点击S3 generate来创建Key,在下方添加桶以及位置

配置完成后去Alist的配置文件位置修改配置文件让他启用S3服务

脚本的配置
完整代码
import os
import boto3
import schedule
import time
from datetime import datetime
from botocore.exceptions import NoCredentialsError, PartialCredentialsError
# ===================== 配置部分 =====================
DIRECTORY_TO_UPLOAD = '/path/to/your/local_directory'  # 本地需要上传的目录(一定要是绝对路径!!)
S3_BUCKET_NAME = 'your-s3-bucket-name'  # S3 桶名称
ALIST_S3_ENDPOINT = 'http://YOUR_IP:YOUR_PORT'  # Alist S3 的 IP + 端口
AWS_ACCESS_KEY_ID = 'YOUR_AWS_ACCESS_KEY_ID'  # Alist S3 的访问密钥
AWS_SECRET_ACCESS_KEY = 'YOUR_AWS_SECRET_ACCESS_KEY'  # Alist S3 的密钥
UPLOAD_INTERVAL_MINUTES = 60  # 每隔 60 分钟上传一次
UPLOAD_NOW = True  # 设置为 True 表示立即上传, False 表示不立即上传
SCHEDULED_UPLOAD = True  # 设置为 True 表示定期上传,False 表示仅执行一次上传
CUSTOM_FOLDER_NAME = 'your-custom-folder'  # 手动设置的主文件夹名称
# ===================== 配置部分结束 =====================
# 初始化 S3 客户端,使用 Alist 的 IP + 端口作为 endpoint_url
s3 = boto3.client(
    's3',
    aws_access_key_id=AWS_ACCESS_KEY_ID,  # 替换为 Alist 的访问密钥
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,  # 替换为 Alist 的密钥
    endpoint_url=ALIST_S3_ENDPOINT,  # Alist S3 的 IP + 端口
    region_name='us-east-1'  # 区域随意设置一个
)
# 生成 backup+时间 文件夹名称的函数
def generate_backup_folder_name():
    # 使用当前日期时间生成文件夹名称,例如 'backup-2024-10-04-14-30'
    return f"backup-{datetime.now().strftime('%Y-%m-%d-%H-%M')}"
# 上传目录到 S3 的函数,带有自动生成的 backup+时间子文件夹名称
def upload_directory_to_s3(directory_path, bucket_name, custom_folder_name):
    try:
        # 生成 backup+时间 的子文件夹名称
        backup_folder_name = generate_backup_folder_name()
        # 在自定义的主文件夹下生成 backup+时间 的子文件夹
        full_folder_path = os.path.join(custom_folder_name, backup_folder_name)
        # 遍历指定目录中的所有文件和子目录
        for root, dirs, files in os.walk(directory_path):
            for file_name in files:
                full_file_path = os.path.join(root, file_name)  # 文件的完整路径
                # 定义 S3 中的文件路径,包含主文件夹和 backup+时间 文件夹
                s3_file_path = os.path.join(full_folder_path, os.path.relpath(full_file_path, directory_path))
                try:
                    # 上传文件到 S3
                    s3.upload_file(full_file_path, bucket_name, s3_file_path)
                    print(f"Uploaded: {full_file_path} to {bucket_name}/{s3_file_path}")
                except FileNotFoundError:
                    print(f"文件未找到: {full_file_path}")
                except NoCredentialsError:
                    print("无法找到 S3 凭证。")
                except PartialCredentialsError:
                    print("提供的 S3 凭证不完整。")
    except Exception as e:
        print(f"错误: {e}")
# 调度上传任务的函数
def schedule_upload(directory_path, bucket_name, custom_folder_name, interval_minutes):
    # 定义调度任务的函数
    def job():
        print(f"正在上传 {directory_path} 到 S3 桶 {bucket_name}...")
        upload_directory_to_s3(directory_path, bucket_name, custom_folder_name)
    # 安排任务按照指定的时间间隔运行
    schedule.every(interval_minutes).minutes.do(job)
    print(f"已安排每 {interval_minutes} 分钟上传一次。")
    # 持续运行调度程序
    while True:
        schedule.run_pending()  # 运行待处理的任务
        time.sleep(1)  # 等待 1 秒后检查下一个任务
# 主函数入口
if __name__ == "__main__":
    # 如果上传标志为 True,则立即上传一次
    if UPLOAD_NOW:
        print(f"立即上传 {DIRECTORY_TO_UPLOAD} 到 S3 桶 {S3_BUCKET_NAME}...")
        upload_directory_to_s3(DIRECTORY_TO_UPLOAD, S3_BUCKET_NAME, CUSTOM_FOLDER_NAME)
  
    # 根据 SCHEDULED_UPLOAD 判断是否定期上传
    if SCHEDULED_UPLOAD:
        # 启动上传任务的调度
        schedule_upload(DIRECTORY_TO_UPLOAD, S3_BUCKET_NAME, CUSTOM_FOLDER_NAME, UPLOAD_INTERVAL_MINUTES)
    else:
        print("已设置为仅执行一次上传任务。")
本地需要上传的目录
- 
变量: DIRECTORY_TO_UPLOAD
- 
描述: 指定本地需要上传的目录路径(一定要是绝对路径!!)。此目录中的文件会被上传到 S3 中。 
- 
示例: DIRECTORY_TO_UPLOAD = '/path/to/your/local_directory'将 '/path/to/your/local_directory'替换为你实际想要上传的本地目录路径。例如:DIRECTORY_TO_UPLOAD = '/home/user/documents'
2. S3 桶名称
- 
变量: S3_BUCKET_NAME
- 
描述: 指定你在 Alist S3 服务中的存储桶(bucket)名称,所有文件将被上传至该桶中。 
- 
示例: S3_BUCKET_NAME = 'your-s3-bucket-name'将 'your-s3-bucket-name'替换为你实际的 S3 桶名称,例如:S3_BUCKET_NAME = 'my-backup-bucket'
3. Alist S3 服务的 IP 和端口
- 
变量: ALIST_S3_ENDPOINT
- 
描述: 访问 Alist S3 服务的 IP 地址和端口。格式为 http://IP:PORT。
- 
示例: ALIST_S3_ENDPOINT = 'http://YOUR_IP:YOUR_PORT'将 'http://YOUR_IP:YOUR_PORT'替换为你的 Alist S3 服务的 IP 地址和端口。例如,如果服务在192.168.1.100上运行,端口为9000:ALIST_S3_ENDPOINT = 'http://192.168.1.100:9000'
4. 访问密钥 (AWS Access Key ID)
- 
变量: AWS_ACCESS_KEY_ID
- 
描述: 用于 Alist S3 服务的访问密钥,用于身份验证。 
- 
示例: AWS_ACCESS_KEY_ID = 'YOUR_AWS_ACCESS_KEY_ID'将 'YOUR_AWS_ACCESS_KEY_ID'替换为你的实际 Alist S3 访问密钥,例如:AWS_ACCESS_KEY_ID = 'ABCD1234EXAMPLE'
5. 密钥 (AWS Secret Access Key)
- 
变量: AWS_SECRET_ACCESS_KEY
- 
描述: 用于 Alist S3 服务的密钥,与访问密钥一起用于身份验证。 
- 
示例: AWS_SECRET_ACCESS_KEY = 'YOUR_AWS_SECRET_ACCESS_KEY'将 'YOUR_AWS_SECRET_ACCESS_KEY'替换为你的实际密钥,例如:AWS_SECRET_ACCESS_KEY = 'abcd1234secretEXAMPLE'
6. 手动设置的主文件夹名称
- 
变量: CUSTOM_FOLDER_NAME
- 
描述: 这是你手动设置的主文件夹名称。所有文件将会上传到 S3 中此主文件夹下的 backup+时间子文件夹中。
- 
示例: CUSTOM_FOLDER_NAME = 'your-custom-folder'例如,将此设置为 my-backups,脚本会将所有文件上传到my-backups/backup-时间的路径中。
7. 上传时间间隔(分钟)
- 
变量: UPLOAD_INTERVAL_MINUTES
- 
描述: 控制脚本自动上传的时间间隔,单位为分钟。脚本会按照该时间间隔定期上传文件。 
- 
示例: UPLOAD_INTERVAL_MINUTES = 60在此示例中,脚本会每隔 60 分钟上传一次文件。可以根据你的需求修改为不同的间隔时间。 
8. 立即上传开关
- 
变量: UPLOAD_NOW
- 
描述: 布尔值,控制脚本在启动时是否立即上传文件。如果设置为 True,脚本会在启动时立即上传;如果为False,则只按照调度时间上传。
- 
示例: UPLOAD_NOW = True设置为 True时,脚本会立即执行上传任务。如果不希望立即上传,可以将其设置为False。
9. 定期上传开关
- 
变量: SCHEDULED_UPLOAD
- 
描述: 控制是否启用定期上传。如果设置为 True,脚本会按设定的时间间隔定期执行上传。如果设置为False,脚本只会运行一次。
- 
示例: SCHEDULED_UPLOAD = True如果设置为 True,脚本会按UPLOAD_INTERVAL_MINUTES定期上传文件。设置为False时,脚本只会执行一次上传任务,然后退出。
10. 自动生成 backup+时间 子文件夹
- 
变量: generate_backup_folder_name()
- 
描述: 这个函数会自动生成一个以 backup+时间格式命名的子文件夹,用于存储每次上传的文件。
- 
生成格式: backup-YYYY-MM-DD-HH-MM,例如:backup-2024-10-04-14-30每次运行脚本,都会在手动设置的主文件夹下生成一个新的 backup+时间子文件夹,并将本地文件上传到这个子文件夹中。
运行方式:
- 
将脚本保存为 .py文件(例如upload_to_s3.py)。
- 
使用 Python 运行脚本: python3 upload_to_s3.py
- 
立即上传:如果 UPLOAD_NOW = True,脚本会立即执行上传任务。
- 
如果UPLOAD_NOW = false的时候,推荐使用宝塔的计划任务来让他自动执行 
  
- 
运行一次脚本等待几秒  
- 
定期上传:如果 SCHEDULED_UPLOAD = True,脚本会按设定的时间间隔定期上传。
示例配置:
DIRECTORY_TO_UPLOAD = '/home/user/documents'  # 本地目录
S3_BUCKET_NAME = 'my-backup-bucket'  # S3 桶名称
ALIST_S3_ENDPOINT = 'http://192.168.1.100:9000'  # Alist S3 服务 IP 和端口
AWS_ACCESS_KEY_ID = 'ABCD1234EXAMPLE'  # 访问密钥
AWS_SECRET_ACCESS_KEY = 'abcd1234secretEXAMPLE'  # 密钥
UPLOAD_INTERVAL_MINUTES = 30  # 每 30 分钟上传一次
UPLOAD_NOW = True  # 立即上传
SCHEDULED_UPLOAD = True  # 定期上传
CUSTOM_FOLDER_NAME = 'my-backups'  # 主文件夹名称
文件上传结构示例:

假设 CUSTOM_FOLDER_NAME = 'my-backups',上传后的文件路径将如下所示:
S3_BUCKET_NAME/my-backups/backup-2024-10-04-14-30/file1.txt
S3_BUCKET_NAME/my-backups/backup-2024-10-04-14-30/file2.txt
通过该脚本配置,你可以灵活设置手动文件夹名称,同时利用自动生成的 backup+时间 子文件夹来管理文件的上传,方便备份和归档管理。如果你有任何其他问题,欢迎继续咨询!
- 感谢你赐予我前进的力量
                                
                                
                                    
 
            
         
        
    

 
                                     
                                     
                                     
                                     
                                     
                