From ca72d542ca7265e55d7a6974912b9922ca7587cd Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 5 Nov 2020 20:03:58 +0800 Subject: [PATCH 1/6] fix group file download error. --- client/group_file.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/group_file.go b/client/group_file.go index 2b722880..68155f58 100644 --- a/client/group_file.go +++ b/client/group_file.go @@ -251,6 +251,9 @@ func decodeOIDB6d6Response(_ *QQClient, _ uint16, payload []byte) (interface{}, if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { return nil, err } + if rsp.DownloadFileRsp.DownloadUrl == nil { + return nil, errors.New(rsp.DownloadFileRsp.ClientWording) + } ip := rsp.DownloadFileRsp.DownloadIp url := hex.EncodeToString(rsp.DownloadFileRsp.DownloadUrl) return fmt.Sprintf("http://%s/ftn_handler/%s/", ip, url), nil From 3c7b0b8c8e942e40c86e65824672a8004cf5875f Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Mon, 9 Nov 2020 15:26:24 +0800 Subject: [PATCH 2/6] fix light app decode bug. --- message/message.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/message/message.go b/message/message.go index 7d71b1d2..00392a9a 100644 --- a/message/message.go +++ b/message/message.go @@ -366,16 +366,16 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement { } } if elem.LightApp != nil && len(elem.LightApp.Data) > 1 { - var content string + var content []byte if elem.LightApp.Data[0] == 0 { - content = string(elem.LightApp.Data[1:]) + content = elem.LightApp.Data[1:] } if elem.LightApp.Data[0] == 1 { - content = string(binary.ZlibUncompress(elem.LightApp.Data[1:])) + content = binary.ZlibUncompress(elem.LightApp.Data[1:]) } - if content != "" { + if len(content) > 0 && len(content) < 1024*1024*1024 { // 解析出错 or 非法内容 // TODO: 解析具体的APP - return append(res, &LightAppElement{Content: content}) + return append(res, &LightAppElement{Content: string(content)}) } } if elem.VideoFile != nil { From 1fbac975a752cab35b54ca90c21059862f4bd4c1 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Tue, 10 Nov 2020 18:22:36 +0800 Subject: [PATCH 3/6] fix heartbeat. --- client/client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client/client.go b/client/client.go index 1c4c1674..f09677b6 100644 --- a/client/client.go +++ b/client/client.go @@ -1124,6 +1124,7 @@ func (c *QQClient) doHeartbeat() { _ = c.Conn.Close() } time.AfterFunc(30*time.Second, c.doHeartbeat) + return } c.heartbeatEnabled = false } From a8986651e7c3b0ddb8a5293b605dbcfc866c8f9d Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Tue, 10 Nov 2020 23:14:01 +0800 Subject: [PATCH 4/6] feature: group file delete. --- client/client.go | 3 ++- client/group_file.go | 48 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/client/client.go b/client/client.go index 1c4c1674..963631a0 100644 --- a/client/client.go +++ b/client/client.go @@ -151,7 +151,8 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { "ProfileService.Pb.ReqSystemMsgNew.Friend": decodeSystemMsgFriendPacket, "MultiMsg.ApplyUp": decodeMultiApplyUpResponse, "MultiMsg.ApplyDown": decodeMultiApplyDownResponse, - "OidbSvc.0x6d6_2": decodeOIDB6d6Response, + "OidbSvc.0x6d6_2": decodeOIDB6d62Response, + "OidbSvc.0x6d6_3": decodeOIDB6d63Response, "OidbSvc.0x6d8_1": decodeOIDB6d81Response, "OidbSvc.0x88d_0": decodeGroupInfoResponse, "OidbSvc.0xe07_0": decodeImageOcrResponse, diff --git a/client/group_file.go b/client/group_file.go index 68155f58..fe873408 100644 --- a/client/group_file.go +++ b/client/group_file.go @@ -142,6 +142,16 @@ func (fs *GroupFileSystem) GetDownloadUrl(file *GroupFile) string { return fs.client.GetGroupFileUrl(file.GroupCode, file.FileId, file.BusId) } +// DeleteFile 删除群文件,需要管理权限. +// 返回错误, 空为删除成功 +func (fs *GroupFileSystem) DeleteFile(parentFolderId, fileId string, busId int32) string { + i, err := fs.client.sendAndWait(fs.client.buildGroupFileDeleteReqPacket(fs.GroupCode, parentFolderId, fileId, busId)) + if err != nil { + return err.Error() + } + return i.(string) +} + // OidbSvc.0x6d8_1 func (c *QQClient) buildGroupFileListRequestPacket(groupCode int64, folderId string, startIndex uint32) (uint16, []byte) { seq := c.nextSeq() @@ -229,6 +239,27 @@ func (c *QQClient) buildGroupFileDownloadReqPacket(groupCode int64, fileId strin return seq, packet } +func (c *QQClient) buildGroupFileDeleteReqPacket(groupCode int64, parentFolderId, fileId string, busId int32) (uint16, []byte) { + seq := c.nextSeq() + body := &oidb.D6D6ReqBody{DeleteFileReq: &oidb.DeleteFileReqBody{ + GroupCode: groupCode, + AppId: 3, + BusId: busId, + ParentFolderId: parentFolderId, + FileId: fileId, + }} + b, _ := proto.Marshal(body) + req := &oidb.OIDBSSOPkg{ + Command: 1750, + ServiceType: 3, + Bodybuffer: b, + ClientVersion: "android 8.4.8", + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x6d6_3", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + func decodeOIDB6d81Response(c *QQClient, _ uint16, payload []byte) (interface{}, error) { pkg := oidb.OIDBSSOPkg{} rsp := oidb.D6D8RspBody{} @@ -242,7 +273,7 @@ func decodeOIDB6d81Response(c *QQClient, _ uint16, payload []byte) (interface{}, } // OidbSvc.0x6d6_2 -func decodeOIDB6d6Response(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { +func decodeOIDB6d62Response(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { pkg := oidb.OIDBSSOPkg{} rsp := oidb.D6D6RspBody{} if err := proto.Unmarshal(payload, &pkg); err != nil { @@ -258,3 +289,18 @@ func decodeOIDB6d6Response(_ *QQClient, _ uint16, payload []byte) (interface{}, url := hex.EncodeToString(rsp.DownloadFileRsp.DownloadUrl) return fmt.Sprintf("http://%s/ftn_handler/%s/", ip, url), nil } + +func decodeOIDB6d63Response(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { + pkg := oidb.OIDBSSOPkg{} + rsp := oidb.D6D6RspBody{} + if err := proto.Unmarshal(payload, &pkg); err != nil { + return nil, err + } + if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { + return nil, err + } + if rsp.DeleteFileRsp == nil { + return "", nil + } + return rsp.DeleteFileRsp.ClientWording, nil +} From a54d978fa9bea80c673945d86599ed4e9f29e86e Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 11 Nov 2020 22:05:26 +0800 Subject: [PATCH 5/6] fix private image upload error. --- client/client.go | 17 +++++++++++------ client/entities.go | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/client/client.go b/client/client.go index bb2603a5..689c4425 100644 --- a/client/client.go +++ b/client/client.go @@ -641,18 +641,20 @@ func (c *QQClient) UploadPrivateImage(target int64, img []byte) (*message.Friend func (c *QQClient) uploadPrivateImage(target int64, img []byte, count int) (*message.FriendImageElement, error) { count++ h := md5.Sum(img) - e, err := c.QueryFriendImage(target, h[:], int32(len(img))) - if err != nil { + e, err := c.QueryFriendImage(target, h[:], img, int32(len(img))) + if err == ErrNotExists { // use group highway upload and query again for image id. if _, err = c.UploadGroupImage(target, img); err != nil { return nil, err } - // safe if count >= 5 { - return nil, errors.New("upload failed") + return e, nil } return c.uploadPrivateImage(target, img, count) } + if err != nil { + return nil, err + } return e, nil } @@ -689,7 +691,7 @@ func (c *QQClient) QueryGroupImage(groupCode int64, hash []byte, size int32) (*m return nil, errors.New("image not exists") } -func (c *QQClient) QueryFriendImage(target int64, hash []byte, size int32) (*message.FriendImageElement, error) { +func (c *QQClient) QueryFriendImage(target int64, hash, img []byte, size int32) (*message.FriendImageElement, error) { i, err := c.sendAndWait(c.buildOffPicUpPacket(target, hash, size)) if err != nil { return nil, err @@ -699,7 +701,10 @@ func (c *QQClient) QueryFriendImage(target int64, hash []byte, size int32) (*mes return nil, errors.New(rsp.Message) } if !rsp.IsExists { - return nil, errors.New("image not exists") + return &message.FriendImageElement{ + ImageId: rsp.ResourceId, + Md5: hash, + }, ErrNotExists } return &message.FriendImageElement{ ImageId: rsp.ResourceId, diff --git a/client/entities.go b/client/entities.go index 172c6e83..d46743e1 100644 --- a/client/entities.go +++ b/client/entities.go @@ -11,6 +11,7 @@ import ( var ( ErrAlreadyOnline = errors.New("already online") ErrMemberNotFound = errors.New("member not found") + ErrNotExists = errors.New("not exists") ) type ( From 8b59d083ebeb64a387fc58f35144e95741dcc744 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 11 Nov 2020 22:10:37 +0800 Subject: [PATCH 6/6] fix param. --- client/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/client.go b/client/client.go index 689c4425..bf1e980f 100644 --- a/client/client.go +++ b/client/client.go @@ -641,7 +641,7 @@ func (c *QQClient) UploadPrivateImage(target int64, img []byte) (*message.Friend func (c *QQClient) uploadPrivateImage(target int64, img []byte, count int) (*message.FriendImageElement, error) { count++ h := md5.Sum(img) - e, err := c.QueryFriendImage(target, h[:], img, int32(len(img))) + e, err := c.QueryFriendImage(target, h[:], int32(len(img))) if err == ErrNotExists { // use group highway upload and query again for image id. if _, err = c.UploadGroupImage(target, img); err != nil { @@ -691,7 +691,7 @@ func (c *QQClient) QueryGroupImage(groupCode int64, hash []byte, size int32) (*m return nil, errors.New("image not exists") } -func (c *QQClient) QueryFriendImage(target int64, hash, img []byte, size int32) (*message.FriendImageElement, error) { +func (c *QQClient) QueryFriendImage(target int64, hash []byte, size int32) (*message.FriendImageElement, error) { i, err := c.sendAndWait(c.buildOffPicUpPacket(target, hash, size)) if err != nil { return nil, err