利用 Alist 的 api 实现文件上传,同步,获取直链地址等操作

前言 最近有一个,采集资源并分享的需求。而对于资源下载,没有钱,alist绝对是一个很好的选择。 如果你不知道Alist是什么,可以去看一下他的开源地址: Git :https://github.com/alist-org/alist Doc : https://alist.nn.ci/zh/ 现在

前言

最近有一个,采集资源并分享的需求。而对于资源下载,没有钱,alist绝对是一个很好的选择。

如果你不知道Alist是什么,可以去看一下他的开源地址:

Git :https://github.com/alist-org/alist

Doc : https://alist.nn.ci/zh/

现在我想实现的功能就是利用Alist的api实现,将资源直接上传到网盘,并获取直链并定时更新。当然,这里并不会全部贴出来,主要简单记录一下上传。

正文

实现文件上传,Alist 提供了两个 api,先看第一个

/api/fs/form 表单上传文件

import os
import requests
import json
from requests_toolbelt import MultipartEncoder

# 获取token
url = 'https://pan.xxx.com/api/auth/login'
d = {'Username': 'admin', 'Password': 'admin'}
r = requests.post(url, data=d)
print(r.text)
token = json.loads(r.text)['data']['token']
print(token)
upload_url = 'http://xxx:5244/api/fs/form'
file_path = '/alist/ipa/Vivid.ipa'  # 文件路径
data = MultipartEncoder(
    fields={
        'file': (file_path, open(file_path, 'rb'))
    }
)
file_size = os.path.getsize(file_path)
file_name = os.path.basename(file_path)
target_path = '/ipa/' + file_name  # 目标路径
headers = {
    'Authorization': token,
    'Content-Type': data.content_type,
    'file-path': target_path,
    'Content-Length': str(file_size),
    'As-Task': 'true'  # 根据需求添加
}
# print(headers)
r = requests.put(upload_url, data=data, headers=headers)
print(r.text)

代码很简单,先获取token,再利用token请求上传,具体参数直接看文档。

url 请求token用的,d填入账号密码,upload_url 上传地址,这里我单独列出来的,因为之前踩坑了,nginx反代之后会有很多限制,所以上传地址,推荐直接用ip:端口。file-path 就是上传到Alist后的目录,例如/ipa/Vivid.ipa ,是文件完整路径,不仅仅是目录路径。

/api/fs/put 流式上传

这两个api的具体区别我也没了解过,大概就字面意思。(能用就行)

import json
import os
from shlex import quote
import requests

# 获取token
url = 'https://pan..com/api/auth/login'
d = {'Username': 'admin', 'Password': 'admin'}
r = requests.post(url, data=d)
print(r.text)
token = json.loads(r.text)['data']['token']
# 文件路径和API细节
api_url = 'http://xxxx:5244/api/fs/put'  # 替换为您的API URL
file_path = '/alist/ipa/Vivid.ipa'  # 文件路径
file_name = os.path.basename(file_path)
target_path = '/ipa/' + file_name  # 目标路径

# 读取文件和设置headers
file_size = os.path.getsize(file_path)
headers = {
    'Authorization': token,
    'File-Path': quote(target_path),  # URL编码
    'Content-Type': 'application/octet-stream',
    'Content-Length': str(file_size),
    'As-Task': 'true'  # 根据需求添加
}
# 执行PUT请求上传文件
with open(file_path, 'rb') as f:
    response = requests.put(api_url, headers=headers, data=f)

# 检查响应
if response.status_code == 200:
    print("Upload successful.")
else:
    print(f"Upload failed. Status code: {response.status_code} - Message: {response.text}")

差不多的代码,一样的功能。自己看看就懂了。

补充

上面只是写出来简单的示例,并不能实现完整功能,这里补充几个我用到的api。

/api/fs/copy 复制

这个可以拿来将已经上传的文件同步到其他储存盘,当然,用的是你服务器的带宽。

/api/fs/get 获取资源信息

利用这个就可以获取到资源的直链。

看下请求 body 的 JSON

{
    "path": "/ipa/Vivid.ipa",
    "password": "",
    "page": 1,
    "per_page": 0,
    "refresh": false
}

这个path 眼熟吗?没错,就是我们之前上传文件时候填的 file-path

有了这几个api,开头想要实现的上传文件,获取直链的功能基本实现了。剩下的什么定时更新啥的,就没事好说的了。

Alist api 挺齐全的,玩法也很多,可以根据自己需要灵活搭配使用。