From c2739cbe560bcf6d787f57fc855e9fabc1c66355 Mon Sep 17 00:00:00 2001 From: vintcessun Date: Wed, 1 Oct 2025 13:06:19 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E8=BF=99=E4=B8=AAParseTempMessage=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=9A=84=E6=B6=88=E6=81=AF=E4=B8=8D=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E4=B8=B4=E6=97=B6=E4=BF=A1=E6=81=AF=E6=8E=A5?= =?UTF-8?q?=E6=94=B6=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- message/message.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/message/message.go b/message/message.go index 9812703d..2c250db9 100644 --- a/message/message.go +++ b/message/message.go @@ -137,6 +137,13 @@ func ParseGroupMessage(msg *message.PushMsgBody) *GroupMessage { func ParseTempMessage(msg *message.PushMsgBody) *TempMessage { return &TempMessage{ + ID: msg.ContentHead.Sequence.Unwrap(), + Self: msg.ResponseHead.ToUin, + Sender: &Sender{ + Uin: msg.ResponseHead.FromUin, + UID: msg.ResponseHead.FromUid.Unwrap(), + IsFriend: false, + }, Elements: ParseMessageElements(msg.Body.RichText.Elems), } } From 7df76f22bdca767ba30a0292362a46d7ebb8d693 Mon Sep 17 00:00:00 2001 From: vintcessun Date: Wed, 1 Oct 2025 23:47:33 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86ToReadableString?= =?UTF-8?q?Ele=E6=94=AF=E6=8C=81=E6=89=80=E6=9C=89=E6=9C=89=E7=9A=84?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- message/message.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/message/message.go b/message/message.go index 2c250db9..c1d57688 100644 --- a/message/message.go +++ b/message/message.go @@ -590,20 +590,24 @@ func ToReadableStringEle(elem IMessageElement) string { return e.Content case *ImageElement: return "[图片]" + case *FaceElement: + return "[表情]" case *AtElement: return e.Display case *ReplyElement: return "[回复]" // [Optional] + ToReadableString(e.Elements), 这里不破坏原义不添加 - case *FaceElement: - return "[表情]" + case *XMLElement: + return "[服务消息]" + case *ForwardMessage: + return "[转发消息]" + case *FileElement: + return "[文件]" case *VoiceElement: return "[语音]" case *ShortVideoElement: return "[视频]" case *LightAppElement: return "[卡片消息]" - case *ForwardMessage: - return "[转发消息]" case *MarketFaceElement: return "[魔法表情]" default: From 6e816c7663f935c2a34b2d4b4d0056a6806336e9 Mon Sep 17 00:00:00 2001 From: vintcessun Date: Thu, 2 Oct 2025 00:03:33 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86JSON=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=8C=E7=8E=B0=E5=9C=A8=E5=AF=B9=E4=BA=8E=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E5=BA=8F=E5=88=97=E5=8C=96=E5=92=8C=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E9=83=BD=E8=83=BD=E5=A4=9F=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E8=BF=9B=E8=A1=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- message/json.go | 260 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 message/json.go diff --git a/message/json.go b/message/json.go new file mode 100644 index 00000000..39ca24b4 --- /dev/null +++ b/message/json.go @@ -0,0 +1,260 @@ +package message + +import ( + "encoding/json" + "fmt" +) + +type elementJSON struct { + Type ElementType `json:"type"` + Data json.RawMessage `json:"data"` +} + +func parseJSONMessageElement(elemJSON elementJSON) (IMessageElement, error) { + var elem IMessageElement + switch elemJSON.Type { + case Text: + var textElem *TextElement + if err := json.Unmarshal(elemJSON.Data, &textElem); err != nil { + return elem, fmt.Errorf("解析TextElement失败: %w", err) + } + elem = textElem + case Image: + var imgElem *ImageElement + if err := json.Unmarshal(elemJSON.Data, &imgElem); err != nil { + return elem, fmt.Errorf("解析ImageElement失败: %w", err) + } + elem = imgElem + case At: + var atElem *AtElement + if err := json.Unmarshal(elemJSON.Data, &atElem); err != nil { + return elem, fmt.Errorf("解析AtElement失败: %w", err) + } + elem = atElem + case Reply: + var replyElem *ReplyElement + if err := json.Unmarshal(elemJSON.Data, &replyElem); err != nil { + return elem, fmt.Errorf("解析ReplyElement失败: %w", err) + } + elem = replyElem + case Service: + var serviceElem *XMLElement + if err := json.Unmarshal(elemJSON.Data, &serviceElem); err != nil { + return elem, fmt.Errorf("解析XMLElement失败: %w", err) + } + elem = serviceElem + case Forward: + var forwardElem *ForwardMessage + if err := json.Unmarshal(elemJSON.Data, &forwardElem); err != nil { + return elem, fmt.Errorf("解析ForwardMessage失败: %w", err) + } + elem = forwardElem + case File: + var fileElem *FileElement + if err := json.Unmarshal(elemJSON.Data, &fileElem); err != nil { + return elem, fmt.Errorf("解析FileElement失败: %w", err) + } + elem = fileElem + case Voice: + var voiceElem *VoiceElement + if err := json.Unmarshal(elemJSON.Data, &voiceElem); err != nil { + return elem, fmt.Errorf("解析FileElement失败: %w", err) + } + elem = voiceElem + case Video: + var videoElem *ShortVideoElement + if err := json.Unmarshal(elemJSON.Data, &videoElem); err != nil { + return elem, fmt.Errorf("解析FileElement失败: %w", err) + } + elem = videoElem + case LightApp: + var lightAppElem *LightAppElement + if err := json.Unmarshal(elemJSON.Data, &lightAppElem); err != nil { + return elem, fmt.Errorf("解析FileElement失败: %w", err) + } + elem = lightAppElem + case RedBag: + return elem, fmt.Errorf("未实现的元素类型: %v", elemJSON.Type) + case MarketFace: + var marketFaceElem *MarketFaceElement + if err := json.Unmarshal(elemJSON.Data, &marketFaceElem); err != nil { + return elem, fmt.Errorf("解析FileElement失败: %w", err) + } + elem = marketFaceElem + default: + return elem, fmt.Errorf("未知的元素类型: %v", elemJSON.Type) + } + return elem, nil +} + +func (g GroupMessage) MarshalJSON() ([]byte, error) { + type Temp GroupMessage + temp := struct { + *Temp + Elements []elementJSON + }{ + Temp: (*Temp)(&g), + Elements: make([]elementJSON, 0, len(g.Elements)), + } + + for _, elem := range g.Elements { + if elem == nil { + continue + } + elemData, err := json.Marshal(elem) + if err != nil { + return nil, fmt.Errorf("序列化元素失败: %w", err) + } + temp.Elements = append(temp.Elements, elementJSON{ + Type: elem.Type(), + Data: elemData, + }) + } + + return json.Marshal(temp) +} + +func (g *GroupMessage) UnmarshalJSON(data []byte) error { + type Temp GroupMessage + var temp struct { + *Temp + Elements []elementJSON + } + temp.Temp = (*Temp)(g) + + if err := json.Unmarshal(data, &temp); err != nil { + return fmt.Errorf("解析GroupMessage失败: %w", err) + } + + g.Elements = make([]IMessageElement, 0, len(temp.Elements)) + for _, elemJSON := range temp.Elements { + elem, err := parseJSONMessageElement(elemJSON) + if err != nil { + return err + } + g.Elements = append(g.Elements, elem) + } + + g.ID = temp.ID + g.InternalID = temp.InternalID + g.GroupUin = temp.GroupUin + g.GroupName = temp.GroupName + g.Sender = temp.Sender + g.Time = temp.Time + g.OriginalObject = temp.OriginalObject + + return nil +} + +func (r ReplyElement) MarshalJSON() ([]byte, error) { + type Temp ReplyElement + temp := struct { + *Temp + Elements []elementJSON + }{ + Temp: (*Temp)(&r), + Elements: make([]elementJSON, 0, len(r.Elements)), + } + + for _, elem := range r.Elements { + if elem == nil { + continue + } + elemData, err := json.Marshal(elem) + if err != nil { + return nil, fmt.Errorf("序列化元素失败: %w", err) + } + temp.Elements = append(temp.Elements, elementJSON{ + Type: elem.Type(), + Data: elemData, + }) + } + + return json.Marshal(temp) +} + +func (r *ReplyElement) UnmarshalJSON(data []byte) error { + type Temp ReplyElement + var temp struct { + *Temp + Elements []elementJSON + } + temp.Temp = (*Temp)(r) + + if err := json.Unmarshal(data, &temp); err != nil { + return fmt.Errorf("解析GroupMessage失败: %w", err) + } + + r.Elements = make([]IMessageElement, 0, len(temp.Elements)) + for _, elemJSON := range temp.Elements { + elem, err := parseJSONMessageElement(elemJSON) + if err != nil { + return err + } + r.Elements = append(r.Elements, elem) + } + + r.ReplySeq = temp.ReplySeq + r.SenderUin = temp.SenderUin + r.SenderUID = temp.SenderUID + r.GroupUin = temp.GroupUin + r.Time = temp.Time + + return nil +} + +func (f ForwardNode) MarshalJSON() ([]byte, error) { + type Temp ForwardNode + temp := struct { + *Temp + Elements []elementJSON + }{ + Temp: (*Temp)(&f), + Elements: make([]elementJSON, 0, len(f.Message)), + } + + for _, elem := range f.Message { + if elem == nil { + continue + } + elemData, err := json.Marshal(elem) + if err != nil { + return nil, fmt.Errorf("序列化元素失败: %w", err) + } + temp.Elements = append(temp.Elements, elementJSON{ + Type: elem.Type(), + Data: elemData, + }) + } + + return json.Marshal(temp) +} + +func (f *ForwardNode) UnmarshalJSON(data []byte) error { + type Temp ForwardNode + var temp struct { + *Temp + Elements []elementJSON + } + temp.Temp = (*Temp)(f) + + if err := json.Unmarshal(data, &temp); err != nil { + return fmt.Errorf("解析GroupMessage失败: %w", err) + } + + f.Message = make([]IMessageElement, 0, len(temp.Elements)) + for _, elemJSON := range temp.Elements { + elem, err := parseJSONMessageElement(elemJSON) + if err != nil { + return err + } + f.Message = append(f.Message, elem) + } + + f.GroupID = temp.GroupID + f.SenderID = temp.SenderID + f.SenderName = temp.SenderName + f.Time = temp.Time + + return nil +} From 12499b75c90f440e957e38613ca5491c2e48d3fc Mon Sep 17 00:00:00 2001 From: vintcessun Date: Thu, 2 Oct 2025 00:08:37 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=AF=B9?= =?UTF-8?q?=E4=BA=8E=E7=A7=81=E8=81=8A=E6=B6=88=E6=81=AF=E5=92=8C=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E6=B6=88=E6=81=AF=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- message/json.go | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/message/json.go b/message/json.go index 39ca24b4..43322036 100644 --- a/message/json.go +++ b/message/json.go @@ -146,6 +146,121 @@ func (g *GroupMessage) UnmarshalJSON(data []byte) error { return nil } +func (g PrivateMessage) MarshalJSON() ([]byte, error) { + type Temp PrivateMessage + temp := struct { + *Temp + Elements []elementJSON + }{ + Temp: (*Temp)(&g), + Elements: make([]elementJSON, 0, len(g.Elements)), + } + + for _, elem := range g.Elements { + if elem == nil { + continue + } + elemData, err := json.Marshal(elem) + if err != nil { + return nil, fmt.Errorf("序列化元素失败: %w", err) + } + temp.Elements = append(temp.Elements, elementJSON{ + Type: elem.Type(), + Data: elemData, + }) + } + + return json.Marshal(temp) +} + +func (g *PrivateMessage) UnmarshalJSON(data []byte) error { + type Temp PrivateMessage + var temp struct { + *Temp + Elements []elementJSON + } + temp.Temp = (*Temp)(g) + + if err := json.Unmarshal(data, &temp); err != nil { + return fmt.Errorf("解析GroupMessage失败: %w", err) + } + + g.Elements = make([]IMessageElement, 0, len(temp.Elements)) + for _, elemJSON := range temp.Elements { + elem, err := parseJSONMessageElement(elemJSON) + if err != nil { + return err + } + g.Elements = append(g.Elements, elem) + } + + g.ID = temp.ID + g.InternalID = temp.InternalID + g.ClientSeq = temp.ClientSeq + g.Target = temp.Target + g.Time = temp.Time + g.Sender = temp.Sender + + return nil +} + +func (g TempMessage) MarshalJSON() ([]byte, error) { + type Temp TempMessage + temp := struct { + *Temp + Elements []elementJSON + }{ + Temp: (*Temp)(&g), + Elements: make([]elementJSON, 0, len(g.Elements)), + } + + for _, elem := range g.Elements { + if elem == nil { + continue + } + elemData, err := json.Marshal(elem) + if err != nil { + return nil, fmt.Errorf("序列化元素失败: %w", err) + } + temp.Elements = append(temp.Elements, elementJSON{ + Type: elem.Type(), + Data: elemData, + }) + } + + return json.Marshal(temp) +} + +func (g *TempMessage) UnmarshalJSON(data []byte) error { + type Temp TempMessage + var temp struct { + *Temp + Elements []elementJSON + } + temp.Temp = (*Temp)(g) + + if err := json.Unmarshal(data, &temp); err != nil { + return fmt.Errorf("解析GroupMessage失败: %w", err) + } + + g.Elements = make([]IMessageElement, 0, len(temp.Elements)) + for _, elemJSON := range temp.Elements { + elem, err := parseJSONMessageElement(elemJSON) + if err != nil { + return err + } + g.Elements = append(g.Elements, elem) + } + + g.ID = temp.ID + g.GroupUin = temp.GroupUin + g.GroupName = temp.GroupName + g.Self = temp.Self + g.Sender = temp.Sender + + return nil +} + func (r ReplyElement) MarshalJSON() ([]byte, error) { type Temp ReplyElement temp := struct { From 9eddb883cf63dfaf910413fd1b182c86f2429074 Mon Sep 17 00:00:00 2001 From: vintcessun Date: Thu, 2 Oct 2025 00:12:32 +0800 Subject: [PATCH 5/8] Update json.go --- message/json.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/message/json.go b/message/json.go index 43322036..e8b4d358 100644 --- a/message/json.go +++ b/message/json.go @@ -25,6 +25,12 @@ func parseJSONMessageElement(elemJSON elementJSON) (IMessageElement, error) { return elem, fmt.Errorf("解析ImageElement失败: %w", err) } elem = imgElem + case Face: + var faceElem *FaceElement + if err := json.Unmarshal(elemJSON.Data, &faceElem); err != nil { + return elem, fmt.Errorf("解析FaceElement失败: %w", err) + } + elem = faceElem case At: var atElem *AtElement if err := json.Unmarshal(elemJSON.Data, &atElem); err != nil { From 4f54501e42df769f29e58ecc7fb696ed90a7f7a9 Mon Sep 17 00:00:00 2001 From: vintcessun Date: Thu, 2 Oct 2025 18:14:18 +0800 Subject: [PATCH 6/8] Update json.go --- message/json.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/message/json.go b/message/json.go index e8b4d358..a4f02747 100644 --- a/message/json.go +++ b/message/json.go @@ -64,19 +64,19 @@ func parseJSONMessageElement(elemJSON elementJSON) (IMessageElement, error) { case Voice: var voiceElem *VoiceElement if err := json.Unmarshal(elemJSON.Data, &voiceElem); err != nil { - return elem, fmt.Errorf("解析FileElement失败: %w", err) + return elem, fmt.Errorf("解析VoiceElement失败: %w", err) } elem = voiceElem case Video: var videoElem *ShortVideoElement if err := json.Unmarshal(elemJSON.Data, &videoElem); err != nil { - return elem, fmt.Errorf("解析FileElement失败: %w", err) + return elem, fmt.Errorf("解析ShortVideoElement失败: %w", err) } elem = videoElem case LightApp: var lightAppElem *LightAppElement if err := json.Unmarshal(elemJSON.Data, &lightAppElem); err != nil { - return elem, fmt.Errorf("解析FileElement失败: %w", err) + return elem, fmt.Errorf("解析LightAppElementElement失败: %w", err) } elem = lightAppElem case RedBag: @@ -84,7 +84,7 @@ func parseJSONMessageElement(elemJSON elementJSON) (IMessageElement, error) { case MarketFace: var marketFaceElem *MarketFaceElement if err := json.Unmarshal(elemJSON.Data, &marketFaceElem); err != nil { - return elem, fmt.Errorf("解析FileElement失败: %w", err) + return elem, fmt.Errorf("解析MarketFaceElement失败: %w", err) } elem = marketFaceElem default: From 16174a5dd0248494a9d04b34d1282bbadf68430b Mon Sep 17 00:00:00 2001 From: vintcessun Date: Sat, 4 Oct 2025 15:10:23 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=E5=86=85=E9=83=A8=E6=9C=AA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E3=80=82=E6=9A=B4=E9=9C=B2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/auth/app.go | 21 +++++++++++++++++++++ client/base.go | 5 +++++ main.go | 4 ++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/client/auth/app.go b/client/auth/app.go index bc7a0a09..c50751fd 100644 --- a/client/auth/app.go +++ b/client/auth/app.go @@ -97,6 +97,27 @@ var AppList = map[string]map[string]*AppInfo{ SubSigmap: 0, NTLoginType: 1, }, + + "3.2.19-39038": { + OS: "Linux", + Kernel: "Linux", + VendorOS: "linux", + + CurrentVersion: "3.2.19-39038", + BuildVersion: 39038, + MiscBitmap: 32764, + PTVersion: "2.0.0", + PTOSVersion: 19, + PackageName: "com.tencent.qq", + WTLoginSDK: "nt.wtlogin.0.0.1", + AppID: 1600001615, + SubAppID: 537313942, + AppIDQrcode: 537313942, + AppClientVersion: 39038, + MainSigmap: 169742560, + SubSigmap: 0, + NTLoginType: 1, + }, }, "macos": { diff --git a/client/base.go b/client/base.go index 2009eb90..45ba00e3 100644 --- a/client/base.go +++ b/client/base.go @@ -137,6 +137,11 @@ func (c *QQClient) AddSignServer(signServers ...string) { c.signProvider.AddSignServer(signServers...) } +// GetSignServer 获得所有签名服务器 +func (c *QQClient) GetSignServer() []string { + return c.signProvider.GetSignServer() +} + // AddSignHeader 设置签名服务器签名时的额外http header func (c *QQClient) AddSignHeader(header map[string]string) { if c.signProvider == nil { diff --git a/main.go b/main.go index 8c03faa3..012dded4 100644 --- a/main.go +++ b/main.go @@ -25,7 +25,7 @@ var ( ) func main() { - appInfo := auth.AppList["linux"]["3.2.15-30366"] + appInfo := auth.AppList["linux"]["3.2.19-39038"] deviceInfo := &auth.DeviceInfo{ GUID: "cfcd208495d565ef66e7dff9f98764da", DeviceName: "Lagrange-DCFCD07E", @@ -36,7 +36,7 @@ func main() { qqclient := client.NewClient(0, "") qqclient.SetLogger(protocolLogger{}) qqclient.UseVersion(appInfo) - qqclient.AddSignServer("https://sign.lagrangecore.org/api/sign/30366") + qqclient.AddSignServer("https://sign.lagrangecore.org/api/sign/39038") qqclient.UseDevice(deviceInfo) data, err := os.ReadFile("sig.bin") if err != nil { From 3aa85c0484bb1b3f91ffe665a6c73ae1ad7ea923 Mon Sep 17 00:00:00 2001 From: vintcessun Date: Sat, 4 Oct 2025 16:28:38 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86FetchFriends?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=8F=8A=E4=B8=80=E4=BA=9B=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E7=9B=B4=E6=8E=A5=E8=8E=B7=E5=BE=97=E8=87=AA?= =?UTF-8?q?=E5=B7=B1uin=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/cache.go | 9 +++++++++ client/packets/oidb/fetch_friends.go | 9 ++++++--- .../packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.pb.go | 1 + .../packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.proto | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/client/cache.go b/client/cache.go index 87796e7b..a608b19c 100644 --- a/client/cache.go +++ b/client/cache.go @@ -1,16 +1,25 @@ package client import ( + "strconv" "time" "github.com/LagrangeDev/LagrangeGo/client/entity" ) +var selfUin string + // GetUID 获取缓存中对应uin的uid func (c *QQClient) GetUID(uin uint32, groupUin ...uint32) string { if uin == 0 { return "" } + if uin == c.Uin { + if selfUin == "" { + selfUin = strconv.FormatUint(uint64(uin), 10) + } + return selfUin + } if len(groupUin) == 0 && c.cache.FriendCacheIsEmpty() { if err := c.RefreshFriendCache(); err != nil { return "" diff --git a/client/packets/oidb/fetch_friends.go b/client/packets/oidb/fetch_friends.go index cebbaa82..47dd4e06 100644 --- a/client/packets/oidb/fetch_friends.go +++ b/client/packets/oidb/fetch_friends.go @@ -11,10 +11,8 @@ func BuildFetchFriendsReq(token uint32) (*Packet, error) { body := oidb.OidbSvcTrpcTcp0XFD4_1{ Field2: 300, Field4: 0, - NextUin: &oidb.OidbSvcTrpcTcp0XFD4_1Uin{ - Uin: token, - }, Field6: 1, + Field7: 2147483647, Body: []*oidb.OidbSvcTrpcTcp0XFD4_1Body{{ Type: 1, Number: &oidb.OidbNumber{Numbers: []uint32{103, 102, 20002, 27394}}, @@ -25,6 +23,11 @@ func BuildFetchFriendsReq(token uint32) (*Packet, error) { Field10002: []uint32{13578, 13579, 13573, 13572, 13568}, Field10003: 4051, } + if token != 0 { + body.NextUin = &oidb.OidbSvcTrpcTcp0XFD4_1Uin{ + Uin: token, + } + } /* * OidbNumber里面的东西代表你想要拿到的Property,这些Property将会在返回的数据里面的Preserve的Field, * 102:个性签名 diff --git a/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.pb.go b/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.pb.go index ca4e4819..4ba78e52 100644 --- a/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.pb.go +++ b/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.pb.go @@ -9,6 +9,7 @@ type OidbSvcTrpcTcp0XFD4_1 struct { Field4 uint32 `protobuf:"varint,4,opt"` // 0 NextUin *OidbSvcTrpcTcp0XFD4_1Uin `protobuf:"bytes,5,opt"` Field6 uint32 `protobuf:"varint,6,opt"` // 1 + Field7 uint32 `protobuf:"varint,7,opt"` // 2,147,483,647 Body []*OidbSvcTrpcTcp0XFD4_1Body `protobuf:"bytes,10001,rep"` Field10002 []uint32 `protobuf:"varint,10002,rep"` // [13578, 13579, 13573, 13572, 13568] Field10003 uint32 `protobuf:"varint,10003,opt"` diff --git a/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.proto b/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.proto index 56e61821..f1a189a1 100644 --- a/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.proto +++ b/client/packets/pb/service/oidb/OidbSvcTrpcTcp0xFD4_1.proto @@ -10,6 +10,7 @@ message OidbSvcTrpcTcp0xFD4_1 { uint32 Field4 = 4; // 0 OidbSvcTrpcTcp0xFD4_1Uin NextUin = 5; uint32 Field6 = 6; // 1 + uint32 Field7 = 7; // 2,147,483,647 repeated OidbSvcTrpcTcp0xFD4_1Body Body = 10001; repeated uint32 Field10002 = 10002; // [13578, 13579, 13573, 13572, 13568] uint32 Field10003 = 10003;