Skip to content

Commit 146a88e

Browse files
authored
Merge pull request #9422 from okatu-loli/fix/adjust-115share-api
feat(driver): Upgrade dependencies and enhance 115 cloud functionality
2 parents 84ce672 + 39962d6 commit 146a88e

File tree

7 files changed

+222
-87
lines changed

7 files changed

+222
-87
lines changed

drivers/115/driver.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ func (d *Pan115) Link(ctx context.Context, file model.Obj, args model.LinkArgs)
6666
if err := d.WaitLimit(ctx); err != nil {
6767
return nil, err
6868
}
69-
userAgent := args.Header.Get("User-Agent")
70-
downloadInfo, err := d.
71-
DownloadWithUA(file.(*FileObj).PickCode, userAgent)
69+
userAgent := ""
70+
if args.Header != nil {
71+
userAgent = args.Header.Get("User-Agent")
72+
}
73+
downloadInfo, err := d.client.DownloadWithUA(file.(*FileObj).PickCode, userAgent)
7274
if err != nil {
7375
return nil, err
7476
}

drivers/115/types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var _ model.Obj = (*FileObj)(nil)
1212

1313
type FileObj struct {
1414
driver.File
15+
ThumbURL string
1516
}
1617

1718
func (f *FileObj) CreateTime() time.Time {
@@ -22,6 +23,10 @@ func (f *FileObj) GetHash() utils.HashInfo {
2223
return utils.NewHashInfo(utils.SHA1, f.Sha1)
2324
}
2425

26+
func (f *FileObj) Thumb() string {
27+
return f.ThumbURL
28+
}
29+
2530
type UploadResult struct {
2631
driver.BasicResp
2732
Data struct {

drivers/115/util.go

Lines changed: 95 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"encoding/json"
1010
"fmt"
1111
"io"
12-
"net/http"
1312
"net/url"
1413
"strconv"
1514
"strings"
@@ -25,11 +24,28 @@ import (
2524
"github.com/aliyun/aliyun-oss-go-sdk/oss"
2625

2726
cipher "github.com/SheltonZhu/115driver/pkg/crypto/ec115"
28-
crypto "github.com/SheltonZhu/115driver/pkg/crypto/m115"
2927
driver115 "github.com/SheltonZhu/115driver/pkg/driver"
3028
"github.com/pkg/errors"
3129
)
3230

31+
type fileInfoWithThumb struct {
32+
driver115.FileInfo
33+
ThumbURL string `json:"u"`
34+
}
35+
36+
type fileListRespWithThumb struct {
37+
driver115.BasicResp
38+
CategoryID driver115.IntString `json:"cid"`
39+
Count int `json:"count"`
40+
Offset int `json:"offset"`
41+
Files []fileInfoWithThumb `json:"data"`
42+
}
43+
44+
type getFileInfoResponseWithThumb struct {
45+
driver115.BasicResp
46+
Files []*fileInfoWithThumb `json:"data"`
47+
}
48+
3349
// var UserAgent = driver115.UA115Browser
3450
func (d *Pan115) login() error {
3551
var err error
@@ -66,100 +82,113 @@ func (d *Pan115) getFiles(fileId string) ([]FileObj, error) {
6682
if d.PageSize <= 0 {
6783
d.PageSize = driver115.FileListLimit
6884
}
69-
files, err := d.client.ListWithLimit(fileId, d.PageSize, driver115.WithMultiUrls())
70-
if err != nil {
71-
return nil, err
85+
limit := d.PageSize
86+
if limit > driver115.MaxDirPageLimit {
87+
limit = driver115.MaxDirPageLimit
7288
}
73-
for _, file := range *files {
74-
res = append(res, FileObj{file})
89+
90+
opts := driver115.DefaultListOptions()
91+
driver115.WithMultiUrls()(opts)
92+
if len(opts.ApiURLs) == 0 {
93+
opts.ApiURLs = []string{driver115.ApiFileList}
7594
}
95+
96+
offset := int64(0)
97+
for i := 0; ; i++ {
98+
result, err := d.getFilesPageWithThumb(fileId, opts.ApiURLs[i%len(opts.ApiURLs)], limit, offset)
99+
if err != nil {
100+
return nil, err
101+
}
102+
for _, fileInfo := range result.Files {
103+
res = append(res, fileObjFromInfo(&fileInfo))
104+
}
105+
offset = int64(result.Offset) + limit
106+
if offset >= int64(result.Count) {
107+
break
108+
}
109+
}
110+
76111
return res, nil
77112
}
78113

79114
func (d *Pan115) getNewFile(fileId string) (*FileObj, error) {
80-
file, err := d.client.GetFile(fileId)
115+
fileInfo, err := d.getFileInfoWithThumb("file_id", fileId)
81116
if err != nil {
82117
return nil, err
83118
}
84-
return &FileObj{*file}, nil
119+
file := fileObjFromInfo(fileInfo)
120+
return &file, nil
85121
}
86122

87123
func (d *Pan115) getNewFileByPickCode(pickCode string) (*FileObj, error) {
88-
result := driver115.GetFileInfoResponse{}
89-
req := d.client.NewRequest().
90-
SetQueryParam("pick_code", pickCode).
91-
ForceContentType("application/json;charset=UTF-8").
92-
SetResult(&result)
93-
resp, err := req.Get(driver115.ApiFileInfo)
94-
if err := driver115.CheckErr(err, &result, resp); err != nil {
124+
fileInfo, err := d.getFileInfoWithThumb("pick_code", pickCode)
125+
if err != nil {
95126
return nil, err
96127
}
97-
if len(result.Files) == 0 {
98-
return nil, errors.New("not get file info")
99-
}
100-
fileInfo := result.Files[0]
101-
102-
f := &FileObj{}
103-
f.From(fileInfo)
104-
return f, nil
128+
file := fileObjFromInfo(fileInfo)
129+
return &file, nil
105130
}
106131

107132
func (d *Pan115) getUA() string {
108133
return fmt.Sprintf("Mozilla/5.0 115Browser/%s", appVer)
109134
}
110135

111-
func (d *Pan115) DownloadWithUA(pickCode, ua string) (*driver115.DownloadInfo, error) {
112-
key := crypto.GenerateKey()
113-
result := driver115.DownloadResp{}
114-
params, err := utils.Json.Marshal(map[string]string{"pick_code": pickCode})
115-
if err != nil {
116-
return nil, err
117-
}
118-
119-
data := crypto.Encode(params, key)
120-
121-
bodyReader := strings.NewReader(url.Values{"data": []string{data}}.Encode())
122-
reqUrl := fmt.Sprintf("%s?t=%s", driver115.AndroidApiDownloadGetUrl, driver115.Now().String())
123-
req, _ := http.NewRequest(http.MethodPost, reqUrl, bodyReader)
124-
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
125-
req.Header.Set("Cookie", d.Cookie)
126-
req.Header.Set("User-Agent", ua)
127-
128-
resp, err := d.client.Client.GetClient().Do(req)
129-
if err != nil {
130-
return nil, err
136+
func fileObjFromInfo(fileInfo *fileInfoWithThumb) FileObj {
137+
file := &driver115.File{}
138+
file.From(&fileInfo.FileInfo)
139+
return FileObj{
140+
File: *file,
141+
ThumbURL: fileInfo.ThumbURL,
131142
}
132-
defer resp.Body.Close()
143+
}
133144

134-
body, err := io.ReadAll(resp.Body)
135-
if err != nil {
145+
func (d *Pan115) getFileInfoWithThumb(queryKey, queryVal string) (*fileInfoWithThumb, error) {
146+
result := getFileInfoResponseWithThumb{}
147+
req := d.client.NewRequest().
148+
SetQueryParam(queryKey, queryVal).
149+
ForceContentType("application/json;charset=UTF-8").
150+
SetResult(&result)
151+
resp, err := req.Get(driver115.ApiFileInfo)
152+
if err := driver115.CheckErr(err, &result, resp); err != nil {
136153
return nil, err
137154
}
138-
if err := utils.Json.Unmarshal(body, &result); err != nil {
139-
return nil, err
155+
if len(result.Files) == 0 {
156+
return nil, errors.New("not get file info")
140157
}
158+
return result.Files[0], nil
159+
}
141160

142-
if err = result.Err(string(body)); err != nil {
143-
return nil, err
161+
func (d *Pan115) getFilesPageWithThumb(dirID, apiURL string, limit, offset int64) (*fileListRespWithThumb, error) {
162+
if dirID == "" {
163+
dirID = "0"
164+
}
165+
result := fileListRespWithThumb{}
166+
params := map[string]string{
167+
"aid": "1",
168+
"cid": dirID,
169+
"o": driver115.FileOrderByTime,
170+
"asc": "1",
171+
"offset": strconv.FormatInt(offset, 10),
172+
"show_dir": "1",
173+
"limit": strconv.FormatInt(limit, 10),
174+
"snap": "0",
175+
"natsort": "0",
176+
"record_open_time": "1",
177+
"format": "json",
178+
"fc_mix": "0",
144179
}
145-
146-
b, err := crypto.Decode(string(result.EncodedData), key)
147-
if err != nil {
180+
req := d.client.NewRequest().
181+
ForceContentType("application/json;charset=UTF-8").
182+
SetQueryParams(params).
183+
SetResult(&result)
184+
resp, err := req.Get(apiURL)
185+
if err := driver115.CheckErr(err, &result, resp); err != nil {
148186
return nil, err
149187
}
150-
151-
downloadInfo := struct {
152-
Url string `json:"url"`
153-
}{}
154-
if err := utils.Json.Unmarshal(b, &downloadInfo); err != nil {
155-
return nil, err
188+
if dirID != string(result.CategoryID) {
189+
return nil, driver115.ErrUnexpected
156190
}
157-
158-
info := &driver115.DownloadInfo{}
159-
info.PickCode = pickCode
160-
info.Header = resp.Request.Header
161-
info.Url.Url = downloadInfo.Url
162-
return info, nil
191+
return &result, nil
163192
}
164193

165194
func (c *Pan115) GenerateToken(fileID, preID, timeStamp, fileSize, signKey, signVal string) string {

drivers/115_share/driver.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
driver115 "github.com/SheltonZhu/115driver/pkg/driver"
7+
"github.com/alist-org/alist/v3/drivers/base"
78
"github.com/alist-org/alist/v3/internal/driver"
89
"github.com/alist-org/alist/v3/internal/errs"
910
"github.com/alist-org/alist/v3/internal/model"
@@ -50,19 +51,17 @@ func (d *Pan115Share) List(ctx context.Context, dir model.Obj, args model.ListAr
5051
return nil, err
5152
}
5253

53-
files := make([]driver115.ShareFile, 0)
54-
fileResp, err := d.client.GetShareSnap(d.ShareCode, d.ReceiveCode, dir.GetID(), driver115.QueryLimit(int(d.PageSize)))
54+
ua := base.UserAgent
55+
files := make([]shareFile, 0)
56+
fileResp, err := d.getShareSnapWithUA(ua, dir.GetID(), driver115.QueryLimit(int(d.PageSize)))
5557
if err != nil {
5658
return nil, err
5759
}
5860
files = append(files, fileResp.Data.List...)
5961
total := fileResp.Data.Count
6062
count := len(fileResp.Data.List)
6163
for total > count {
62-
fileResp, err := d.client.GetShareSnap(
63-
d.ShareCode, d.ReceiveCode, dir.GetID(),
64-
driver115.QueryLimit(int(d.PageSize)), driver115.QueryOffset(count),
65-
)
64+
fileResp, err := d.getShareSnapWithUA(ua, dir.GetID(), driver115.QueryLimit(int(d.PageSize)), driver115.QueryOffset(count))
6665
if err != nil {
6766
return nil, err
6867
}
@@ -77,7 +76,14 @@ func (d *Pan115Share) Link(ctx context.Context, file model.Obj, args model.LinkA
7776
if err := d.WaitLimit(ctx); err != nil {
7877
return nil, err
7978
}
80-
downloadInfo, err := d.client.DownloadByShareCode(d.ShareCode, d.ReceiveCode, file.GetID())
79+
ua := ""
80+
if args.Header != nil {
81+
ua = args.Header.Get("User-Agent")
82+
}
83+
if ua == "" {
84+
ua = base.UserAgent
85+
}
86+
downloadInfo, err := d.downloadByShareCodeWithUA(ua, file.GetID())
8187
if err != nil {
8288
return nil, err
8389
}

0 commit comments

Comments
 (0)