fix(115): use latest appVer for upload (close #7315)

renovate/github.com-city404-v6-public-rpc-proto-go-digest v3.38.0
Andy Hsu 2024-10-12 00:48:54 +08:00
parent 5f19d73fcc
commit c3e43ff605
3 changed files with 66 additions and 25 deletions

43
drivers/115/appver.go Normal file
View File

@ -0,0 +1,43 @@
package _115
import (
driver115 "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/alist-org/alist/v3/drivers/base"
log "github.com/sirupsen/logrus"
)
var (
md5Salt = "Qclm8MGWUv59TnrR0XPg"
appVer = "27.0.5.7"
)
func (d *Pan115) getAppVersion() ([]driver115.AppVersion, error) {
result := driver115.VersionResp{}
resp, err := base.RestyClient.R().Get(driver115.ApiGetVersion)
err = driver115.CheckErr(err, &result, resp)
if err != nil {
return nil, err
}
return result.Data.GetAppVersions(), nil
}
func (d *Pan115) getAppVer() string {
// todo add some cache
vers, err := d.getAppVersion()
if err != nil {
log.Warnf("[115] get app version failed: %v", err)
return appVer
}
for _, ver := range vers {
if ver.AppName == "win" {
return ver.Version
}
}
return appVer
}
func (d *Pan115) initAppVer() {
appVer = d.getAppVer()
}

View File

@ -3,6 +3,7 @@ package _115
import ( import (
"context" "context"
"strings" "strings"
"sync"
driver115 "github.com/SheltonZhu/115driver/pkg/driver" driver115 "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/alist-org/alist/v3/internal/driver" "github.com/alist-org/alist/v3/internal/driver"
@ -16,8 +17,9 @@ import (
type Pan115 struct { type Pan115 struct {
model.Storage model.Storage
Addition Addition
client *driver115.Pan115Client client *driver115.Pan115Client
limiter *rate.Limiter limiter *rate.Limiter
appVerOnce sync.Once
} }
func (d *Pan115) Config() driver.Config { func (d *Pan115) Config() driver.Config {
@ -29,6 +31,7 @@ func (d *Pan115) GetAddition() driver.Additional {
} }
func (d *Pan115) Init(ctx context.Context) error { func (d *Pan115) Init(ctx context.Context) error {
d.appVerOnce.Do(d.initAppVer)
if d.LimitRate > 0 { if d.LimitRate > 0 {
d.limiter = rate.NewLimiter(rate.Limit(d.LimitRate), 1) d.limiter = rate.NewLimiter(rate.Limit(d.LimitRate), 1)
} }

View File

@ -2,7 +2,9 @@ package _115
import ( import (
"bytes" "bytes"
"crypto/md5"
"crypto/tls" "crypto/tls"
"encoding/hex"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
@ -26,12 +28,12 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
var UserAgent = driver115.UA115Browser //var UserAgent = driver115.UA115Browser
func (d *Pan115) login() error { func (d *Pan115) login() error {
var err error var err error
opts := []driver115.Option{ opts := []driver115.Option{
driver115.UA(UserAgent), driver115.UA(d.getUA()),
func(c *driver115.Pan115Client) { func(c *driver115.Pan115Client) {
c.Client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: conf.Conf.TlsInsecureSkipVerify}) c.Client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: conf.Conf.TlsInsecureSkipVerify})
}, },
@ -73,25 +75,11 @@ func (d *Pan115) getFiles(fileId string) ([]FileObj, error) {
return res, nil return res, nil
} }
const ( func (d *Pan115) getUA() string {
appVer = "27.0.3.7" return fmt.Sprintf("Mozilla/5.0 115Browser/%s", appVer)
)
func (c *Pan115) getAppVer() string {
// todo add some cache
vers, err := c.client.GetAppVersion()
if err != nil {
return appVer
}
for _, ver := range vers {
if ver.AppName == "win" {
return ver.Version
}
}
return appVer
} }
func (c *Pan115) DownloadWithUA(pickCode, ua string) (*driver115.DownloadInfo, error) { func (d *Pan115) DownloadWithUA(pickCode, ua string) (*driver115.DownloadInfo, error) {
key := crypto.GenerateKey() key := crypto.GenerateKey()
result := driver115.DownloadResp{} result := driver115.DownloadResp{}
params, err := utils.Json.Marshal(map[string]string{"pickcode": pickCode}) params, err := utils.Json.Marshal(map[string]string{"pickcode": pickCode})
@ -105,10 +93,10 @@ func (c *Pan115) DownloadWithUA(pickCode, ua string) (*driver115.DownloadInfo, e
reqUrl := fmt.Sprintf("%s?t=%s", driver115.ApiDownloadGetUrl, driver115.Now().String()) reqUrl := fmt.Sprintf("%s?t=%s", driver115.ApiDownloadGetUrl, driver115.Now().String())
req, _ := http.NewRequest(http.MethodPost, reqUrl, bodyReader) req, _ := http.NewRequest(http.MethodPost, reqUrl, bodyReader)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Cookie", c.Cookie) req.Header.Set("Cookie", d.Cookie)
req.Header.Set("User-Agent", ua) req.Header.Set("User-Agent", ua)
resp, err := c.client.Client.GetClient().Do(req) resp, err := d.client.Client.GetClient().Do(req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -146,6 +134,13 @@ func (c *Pan115) DownloadWithUA(pickCode, ua string) (*driver115.DownloadInfo, e
return nil, driver115.ErrUnexpected return nil, driver115.ErrUnexpected
} }
func (c *Pan115) GenerateToken(fileID, preID, timeStamp, fileSize, signKey, signVal string) string {
userID := strconv.FormatInt(c.client.UserID, 10)
userIDMd5 := md5.Sum([]byte(userID))
tokenMd5 := md5.Sum([]byte(md5Salt + fileID + fileSize + signKey + signVal + userID + timeStamp + hex.EncodeToString(userIDMd5[:]) + appVer))
return hex.EncodeToString(tokenMd5[:])
}
func (d *Pan115) rapidUpload(fileSize int64, fileName, dirID, preID, fileID string, stream model.FileStreamer) (*driver115.UploadInitResp, error) { func (d *Pan115) rapidUpload(fileSize int64, fileName, dirID, preID, fileID string, stream model.FileStreamer) (*driver115.UploadInitResp, error) {
var ( var (
ecdhCipher *cipher.EcdhCipher ecdhCipher *cipher.EcdhCipher
@ -165,7 +160,7 @@ func (d *Pan115) rapidUpload(fileSize int64, fileName, dirID, preID, fileID stri
userID := strconv.FormatInt(d.client.UserID, 10) userID := strconv.FormatInt(d.client.UserID, 10)
form := url.Values{} form := url.Values{}
form.Set("appid", "0") form.Set("appid", "0")
form.Set("appversion", d.getAppVer()) form.Set("appversion", appVer)
form.Set("userid", userID) form.Set("userid", userID)
form.Set("filename", fileName) form.Set("filename", fileName)
form.Set("filesize", fileSizeStr) form.Set("filesize", fileSizeStr)
@ -186,7 +181,7 @@ func (d *Pan115) rapidUpload(fileSize int64, fileName, dirID, preID, fileID stri
} }
form.Set("t", t.String()) form.Set("t", t.String())
form.Set("token", d.client.GenerateToken(fileID, preID, t.String(), fileSizeStr, signKey, signVal)) form.Set("token", d.GenerateToken(fileID, preID, t.String(), fileSizeStr, signKey, signVal))
if signKey != "" && signVal != "" { if signKey != "" && signVal != "" {
form.Set("sign_key", signKey) form.Set("sign_key", signKey)
form.Set("sign_val", signVal) form.Set("sign_val", signVal)