@@ -3,6 +3,7 @@ package bot
33import (
44 "bytes"
55 "encoding/hex"
6+ "encoding/json"
67 "errors"
78 "fmt"
89 "net/http"
@@ -32,15 +33,57 @@ type GMCLogin struct {
3233 DeviceSeed int64
3334 ClientProtocol int32
3435 SignServer string
36+ SignServerKey string
3537}
3638
39+ type SignRegister struct {
40+ Uin uint64
41+ AndroidId string
42+ Guid string
43+ Qimei36 string
44+ Key string
45+ }
46+
47+ type RequestCallback struct {
48+ Cmd string `json:"cmd,omitempty"` // trpc.o3.ecdh_access.EcdhAccess.SsoSecureA2Establish
49+ Body string `json:"body,omitempty"`
50+ CallBackId int `json:"callbackId,omitempty"`
51+ }
52+
53+ type RequestSignData struct {
54+ Token string `json:"token,omitempty"`
55+ Extra string `json:"extra,omitempty"`
56+ Sign string `json:"sign,omitempty"`
57+ O3dId string `json:"o3did,omitempty"`
58+ RequestCallback []* RequestCallback
59+ }
60+
61+ type RequestSignResult struct {
62+ Code int `json:"code,omitempty"`
63+ Msg string `json:"msg,omitempty"`
64+ Data * RequestSignData
65+ }
66+
67+ var RSR RequestSignResult
68+
3769var GTL * GMCLogin
3870
71+ var SR SignRegister
72+
73+ var IsRequestTokenAgain bool = false
74+
75+ var TTI_i = 30
76+
3977func GmcTokenLogin () (g GMCLogin , err error ) {
4078 _ , err = toml .DecodeFile ("deviceInfo.toml" , & GTL )
4179 return * GTL , err
4280}
4381
82+ func SRI () (sr SignRegister , err error ) {
83+ _ , err = toml .DecodeFile ("signRegisterInfo.toml" , & SR )
84+ return SR , err
85+ }
86+
4487func PathExists (path string ) bool {
4588 _ , err := os .Stat (path )
4689 return err == nil || errors .Is (err , os .ErrExist )
@@ -73,6 +116,7 @@ func InitLog(cli *client.QQClient) {
73116func Login (cli * client.QQClient ) (bool , error ) {
74117 cli .AllowSlider = true
75118 if GTL .ClientProtocol == 1 && GTL .SignServer != "" {
119+ wrapper .RegisterSign = RegisterSign
76120 wrapper .DandelionEnergy = Energy
77121 wrapper .FekitGetSign = Sign
78122 } else if GTL .SignServer != "" {
@@ -178,7 +222,7 @@ func Energy(uin uint64, id string, appVersion string, salt []byte) ([]byte, erro
178222 }
179223 response , err := download.Request {
180224 Method : http .MethodGet ,
181- URL : signServer + "custom_energy" + fmt .Sprintf ("?data=%v&salt=%v" , id , hex .EncodeToString (salt )),
225+ URL : signServer + "custom_energy" + fmt .Sprintf ("?uin=%v& data=%v&salt=%v" , uin , id , hex .EncodeToString (salt )),
182226 }.Bytes ()
183227 if err != nil {
184228 log .Warnf ("获取T544 sign时出现错误: %v server: %v" , err , signServer )
@@ -214,5 +258,87 @@ func Sign(seq uint64, uin string, cmd string, qua string, buff []byte) (sign []b
214258 sign , _ = hex .DecodeString (gjson .GetBytes (response , "data.sign" ).String ())
215259 extra , _ = hex .DecodeString (gjson .GetBytes (response , "data.extra" ).String ())
216260 token , _ = hex .DecodeString (gjson .GetBytes (response , "data.token" ).String ())
261+
262+ json .Unmarshal (response , & RSR )
263+ fmt .Println (RSR .Data .RequestCallback [0 ], RSR .Data .RequestCallback [1 ])
217264 return sign , extra , token , nil
218265}
266+
267+ func RegisterSign (uin uint64 , androidId []byte , guid []byte , Qimei36 string , signServerAuth string ) {
268+ signServer := GTL .SignServer
269+ if ! strings .HasSuffix (signServer , "/" ) {
270+ signServer += "/"
271+ }
272+ SR .Uin = uin
273+ SR .AndroidId = string (androidId )
274+ SR .Guid = string (guid )
275+ SR .Guid = string (guid )
276+ SR .Key = signServerAuth
277+ // http://your.host:port/register?uin=[QQ]&android_id=[ANDROID_ID]&guid=[GUID]&qimei36=[QIMEI36]&key=[KEY]
278+ _ = os .WriteFile ("signRegisterInfo.toml" , []byte (fmt .Sprintf ("uin= %v \n androidId= \" %s\" \n guid= \" %s\" \n qimei36= \" %s\" \n key= \" %s\" " , uin , hex .EncodeToString (androidId ), hex .EncodeToString (guid ), Qimei36 , signServerAuth )), 0o644 )
279+
280+ fmt .Println (uin , hex .EncodeToString (androidId ), hex .EncodeToString (guid ), Qimei36 , signServerAuth )
281+ fmt .Println (fmt .Sprintf ("?uin=%v&android_id=%s&guid=%s&qimei36=%s&key=%s" , uin , hex .EncodeToString (androidId ), hex .EncodeToString (guid ), Qimei36 , signServerAuth ))
282+ response , err := download.Request {
283+ Method : http .MethodGet ,
284+ URL : signServer + "register" + fmt .Sprintf ("?uin=%v&android_id=%s&guid=%s&qimei36=%s&key=%s" , uin , hex .EncodeToString (androidId ), hex .EncodeToString (guid ), Qimei36 , signServerAuth ),
285+ }.Bytes ()
286+ if err != nil {
287+ log .Warnf ("初始化 Sign 失败\n " , err )
288+ } else {
289+ log .Info ("初始化 Sign 成功" )
290+ fmt .Println (gjson .GetBytes (response , "msg" ).String ())
291+ }
292+ }
293+
294+ // http://your.host:port/submit?uin=[QQ]&cmd=[CMD]&callback_id=[CALLBACK_ID]&buffer=[BUFFER]
295+ func SubmitRequestCallback (uin uint64 , cmd string , callbackId int , buffer []byte ) {
296+ signServer := GTL .SignServer
297+ if ! strings .HasSuffix (signServer , "/" ) {
298+ signServer += "/"
299+ }
300+ response , err := download.Request {
301+ Method : http .MethodGet ,
302+ URL : signServer + "submit" + fmt .Sprintf ("?uin=%v&cmd=%s&callback_id=%v&buffer=%s" , uin , cmd , callbackId , buffer ),
303+ }.Bytes ()
304+ if err != nil {
305+ log .Warnf (cmd , " " , callbackId , "提交失败\n " , err )
306+ } else {
307+ log .Info (cmd , " " , callbackId , "提交成功" )
308+ fmt .Println (string (response ))
309+ fmt .Println (gjson .GetBytes (response , "msg" ).String ())
310+ }
311+ }
312+
313+ func RequestToken (uin uint64 ) {
314+ signServer := GTL .SignServer
315+ if ! strings .HasSuffix (signServer , "/" ) {
316+ signServer += "/"
317+ }
318+ response , err := download.Request {
319+ Method : http .MethodGet ,
320+ URL : signServer + "request_token" + fmt .Sprintf ("?uin=%v" , uin ),
321+ }.Bytes ()
322+ if err != nil || strings .HasPrefix (gjson .GetBytes (response , "msg" ).String (), "Uin" ) { // QSign
323+ log .Warnf ("请求 Token 失败\n " , gjson .GetBytes (response , "msg" ).String (), err )
324+ log .Info ("正在重新注册 " , uin )
325+ RegisterSign (SR .Uin , []byte (SR .AndroidId ), []byte (SR .Guid ), SR .Qimei36 , SR .Key )
326+ IsRequestTokenAgain = true
327+ } else if strings .HasPrefix (gjson .GetBytes (response , "msg" ).String (), "QSign" ) {
328+ log .Warn ("QSign not initialized, unable to request_ Token, please submit the initialization package first." )
329+ } else {
330+ log .Info ("请求 Token 成功" )
331+ fmt .Println (string (response ))
332+ fmt .Println (gjson .GetBytes (response , "msg" ).String ())
333+ }
334+ }
335+
336+ func TTIR (uin uint64 ) {
337+ for TTI_i >= 0 {
338+ time .Sleep (time .Minute )
339+ if TTI_i == 0 {
340+ TTI_i = 30
341+ RequestToken (uin )
342+ }
343+ }
344+ }
0 commit comments