From 626638e899eb4652a8499f4689461bc25d7b93a8 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Mon, 10 Aug 2020 05:37:51 +0800 Subject: [PATCH] temp message sending supported. --- README.md | 6 +++--- client/builders.go | 34 ++++++++++++++++++++++++++++++++++ client/client.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 14be4d41..de9bb6bd 100644 --- a/README.md +++ b/README.md @@ -44,11 +44,11 @@ qq-android协议的golang实现 移植于mirai - [x] 客户端离线 #### 主动操作 -> 为防止滥用,将不支持主动/被动发送任何临时会话消息 +> 为防止滥用,将不支持主动邀请新成员进群 - [x] 发送群消息 - [x] 发送好友消息 -- [ ] ~~发送临时会话消息~~ +- [x] 发送临时会话消息 - [x] 获取/刷新群列表 - [x] 获取/刷新群成员列表 - [x] 获取/刷新好友列表 @@ -61,6 +61,6 @@ qq-android协议的golang实现 移植于mirai - [x] 群设置 (全体禁言/群名) - [x] 修改群成员Card - [x] 修改群成员头衔 -- [ ] 群成员邀请 +- [ ] ~~群成员邀请~~ - [x] 群成员禁言/解除禁言 - [x] T出群成员 diff --git a/client/builders.go b/client/builders.go index 2b0ce1b3..6dcdbb7d 100644 --- a/client/builders.go +++ b/client/builders.go @@ -454,6 +454,40 @@ func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r int32, time return seq, packet } +// MessageSvc.PbSendMsg +func (c *QQClient) buildTempSendingPacket(groupUin, target int64, msgSeq, r int32, time int64, m *message.SendingMessage) (uint16, []byte) { + seq := c.nextSeq() + req := &msg.SendMessageRequest{ + RoutingHead: &msg.RoutingHead{GrpTmp: &msg.GrpTmp{ + GroupUin: groupUin, + ToUin: target, + }}, + ContentHead: &msg.ContentHead{PkgNum: 1}, + MsgBody: &msg.MessageBody{ + RichText: &msg.RichText{ + Elems: message.ToProtoElems(m.Elements, false), + }, + }, + MsgSeq: msgSeq, + MsgRand: r, + SyncCookie: func() []byte { + cookie := &msg.SyncCookie{ + Time: time, + Ran1: rand.Int63(), + Ran2: rand.Int63(), + Const1: syncConst1, + Const2: syncConst2, + Const3: 0x1d, + } + b, _ := proto.Marshal(cookie) + return b + }(), + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "MessageSvc.PbSendMsg", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + // LongConn.OffPicUp func (c *QQClient) buildOffPicUpPacket(target int64, md5 []byte, size int32) (uint16, []byte) { seq := c.nextSeq() diff --git a/client/client.go b/client/client.go index e8abf332..195715fa 100644 --- a/client/client.go +++ b/client/client.go @@ -291,6 +291,39 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) * } } +func (c *QQClient) SendTempMessage(groupCode, target int64, m *message.SendingMessage) *message.TempMessage { + group := c.FindGroup(groupCode) + if group == nil { + return nil + } + if c.FindFriend(target) != nil { + pm := c.SendPrivateMessage(target, m) + return &message.TempMessage{ + Id: pm.Id, + GroupCode: group.Code, + GroupName: group.Name, + Sender: pm.Sender, + Elements: m.Elements, + } + } + mr := int32(rand.Uint32()) + seq := c.nextFriendSeq() + t := time.Now().Unix() + _, pkt := c.buildTempSendingPacket(group.Uin, target, seq, mr, t, m) + _ = c.send(pkt) + return &message.TempMessage{ + Id: seq, + GroupCode: group.Code, + GroupName: group.Name, + Sender: &message.Sender{ + Uin: c.Uin, + Nickname: c.Nickname, + IsFriend: true, + }, + Elements: m.Elements, + } +} + func (c *QQClient) GetForwardMessage(resId string) *message.ForwardMessage { i, err := c.sendAndWait(c.buildMultiApplyDownPacket(resId)) if err != nil {