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
3450func (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
79114func (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
87123func (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
107132func (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
165194func (c * Pan115 ) GenerateToken (fileID , preID , timeStamp , fileSize , signKey , signVal string ) string {
0 commit comments