2022-09-06 06:39:21 +00:00
|
|
|
package _189
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"net/http"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/alist-org/alist/v3/drivers/base"
|
|
|
|
"github.com/alist-org/alist/v3/internal/driver"
|
|
|
|
"github.com/alist-org/alist/v3/internal/model"
|
|
|
|
"github.com/alist-org/alist/v3/pkg/utils"
|
|
|
|
"github.com/go-resty/resty/v2"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Cloud189 struct {
|
|
|
|
model.Storage
|
|
|
|
Addition
|
|
|
|
client *resty.Client
|
|
|
|
rsa Rsa
|
|
|
|
sessionKey string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Config() driver.Config {
|
|
|
|
return config
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) GetAddition() driver.Additional {
|
2022-12-13 10:03:30 +00:00
|
|
|
return &d.Addition
|
2022-09-06 06:39:21 +00:00
|
|
|
}
|
|
|
|
|
2022-12-13 10:03:30 +00:00
|
|
|
func (d *Cloud189) Init(ctx context.Context) error {
|
2023-05-11 10:48:16 +00:00
|
|
|
d.client = base.NewRestyClient().
|
|
|
|
SetHeader("Referer", "https://cloud.189.cn/")
|
2023-05-13 09:26:32 +00:00
|
|
|
return d.newLogin()
|
2022-09-06 06:39:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Drop(ctx context.Context) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
|
|
|
|
return d.getFiles(dir.GetID())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
|
|
|
|
var resp DownResp
|
|
|
|
u := "https://cloud.189.cn/api/portal/getFileInfo.action"
|
|
|
|
_, err := d.request(u, http.MethodGet, func(req *resty.Request) {
|
|
|
|
req.SetQueryParam("fileId", file.GetID())
|
|
|
|
}, &resp)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
client := resty.NewWithClient(d.client.GetClient()).SetRedirectPolicy(
|
|
|
|
resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error {
|
|
|
|
return http.ErrUseLastResponse
|
|
|
|
}))
|
|
|
|
res, err := client.R().SetHeader("User-Agent", base.UserAgent).Get("https:" + resp.FileDownloadUrl)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
log.Debugln(res.Status())
|
|
|
|
log.Debugln(res.String())
|
|
|
|
link := model.Link{}
|
|
|
|
log.Debugln("first url:", resp.FileDownloadUrl)
|
|
|
|
if res.StatusCode() == 302 {
|
|
|
|
link.URL = res.Header().Get("location")
|
|
|
|
log.Debugln("second url:", link.URL)
|
|
|
|
_, _ = client.R().Get(link.URL)
|
|
|
|
if res.StatusCode() == 302 {
|
|
|
|
link.URL = res.Header().Get("location")
|
|
|
|
}
|
|
|
|
log.Debugln("third url:", link.URL)
|
|
|
|
} else {
|
|
|
|
link.URL = resp.FileDownloadUrl
|
|
|
|
}
|
|
|
|
link.URL = strings.Replace(link.URL, "http://", "https://", 1)
|
|
|
|
return &link, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
|
|
|
|
form := map[string]string{
|
|
|
|
"parentFolderId": parentDir.GetID(),
|
|
|
|
"folderName": dirName,
|
|
|
|
}
|
|
|
|
_, err := d.request("https://cloud.189.cn/api/open/file/createFolder.action", http.MethodPost, func(req *resty.Request) {
|
|
|
|
req.SetFormData(form)
|
|
|
|
}, nil)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
|
|
|
|
isFolder := 0
|
|
|
|
if srcObj.IsDir() {
|
|
|
|
isFolder = 1
|
|
|
|
}
|
|
|
|
taskInfos := []base.Json{
|
|
|
|
{
|
|
|
|
"fileId": srcObj.GetID(),
|
|
|
|
"fileName": srcObj.GetName(),
|
|
|
|
"isFolder": isFolder,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
taskInfosBytes, err := utils.Json.Marshal(taskInfos)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
form := map[string]string{
|
|
|
|
"type": "MOVE",
|
|
|
|
"targetFolderId": dstDir.GetID(),
|
|
|
|
"taskInfos": string(taskInfosBytes),
|
|
|
|
}
|
|
|
|
_, err = d.request("https://cloud.189.cn/api/open/batch/createBatchTask.action", http.MethodPost, func(req *resty.Request) {
|
|
|
|
req.SetFormData(form)
|
|
|
|
}, nil)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
|
|
|
|
url := "https://cloud.189.cn/api/open/file/renameFile.action"
|
|
|
|
idKey := "fileId"
|
|
|
|
nameKey := "destFileName"
|
|
|
|
if srcObj.IsDir() {
|
|
|
|
url = "https://cloud.189.cn/api/open/file/renameFolder.action"
|
|
|
|
idKey = "folderId"
|
|
|
|
nameKey = "destFolderName"
|
|
|
|
}
|
|
|
|
form := map[string]string{
|
|
|
|
idKey: srcObj.GetID(),
|
|
|
|
nameKey: newName,
|
|
|
|
}
|
|
|
|
_, err := d.request(url, http.MethodPost, func(req *resty.Request) {
|
|
|
|
req.SetFormData(form)
|
|
|
|
}, nil)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
|
|
|
|
isFolder := 0
|
|
|
|
if srcObj.IsDir() {
|
|
|
|
isFolder = 1
|
|
|
|
}
|
|
|
|
taskInfos := []base.Json{
|
|
|
|
{
|
|
|
|
"fileId": srcObj.GetID(),
|
|
|
|
"fileName": srcObj.GetName(),
|
|
|
|
"isFolder": isFolder,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
taskInfosBytes, err := utils.Json.Marshal(taskInfos)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
form := map[string]string{
|
|
|
|
"type": "COPY",
|
|
|
|
"targetFolderId": dstDir.GetID(),
|
|
|
|
"taskInfos": string(taskInfosBytes),
|
|
|
|
}
|
|
|
|
_, err = d.request("https://cloud.189.cn/api/open/batch/createBatchTask.action", http.MethodPost, func(req *resty.Request) {
|
|
|
|
req.SetFormData(form)
|
|
|
|
}, nil)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Remove(ctx context.Context, obj model.Obj) error {
|
|
|
|
isFolder := 0
|
|
|
|
if obj.IsDir() {
|
|
|
|
isFolder = 1
|
|
|
|
}
|
|
|
|
taskInfos := []base.Json{
|
|
|
|
{
|
|
|
|
"fileId": obj.GetID(),
|
|
|
|
"fileName": obj.GetName(),
|
|
|
|
"isFolder": isFolder,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
taskInfosBytes, err := utils.Json.Marshal(taskInfos)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
form := map[string]string{
|
|
|
|
"type": "DELETE",
|
|
|
|
"targetFolderId": "",
|
|
|
|
"taskInfos": string(taskInfosBytes),
|
|
|
|
}
|
|
|
|
_, err = d.request("https://cloud.189.cn/api/open/batch/createBatchTask.action", http.MethodPost, func(req *resty.Request) {
|
|
|
|
req.SetFormData(form)
|
|
|
|
}, nil)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Cloud189) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
|
2022-12-21 07:03:09 +00:00
|
|
|
return d.newUpload(ctx, dstDir, stream, up)
|
2022-09-06 06:39:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var _ driver.Driver = (*Cloud189)(nil)
|