diff --git a/client/client.go b/client/client.go
index 31df631d..7ddaa870 100644
--- a/client/client.go
+++ b/client/client.go
@@ -507,17 +507,17 @@ func (c *QQClient) GetForwardMessage(resId string) *message.ForwardMessage {
if multiMsg.GetPbItemList() == nil {
return nil
}
- var msg *msg.PbMultiMsgItem
+ var item *msg.PbMultiMsgItem
for _, m := range multiMsg.GetPbItemList() {
if m.GetFileName() == "MultiMsg" {
- msg = m
+ item = m
break
}
}
- if msg == nil || msg.GetBuffer() == nil || msg.GetBuffer().GetMsg() == nil {
+ if item == nil || item.GetBuffer() == nil || item.GetBuffer().GetMsg() == nil {
return nil
}
- for _, m := range msg.GetBuffer().GetMsg() {
+ for _, m := range item.GetBuffer().GetMsg() {
ret.Nodes = append(ret.Nodes, &message.ForwardNode{
SenderId: m.Head.GetFromUin(),
SenderName: func() string {
diff --git a/client/group_msg.go b/client/group_msg.go
index b3997224..049709eb 100644
--- a/client/group_msg.go
+++ b/client/group_msg.go
@@ -61,11 +61,8 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage,
// SendGroupForwardMessage 发送群合并转发消息
func (c *QQClient) SendGroupForwardMessage(groupCode int64, m *message.ForwardMessage) *message.GroupMessage {
- mg := c.UploadGroupForwardMessage(groupCode, m)
return c.sendGroupMessage(groupCode, true,
- &message.SendingMessage{Elements: []message.IMessageElement{
- &mg.ServiceElement,
- }},
+ &message.SendingMessage{Elements: []message.IMessageElement{c.UploadGroupForwardMessage(groupCode, m)}},
)
}
@@ -152,25 +149,10 @@ func (c *QQClient) uploadGroupLongMessage(groupCode int64, m *message.ForwardMes
ts := time.Now().UnixNano()
seq := c.nextGroupSeq()
data, hash := m.CalculateValidationData(seq, rand.Int31(), groupCode)
- i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, 1, utils.ToGroupUin(groupCode)))
+ rsp, body, err := c.multiMsgApplyUp(groupCode, data, hash, 1)
if err != nil {
return nil
}
- rsp := i.(*multimsg.MultiMsgApplyUpRsp)
- body, _ := proto.Marshal(&longmsg.LongReqBody{
- Subcmd: 1,
- TermType: 5,
- PlatformType: 9,
- MsgUpReq: []*longmsg.LongMsgUpReq{
- {
- MsgType: 3,
- DstUin: utils.ToGroupUin(groupCode),
- MsgContent: data,
- StoreType: 2,
- MsgUkey: rsp.MsgUkey,
- },
- },
- })
for i, ip := range rsp.Uint32UpIp {
err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
if err == nil {
@@ -197,10 +179,28 @@ func (c *QQClient) UploadGroupForwardMessage(groupCode int64, m *message.Forward
ts := time.Now().UnixNano()
seq := c.nextGroupSeq()
data, hash, items := m.CalculateValidationDataForward(seq, rand.Int31(), groupCode)
- i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, 2, utils.ToGroupUin(groupCode)))
+ rsp, body, err := c.multiMsgApplyUp(groupCode, data, hash, 2)
if err != nil {
return nil
}
+ for i, ip := range rsp.Uint32UpIp {
+ err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
+ if err == nil {
+ var pv string
+ for i := 0; i < int(math.Min(4, float64(len(m.Nodes)))); i++ {
+ pv += fmt.Sprintf(`
%s: %s`, m.Nodes[i].SenderName, message.ToReadableString(m.Nodes[i].Message))
+ }
+ return genForwardTemplate(rsp.MsgResid, pv, "群聊的聊天记录", "[聊天记录]", "聊天记录", fmt.Sprintf("查看 %d 条转发消息", len(m.Nodes)), ts, items)
+ }
+ }
+ return nil
+}
+
+func (c *QQClient) multiMsgApplyUp(groupCode int64, data []byte, hash []byte, buType int32) (*multimsg.MultiMsgApplyUpRsp, []byte, error) {
+ i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, buType, utils.ToGroupUin(groupCode)))
+ if err != nil {
+ return nil, nil, err
+ }
rsp := i.(*multimsg.MultiMsgApplyUpRsp)
body, _ := proto.Marshal(&longmsg.LongReqBody{
Subcmd: 1,
@@ -216,17 +216,7 @@ func (c *QQClient) UploadGroupForwardMessage(groupCode int64, m *message.Forward
},
},
})
- for i, ip := range rsp.Uint32UpIp {
- err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
- if err == nil {
- var pv string
- for i := 0; i < int(math.Min(4, float64(len(m.Nodes)))); i++ {
- pv += fmt.Sprintf(`%s: %s`, m.Nodes[i].SenderName, message.ToReadableString(m.Nodes[i].Message))
- }
- return genForwardTemplate(rsp.MsgResid, pv, "群聊的聊天记录", "[聊天记录]", "聊天记录", fmt.Sprintf("查看 %d 条转发消息", len(m.Nodes)), ts, items)
- }
- }
- return nil
+ return rsp, body, nil
}
// MessageSvc.PbSendMsg
diff --git a/message/message.go b/message/message.go
index aaa248ee..a78790ae 100644
--- a/message/message.go
+++ b/message/message.go
@@ -560,6 +560,42 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement {
}
func (forMsg *ForwardMessage) CalculateValidationData(seq, random int32, groupCode int64) ([]byte, []byte) {
+ msgs := forMsg.packForwardMsg(seq, random, groupCode)
+ trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
+ {
+ FileName: proto.String("MultiMsg"),
+ Buffer: &msg.PbMultiMsgNew{Msg: msgs},
+ },
+ }}
+ b, _ := proto.Marshal(trans)
+ data := binary.GZipCompress(b)
+ hash := md5.Sum(data)
+ return data, hash[:]
+}
+
+// CalculateValidationDataForward 屎代码
+func (forMsg *ForwardMessage) CalculateValidationDataForward(seq, random int32, groupCode int64) ([]byte, []byte, []*msg.PbMultiMsgItem) {
+ msgs := forMsg.packForwardMsg(seq, random, groupCode)
+ trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
+ {
+ FileName: proto.String("MultiMsg"),
+ Buffer: &msg.PbMultiMsgNew{Msg: msgs},
+ },
+ }}
+ for _, node := range forMsg.Nodes {
+ for _, message := range node.Message {
+ if forwardElement, ok := message.(*ForwardElement); ok {
+ trans.PbItemList = append(trans.PbItemList, forwardElement.Items...)
+ }
+ }
+ }
+ b, _ := proto.Marshal(trans)
+ data := binary.GZipCompress(b)
+ hash := md5.Sum(data)
+ return data, hash[:], trans.PbItemList
+}
+
+func (forMsg *ForwardMessage) packForwardMsg(seq int32, random int32, groupCode int64) []*msg.Message {
var msgs []*msg.Message
for _, node := range forMsg.Nodes {
msgs = append(msgs, &msg.Message{
@@ -586,65 +622,7 @@ func (forMsg *ForwardMessage) CalculateValidationData(seq, random int32, groupCo
},
})
}
- trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
- {
- FileName: proto.String("MultiMsg"),
- Buffer: &msg.PbMultiMsgNew{Msg: msgs},
- },
- }}
- b, _ := proto.Marshal(trans)
- data := binary.GZipCompress(b)
- hash := md5.Sum(data)
- return data, hash[:]
-}
-
-// CalculateValidationDataForward 屎代码
-func (forMsg *ForwardMessage) CalculateValidationDataForward(seq, random int32, groupCode int64) ([]byte, []byte, []*msg.PbMultiMsgItem) {
- var msgs []*msg.Message
- for _, node := range forMsg.Nodes {
- msgs = append(msgs, &msg.Message{
- Head: &msg.MessageHead{
- FromUin: &node.SenderId,
- MsgSeq: &seq,
- MsgTime: &node.Time,
- MsgUid: proto.Int64(0x01000000000000000 | (int64(random) & 0xFFFFFFFF)),
- MutiltransHead: &msg.MutilTransHead{
- MsgId: proto.Int32(1),
- },
- MsgType: proto.Int32(82),
- GroupInfo: &msg.GroupInfo{
- GroupCode: &groupCode,
- GroupRank: []byte{},
- GroupName: []byte{},
- GroupCard: &node.SenderName,
- },
- },
- Body: &msg.MessageBody{
- RichText: &msg.RichText{
- Elems: func() []*msg.Elem {
- return ToProtoElems(node.Message, false)
- }(),
- },
- },
- })
- }
- trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
- {
- FileName: proto.String("MultiMsg"),
- Buffer: &msg.PbMultiMsgNew{Msg: msgs},
- },
- }}
- for _, item1 := range forMsg.Nodes {
- for _, item2 := range item1.Message {
- if item3, ok := item2.(*ForwardElement); ok {
- trans.PbItemList = append(trans.PbItemList, item3.Items...)
- }
- }
- }
- b, _ := proto.Marshal(trans)
- data := binary.GZipCompress(b)
- hash := md5.Sum(data)
- return data, hash[:], trans.PbItemList
+ return msgs
}
func ToReadableString(m []IMessageElement) (r string) {
@@ -658,10 +636,6 @@ func ToReadableString(m []IMessageElement) (r string) {
r += "/" + e.Name
case *GroupImageElement:
r += "[图片]"
- case *ServiceElement:
- if e.SubType == "Forward" {
- r += "[聊天记录]"
- }
case *ForwardElement:
r += "[聊天记录]"
// NOTE: flash pic is singular
diff --git a/message/pack.go b/message/pack.go
index f62e6344..6488480d 100644
--- a/message/pack.go
+++ b/message/pack.go
@@ -125,21 +125,7 @@ func (e *FriendImageElement) Pack() (r []*msg.Elem) {
func (e *ServiceElement) Pack() (r []*msg.Elem) {
r = []*msg.Elem{}
- if e.Id == 35 {
- r = append(r, &msg.Elem{
- RichMsg: &msg.RichMsg{
- Template1: append([]byte{1}, binary.ZlibCompress([]byte(e.Content))...),
- ServiceId: &e.Id,
- MsgResId: []byte{},
- },
- })
- r = append(r, &msg.Elem{
- Text: &msg.Text{
- Str: proto.String("你的QQ暂不支持查看[转发多条消息],请期待后续版本。"),
- },
- })
- return
- }
+ // id =35 已移至 ForwardElement
if e.Id == 33 {
r = append(r, &msg.Elem{
Text: &msg.Text{Str: &e.ResId},