From ab72f3dc28dac523879e8790f8c121653bfac087 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Tue, 28 Dec 2021 22:05:30 +0800 Subject: [PATCH] Revert "message: remove GroupImage Width & Height" This reverts commit 9d618e2d9f3e2231900661cec40ba84621975ab3. handle zero width and height in another way. --- client/image.go | 13 +++++++++---- message/image.go | 18 +++++++++++++++--- message/message.go | 4 ++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/client/image.go b/client/image.go index 34fd57c8..e3736b9f 100644 --- a/client/image.go +++ b/client/image.go @@ -3,6 +3,7 @@ package client import ( "bytes" "encoding/hex" + "image" "io" "math/rand" "os" @@ -80,6 +81,8 @@ func (c *QQClient) UploadGroupImage(groupCode int64, img io.ReadSeeker) (*messag } return nil, errors.Wrap(err, "upload failed") ok: + _, _ = img.Seek(0, io.SeekStart) + i, _, _ := image.DecodeConfig(img) var imageType int32 = 1000 _, _ = img.Seek(0, io.SeekStart) tmp := make([]byte, 4) @@ -87,7 +90,7 @@ ok: if bytes.Equal(tmp, []byte{0x47, 0x49, 0x46, 0x38}) { imageType = 2000 } - return message.NewGroupImage(binary.CalculateImageResourceId(fh), fh, rsp.FileId, int32(length), imageType), nil + return message.NewGroupImage(binary.CalculateImageResourceId(fh), fh, rsp.FileId, int32(length), int32(i.Width), int32(i.Height), imageType), nil } func (c *QQClient) UploadGroupImageByFile(groupCode int64, path string) (*message.GroupImageElement, error) { @@ -131,6 +134,8 @@ func (c *QQClient) UploadGroupImageByFile(groupCode int64, path string) (*messag } return nil, errors.Wrap(err, "upload failed") ok: + _, _ = img.Seek(0, io.SeekStart) + i, _, _ := image.DecodeConfig(img) var imageType int32 = 1000 _, _ = img.Seek(0, io.SeekStart) tmp := make([]byte, 4) @@ -138,7 +143,7 @@ ok: if bytes.Equal(tmp, []byte{0x47, 0x49, 0x46, 0x38}) { imageType = 2000 } - return message.NewGroupImage(binary.CalculateImageResourceId(fh), fh, rsp.FileId, int32(length), imageType), nil + return message.NewGroupImage(binary.CalculateImageResourceId(fh), fh, rsp.FileId, int32(length), int32(i.Width), int32(i.Height), imageType), nil } func (c *QQClient) UploadPrivateImage(target int64, img io.ReadSeeker) (*message.FriendImageElement, error) { @@ -186,7 +191,7 @@ func (c *QQClient) ImageOcr(img interface{}) (*OcrResponse, error) { } _ = b.Close() } - rsp, err := c.sendAndWait(c.buildImageOcrRequestPacket(url, strings.ToUpper(hex.EncodeToString(e.Md5)), e.Size, 480, 720)) + rsp, err := c.sendAndWait(c.buildImageOcrRequestPacket(url, strings.ToUpper(hex.EncodeToString(e.Md5)), e.Size, e.Width, e.Height)) if err != nil { return nil, err } @@ -205,7 +210,7 @@ func (c *QQClient) QueryGroupImage(groupCode int64, hash []byte, size int32) (*m return nil, errors.New(rsp.Message) } if rsp.IsExists { - return message.NewGroupImage(binary.CalculateImageResourceId(hash), hash, rsp.FileId, size, 1000), nil + return message.NewGroupImage(binary.CalculateImageResourceId(hash), hash, rsp.FileId, size, rsp.Width, rsp.Height, 1000), nil } return nil, errors.New("image does not exist") } diff --git a/message/image.go b/message/image.go index 92c9db84..1bea6d82 100644 --- a/message/image.go +++ b/message/image.go @@ -16,6 +16,8 @@ type GroupImageElement struct { ImageType int32 ImageBizType ImageBizType Size int32 + Width int32 + Height int32 Md5 []byte Url string @@ -62,13 +64,15 @@ const ( /* ------ Implementations ------ */ -func NewGroupImage(id string, md5 []byte, fid int64, size, imageType int32) *GroupImageElement { +func NewGroupImage(id string, md5 []byte, fid int64, size, width, height, imageType int32) *GroupImageElement { return &GroupImageElement{ ImageId: id, FileId: fid, Md5: md5, Size: size, ImageType: imageType, + Width: width, + Height: height, Url: "https://gchat.qpic.cn/gchatpic_new/1/0-0-" + strings.ReplaceAll(binary.CalculateImageResourceId(md5)[1:37], "-", "") + "/0?term=2", } } @@ -86,13 +90,21 @@ func (e *GuildImageElement) Type() ElementType { } func (e *GroupImageElement) Pack() (r []*msg.Elem) { + // width and height are required, set 720*480 if not set + if e.Width == 0 { + e.Width = 720 + } + if e.Height == 0 { + e.Height = 480 + } + cface := &msg.CustomFace{ FileType: proto.Int32(66), Useful: proto.Int32(1), // Origin: 1, BizType: proto.Int32(5), - Width: proto.Int32(720), - Height: proto.Int32(480), + Width: &e.Width, + Height: &e.Height, FileId: proto.Int32(int32(e.FileId)), FilePath: &e.ImageId, ImageType: &e.ImageType, diff --git a/message/message.go b/message/message.go index c1189862..c585c009 100644 --- a/message/message.go +++ b/message/message.go @@ -462,6 +462,8 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement { FileId: int64(elem.CustomFace.GetFileId()), ImageId: elem.CustomFace.GetFilePath(), Size: elem.CustomFace.GetSize(), + Width: elem.CustomFace.GetWidth(), + Height: elem.CustomFace.GetHeight(), Url: url, ImageBizType: func() ImageBizType { if len(elem.CustomFace.PbReserve) == 0 { @@ -559,6 +561,8 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement { FileId: int64(flash.FlashTroopPic.GetFileId()), ImageId: flash.FlashTroopPic.GetFilePath(), Size: flash.FlashTroopPic.GetSize(), + Width: flash.FlashTroopPic.GetWidth(), + Height: flash.FlashTroopPic.GetHeight(), Md5: flash.FlashTroopPic.Md5, Flash: true, })