找回密码
 立即注册
查看: 583|回复: 0

如何将备份上传到alist--修改

[复制链接]

1

主题

0

回帖

203

积分

中级会员

积分
203
发表于 2024-9-12 20:18:47 | 显示全部楼层 |阅读模式
本帖最后由 fly 于 2024-9-13 11:39 编辑


import requests
import os
import urllib.parse
import tkinter as tk
import json

# Alist 路径,填写你自己的域名或IP地址
BASE_URL = 'https://alist.xxx.xxx'  # 有域名就填域名
# BASE_URL = 'http://127.0.0.1:5244'  # 没有域名就填IP地址

# 登录函数,获取用户的 token
# 参数: 用户名, 密码
# 返回: 登录成功后的 token
def login(username, password):
    url = f'{BASE_URL}/api/auth/login'
    data = {'Username': username, 'Password': password}
    response = requests.post(url, data=data)
    response_data = response.json()
    return response_data['data']['token']

# 获取本地文件夹中的最后一个文件
# 参数: 文件夹路径
# 返回: 文件夹中的最后一个文件名,若文件夹为空返回 None
def get_last_file(directory):
    files = os.listdir(directory)
    if files:
        return files[-1]  # 返回文件夹中的最后一个文件
    return None

# 显示提示信息的弹窗
# 参数: 提示内容, 弹窗标题 (默认值为 "提示")
def show_message(message, title="提示"):
    root = tk.Tk()
    root.title(title)  # 设置弹窗标题
    label = tk.Label(root, text=message, font=("Helvetica", 16))
    label.pack(expand=True, fill='both')  # 调整标签大小
    root.geometry("400x400")  # 设置窗口大小为 400x400
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    # 设置窗口在屏幕中央显示
    root.geometry(f"+{screen_width // 2 - 200}+{screen_height // 2 - 200}")
    # 3秒后自动关闭弹窗
    root.after(3000, root.destroy)
    root.mainloop()  # 启动事件循环

# 上传文件到云端的函数
# 参数: token, 本地文件路径, 云端文件路径
# 返回: 上传的响应结果 (字典格式)
def upload_file(token, local_file_path, remote_file_path):
    url = f'{BASE_URL}/api/fs/put'
    # 对云端文件路径进行 URL 编码,防止特殊字符导致请求失败
    encoded_remote_path = urllib.parse.quote(remote_file_path)
   
    # 请求头信息,包括 token 认证和上传文件路径等
    headers = {
        'Authorization': token,  # 使用登录获取的 token 进行认证
        'File-Path': encoded_remote_path,  # 文件存储路径
        'As-Task': 'true',  # 标记为任务,异步处理
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
        'Content-Type': 'application/octet-stream'  # 文件类型为二进制流
    }

    # 以二进制模式读取文件内容,并发起 PUT 请求上传
    with open(local_file_path, 'rb') as file:
        response = requests.put(url, headers=headers, data=file)
    return response.json()

# 主程序入口,控制整个上传流程
def main():
    # Alist 登录的用户名和密码
    username = 'admin'   #用户名和密码,修改为你自己的用户名和密码
    password = 'xxx'
   
    # 本地和云端文件夹路径
    local_directory = r'D:\backup\zTasker\浏览器备份\谷歌浏览器'  #本地电脑文件夹路径,修改为你自己的
    remote_directory = '/Onedrive/AdeleV/浏览器备份/'     #alist上你要存放备份的路径,修改为你自己的

    # 登录并获取 token
    token = login(username, password)
    print('Token:', token)  # 打印 token 以供调试使用

    # 获取本地文件夹中的最后一个文件
    last_file = get_last_file(local_directory)
    if not last_file:  # 如果文件夹为空,直接返回
        print("文件夹为空")
        return

    # 拼接本地文件路径和云端文件路径
    local_file_path = os.path.join(local_directory, last_file)
    remote_file_path = os.path.join(remote_directory, last_file)
    print(f"上传文件: {local_file_path}")
    print(f"云端路径: {remote_file_path}")

    # 上传文件,并获取服务器返回的响应
    response = upload_file(token, local_file_path, remote_file_path)
    print('Response:', response)  # 打印响应结果,便于调试

    # 根据服务器返回的结果显示提示信息 这里显示弹窗的,如果不想显示弹窗就把下面这段注释掉
    if response.get("message") == "success":
        show_message("备份成功,正在传输中...", "备份成功")
    else:
        show_message("任务失败,请检查并重试。", "任务失败")

# 程序执行入口
if __name__ == "__main__":
    main()



代码都是网上找的和智谱清言上问的,所以代码比较乱,但是我可以确保代码没问题,可以正常上传,配合zTasker 任务类型  运行cmd命令   python D:\backup\zTasker\33.py  python文件路径改成你们自己的就行


修改--我用gpt优化了一下代码,添加了详细的注释,只要你懂一点编程的基本都能看懂,注释很详细,有什么需要修改或想添加功能的问GPT就行,现在AI在编程这块还是很强大的

评分

参与人数 1威望 +1 金钱 +100 贡献 +5 收起 理由
作者君 + 1 + 100 + 5

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|zTasker

GMT+8, 2025-6-6 11:40 , Processed in 0.053265 second(s), 25 queries .

快速回复 返回顶部 返回列表