feat(thunderx): generate UserAgent automatically (#6664)
This commit is contained in:
@ -1,12 +1,14 @@
|
||||
package thunderx
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"crypto/sha1"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/alist-org/alist/v3/drivers/base"
|
||||
@ -20,6 +22,33 @@ const (
|
||||
XLUSER_API_URL = "https://xluser-ssl.xunleix.com/v1"
|
||||
)
|
||||
|
||||
var Algorithms = []string{
|
||||
"kVy0WbPhiE4v6oxXZ88DvoA3Q",
|
||||
"lON/AUoZKj8/nBtcE85mVbkOaVdVa",
|
||||
"rLGffQrfBKH0BgwQ33yZofvO3Or",
|
||||
"FO6HWqw",
|
||||
"GbgvyA2",
|
||||
"L1NU9QvIQIH7DTRt",
|
||||
"y7llk4Y8WfYflt6",
|
||||
"iuDp1WPbV3HRZudZtoXChxH4HNVBX5ZALe",
|
||||
"8C28RTXmVcco0",
|
||||
"X5Xh",
|
||||
"7xe25YUgfGgD0xW3ezFS",
|
||||
"",
|
||||
"CKCR",
|
||||
"8EmDjBo6h3eLaK7U6vU2Qys0NsMx",
|
||||
"t2TeZBXKqbdP09Arh9C3",
|
||||
}
|
||||
|
||||
const (
|
||||
ClientID = "ZQL_zwA4qhHcoe_2"
|
||||
ClientSecret = "Og9Vr1L8Ee6bh0olFxFDRg"
|
||||
ClientVersion = "1.06.0.2132"
|
||||
PackageName = "com.thunder.downloader"
|
||||
DownloadUserAgent = "Dalvik/2.1.0 (Linux; U; Android 13; M2004J7AC Build/SP1A.210812.016)"
|
||||
SdkVersion = "2.0.3.203100 "
|
||||
)
|
||||
|
||||
const (
|
||||
FOLDER = "drive#folder"
|
||||
FILE = "drive#file"
|
||||
@ -42,7 +71,7 @@ type Common struct {
|
||||
client *resty.Client
|
||||
|
||||
captchaToken string
|
||||
|
||||
userID string
|
||||
// 签名相关,二选一
|
||||
Algorithms []string
|
||||
Timestamp, CaptchaSign string
|
||||
@ -61,6 +90,18 @@ type Common struct {
|
||||
refreshCTokenCk func(token string)
|
||||
}
|
||||
|
||||
func (c *Common) SetDeviceID(deviceID string) {
|
||||
c.DeviceID = deviceID
|
||||
}
|
||||
|
||||
func (c *Common) SetUserID(userID string) {
|
||||
c.userID = userID
|
||||
}
|
||||
|
||||
func (c *Common) SetUserAgent(userAgent string) {
|
||||
c.UserAgent = userAgent
|
||||
}
|
||||
|
||||
func (c *Common) SetCaptchaToken(captchaToken string) {
|
||||
c.captchaToken = captchaToken
|
||||
}
|
||||
@ -145,7 +186,7 @@ func (c *Common) refreshCaptchaToken(action string, metas map[string]string) err
|
||||
return nil
|
||||
}
|
||||
|
||||
// 只有基础信息的请求
|
||||
// Request 只有基础信息的请求
|
||||
func (c *Common) Request(url, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
|
||||
req := c.client.R().SetHeaders(map[string]string{
|
||||
"user-agent": c.UserAgent,
|
||||
@ -200,3 +241,57 @@ func getGcid(r io.Reader, size int64) (string, error) {
|
||||
}
|
||||
return hex.EncodeToString(hash1.Sum(nil)), nil
|
||||
}
|
||||
|
||||
func generateDeviceSign(deviceID, packageName string) string {
|
||||
|
||||
signatureBase := fmt.Sprintf("%s%s%s%s", deviceID, packageName, "1", "appkey")
|
||||
|
||||
sha1Hash := sha1.New()
|
||||
sha1Hash.Write([]byte(signatureBase))
|
||||
sha1Result := sha1Hash.Sum(nil)
|
||||
|
||||
sha1String := hex.EncodeToString(sha1Result)
|
||||
|
||||
md5Hash := md5.New()
|
||||
md5Hash.Write([]byte(sha1String))
|
||||
md5Result := md5Hash.Sum(nil)
|
||||
|
||||
md5String := hex.EncodeToString(md5Result)
|
||||
|
||||
deviceSign := fmt.Sprintf("div101.%s%s", deviceID, md5String)
|
||||
|
||||
return deviceSign
|
||||
}
|
||||
|
||||
func BuildCustomUserAgent(deviceID, clientID, appName, sdkVersion, clientVersion, packageName, userID string) string {
|
||||
deviceSign := generateDeviceSign(deviceID, packageName)
|
||||
var sb strings.Builder
|
||||
|
||||
sb.WriteString(fmt.Sprintf("ANDROID-%s/%s ", appName, clientVersion))
|
||||
sb.WriteString("protocolVersion/200 ")
|
||||
sb.WriteString("accesstype/ ")
|
||||
sb.WriteString(fmt.Sprintf("clientid/%s ", clientID))
|
||||
sb.WriteString(fmt.Sprintf("clientversion/%s ", clientVersion))
|
||||
sb.WriteString("action_type/ ")
|
||||
sb.WriteString("networktype/WIFI ")
|
||||
sb.WriteString("sessionid/ ")
|
||||
sb.WriteString(fmt.Sprintf("deviceid/%s ", deviceID))
|
||||
sb.WriteString("providername/NONE ")
|
||||
sb.WriteString(fmt.Sprintf("devicesign/%s ", deviceSign))
|
||||
sb.WriteString("refresh_token/ ")
|
||||
sb.WriteString(fmt.Sprintf("sdkversion/%s ", sdkVersion))
|
||||
sb.WriteString(fmt.Sprintf("datetime/%d ", time.Now().UnixMilli()))
|
||||
sb.WriteString(fmt.Sprintf("usrno/%s ", userID))
|
||||
sb.WriteString(fmt.Sprintf("appname/%s ", appName))
|
||||
sb.WriteString(fmt.Sprintf("session_origin/ "))
|
||||
sb.WriteString(fmt.Sprintf("grant_type/ "))
|
||||
sb.WriteString(fmt.Sprintf("appid/ "))
|
||||
sb.WriteString(fmt.Sprintf("clientip/ "))
|
||||
sb.WriteString(fmt.Sprintf("devicename/Xiaomi_M2004j7ac "))
|
||||
sb.WriteString(fmt.Sprintf("osversion/13 "))
|
||||
sb.WriteString(fmt.Sprintf("platformversion/10 "))
|
||||
sb.WriteString(fmt.Sprintf("accessmode/ "))
|
||||
sb.WriteString(fmt.Sprintf("devicemodel/M2004J7AC "))
|
||||
|
||||
return sb.String()
|
||||
}
|
||||
|
Reference in New Issue
Block a user