Skip to content

Commit

Permalink
feat: 支持多个sign地址
Browse files Browse the repository at this point in the history
  • Loading branch information
Redmomn committed Jul 24, 2024
1 parent 856a588 commit e1b14ff
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 35 deletions.
8 changes: 4 additions & 4 deletions client/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
)

// NewClient 创建一个新的 QQ Client
func NewClient(uin uint32, signUrl string, appInfo *auth.AppInfo) *QQClient {
func NewClient(uin uint32, appInfo *auth.AppInfo, signUrl ...string) *QQClient {
client := &QQClient{
Uin: uin,
oicq: oicq.NewCodec(int64(uin)),
Expand All @@ -36,9 +36,9 @@ func NewClient(uin uint32, signUrl string, appInfo *auth.AppInfo) *QQClient {
},
alive: true,
}
client.signProvider = sign.NewProviderURL(signUrl, func(msg string) {
client.signProvider = sign.NewProviderURL(func(msg string) {
client.debugln(msg)
})
}, signUrl...)
client.transport.Version = appInfo
client.transport.Sig.D2Key = make([]byte, 0, 16)
client.highwaySession.Uin = &client.transport.Sig.Uin
Expand All @@ -50,7 +50,7 @@ func NewClient(uin uint32, signUrl string, appInfo *auth.AppInfo) *QQClient {

type QQClient struct {
Uin uint32
signProvider sign.Provider
signProvider []sign.Provider

stat Statistics
once sync.Once
Expand Down
10 changes: 8 additions & 2 deletions client/packet.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,14 @@ import (
func (c *QQClient) uniPacket(command string, body []byte) (uint32, []byte) {
seq := c.getAndIncreaseSequence()
var sign map[string]string
if c.signProvider != nil {
sign = c.signProvider(command, seq, body)
// todo: 实现自动选择sign
if len(c.signProvider) != 0 {
for _, signProvider := range c.signProvider {
if sign = signProvider(command, seq, body); sign == nil {
continue
}
}

}
req := network.Request{
SequenceID: seq,
Expand Down
60 changes: 32 additions & 28 deletions client/sign/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,42 +70,46 @@ func containSignPKG(cmd string) bool {
return ok
}

func NewProviderURL(rawUrl string, log func(msg string)) func(string, uint32, []byte) map[string]string {
if rawUrl == "" {
func NewProviderURL(log func(msg string), rawUrls ...string) []Provider {
if len(rawUrls) == 0 {
return nil
}
return func(cmd string, seq uint32, buf []byte) map[string]string {
if !containSignPKG(cmd) {
return nil
}
startTime := time.Now().UnixMilli()
resp := signResponse{}
sb := strings.Builder{}
sb.WriteString(`{"cmd":"` + cmd + `",`)
sb.WriteString(`"seq":` + strconv.Itoa(int(seq)) + `,`)
sb.WriteString(`"src":"` + fmt.Sprintf("%x", buf) + `"}`)
err := httpPost(rawUrl, bytes.NewReader(utils.S2B(sb.String())), 8*time.Second, &resp)
if err != nil || resp.Value.Sign == "" {
err := httpGet(rawUrl, map[string]string{
"cmd": cmd,
"seq": strconv.Itoa(int(seq)),
"src": fmt.Sprintf("%x", buf),
}, 8*time.Second, &resp)
if err != nil {
log(err.Error())
providers := make([]Provider, len(rawUrls))
for i, rawUrl := range rawUrls {
providers[i] = func(cmd string, seq uint32, buf []byte) map[string]string {
if !containSignPKG(cmd) {
return nil
}
}
startTime := time.Now().UnixMilli()
resp := signResponse{}
sb := strings.Builder{}
sb.WriteString(`{"cmd":"` + cmd + `",`)
sb.WriteString(`"seq":` + strconv.Itoa(int(seq)) + `,`)
sb.WriteString(`"src":"` + fmt.Sprintf("%x", buf) + `"}`)
err := httpPost(rawUrl, bytes.NewReader(utils.S2B(sb.String())), 8*time.Second, &resp)
if err != nil || resp.Value.Sign == "" {
err := httpGet(rawUrl, map[string]string{
"cmd": cmd,
"seq": strconv.Itoa(int(seq)),
"src": fmt.Sprintf("%x", buf),
}, 8*time.Second, &resp)
if err != nil {
log(err.Error())
return nil
}
}

log(fmt.Sprintf("signed for [%s:%d](%dms)",
cmd, seq, time.Now().UnixMilli()-startTime))
log(fmt.Sprintf("signed for [%s:%d](%dms)",
cmd, seq, time.Now().UnixMilli()-startTime))

return map[string]string{
"sign": resp.Value.Sign,
"extra": resp.Value.Extra,
"token": resp.Value.Token,
return map[string]string{
"sign": resp.Value.Sign,
"extra": resp.Value.Extra,
"token": resp.Value.Token,
}
}
}
return providers
}

func httpGet(rawUrl string, queryParams map[string]string, timeout time.Duration, target interface{}) error {
Expand Down
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func main() {
KernelVersion: "10.0.22631",
}

qqclient := client.NewClient(0, "https://sign.lagrangecore.org/api/sign", appInfo)
qqclient := client.NewClient(0, appInfo, "https://sign.lagrangecore.org/api/sign")
qqclient.SetLogger(protocolLogger{})
qqclient.UseDevice(deviceInfo)
data, err := os.ReadFile("sig.bin")
Expand Down

0 comments on commit e1b14ff

Please sign in to comment.