@@ -2,8 +2,15 @@ package _123Share
2
2
3
3
import (
4
4
"errors"
5
+ "fmt"
6
+ "hash/crc32"
7
+ "math"
8
+ "math/rand"
5
9
"net/http"
10
+ "net/url"
6
11
"strconv"
12
+ "strings"
13
+ "time"
7
14
8
15
"github.com/alist-org/alist/v3/drivers/base"
9
16
"github.com/alist-org/alist/v3/pkg/utils"
@@ -15,28 +22,53 @@ const (
15
22
Api = "https://www.123pan.com/api"
16
23
AApi = "https://www.123pan.com/a/api"
17
24
BApi = "https://www.123pan.com/b/api"
18
- MainApi = Api
25
+ MainApi = BApi
19
26
FileList = MainApi + "/share/get"
20
27
DownloadInfo = MainApi + "/share/download/info"
21
28
//AuthKeySalt = "8-8D$sL8gPjom7bk#cY"
22
29
)
23
30
31
+ func signPath (path string , os string , version string ) (k string , v string ) {
32
+ table := []byte {'a' , 'd' , 'e' , 'f' , 'g' , 'h' , 'l' , 'm' , 'y' , 'i' , 'j' , 'n' , 'o' , 'p' , 'k' , 'q' , 'r' , 's' , 't' , 'u' , 'b' , 'c' , 'v' , 'w' , 's' , 'z' }
33
+ random := fmt .Sprintf ("%.f" , math .Round (1e7 * rand .Float64 ()))
34
+ now := time .Now ().In (time .FixedZone ("CST" , 8 * 3600 ))
35
+ timestamp := fmt .Sprint (now .Unix ())
36
+ nowStr := []byte (now .Format ("200601021504" ))
37
+ for i := 0 ; i < len (nowStr ); i ++ {
38
+ nowStr [i ] = table [nowStr [i ]- 48 ]
39
+ }
40
+ timeSign := fmt .Sprint (crc32 .ChecksumIEEE (nowStr ))
41
+ data := strings .Join ([]string {timestamp , random , path , os , version , timeSign }, "|" )
42
+ dataSign := fmt .Sprint (crc32 .ChecksumIEEE ([]byte (data )))
43
+ return timeSign , strings .Join ([]string {timestamp , random , dataSign }, "-" )
44
+ }
45
+
46
+ func GetApi (rawUrl string ) string {
47
+ u , _ := url .Parse (rawUrl )
48
+ query := u .Query ()
49
+ query .Add (signPath (u .Path , "web" , "3" ))
50
+ u .RawQuery = query .Encode ()
51
+ return u .String ()
52
+ }
53
+
24
54
func (d * Pan123Share ) request (url string , method string , callback base.ReqCallback , resp interface {}) ([]byte , error ) {
25
55
req := base .RestyClient .R ()
26
56
req .SetHeaders (map [string ]string {
27
- "origin" : "https://www.123pan.com" ,
28
- "referer" : "https://www.123pan.com/" ,
29
- "user-agent" : "Dart/2.19(dart:io)" ,
30
- "platform" : "android" ,
31
- "app-version" : "36" ,
57
+ "origin" : "https://www.123pan.com" ,
58
+ "referer" : "https://www.123pan.com/" ,
59
+ "authorization" : "Bearer " + d .AccessToken ,
60
+ "user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) alist-client" ,
61
+ "platform" : "web" ,
62
+ "app-version" : "3" ,
63
+ //"user-agent": base.UserAgent,
32
64
})
33
65
if callback != nil {
34
66
callback (req )
35
67
}
36
68
if resp != nil {
37
69
req .SetResult (resp )
38
70
}
39
- res , err := req .Execute (method , url )
71
+ res , err := req .Execute (method , GetApi ( url ) )
40
72
if err != nil {
41
73
return nil , err
42
74
}
@@ -52,6 +84,10 @@ func (d *Pan123Share) getFiles(parentId string) ([]File, error) {
52
84
page := 1
53
85
res := make ([]File , 0 )
54
86
for {
87
+ if ! d .APIRateLimit (FileList ) {
88
+ time .Sleep (time .Millisecond * 200 )
89
+ continue
90
+ }
55
91
var resp Files
56
92
query := map [string ]string {
57
93
"limit" : "100" ,
0 commit comments