前言
最近有一个,采集资源并分享的需求。而对于资源下载,没有钱,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 挺齐全的,玩法也很多,可以根据自己需要灵活搭配使用。