fix: forward

This commit is contained in:
idranme 2024-10-26 00:14:27 +08:00
parent 78f04f0ba2
commit 9be43de04b
No known key found for this signature in database
GPG Key ID: D0F3677546E6ECD5
3 changed files with 34 additions and 26 deletions

View File

@ -153,7 +153,17 @@ export class NTQQMsgApi extends Service {
afterFirstCmd: false, afterFirstCmd: false,
cmdCB: payload => { cmdCB: payload => {
for (const msgRecord of payload.msgList) { for (const msgRecord of payload.msgList) {
if (msgRecord.peerUid === destPeer.peerUid && msgRecord.senderUid === selfUid) { if (
msgRecord.msgType === 11 &&
msgRecord.subMsgType === 7 &&
msgRecord.peerUid === destPeer.peerUid &&
msgRecord.senderUid === selfUid
) {
const element = msgRecord.elements[0]
const data = JSON.parse(element.arkElement!.bytesData)
if (data.app !== 'com.tencent.multimsg' || !data.meta.detail.resid) {
continue
}
return true return true
} }
} }
@ -161,20 +171,12 @@ export class NTQQMsgApi extends Service {
} }
} }
) )
for (const msg of data.msgList) { return data.msgList.find(msgRecord => {
const arkElement = msg.elements.find(ele => ele.arkElement) const { arkElement } = msgRecord.elements[0]
if (!arkElement) { if (arkElement?.bytesData.includes('com.tencent.multimsg')) {
continue return true
} }
const forwardData = JSON.parse(arkElement.arkElement!.bytesData) })!
if (forwardData.app !== 'com.tencent.multimsg') {
continue
}
if (msg.peerUid === destPeer.peerUid && msg.senderUid === selfUid) {
return msg
}
}
throw new Error('转发消息超时')
} }
async getSingleMsg(peer: Peer, msgSeq: string) { async getSingleMsg(peer: Peer, msgSeq: string) {

View File

@ -19,7 +19,7 @@ interface Payload {
interface Response { interface Response {
message_id: number message_id: number
forward_id?: string forward_id: string
} }
export class SendForwardMsg extends BaseAction<Payload, Response> { export class SendForwardMsg extends BaseAction<Payload, Response> {
@ -60,14 +60,11 @@ export class SendForwardMsg extends BaseAction<Payload, Response> {
} }
} }
let msg: RawMessage
if (fake && this.ctx.app.native.activated) { if (fake && this.ctx.app.native.activated) {
msg = await this.handleFakeForwardNode(peer, nodes) return await this.handleFakeForwardNode(peer, nodes)
} else { } else {
msg = await this.handleForwardNode(peer, nodes) return await this.handleForwardNode(peer, nodes)
} }
const msgShortId = this.ctx.store.createMsgShortId({ chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId)
return { message_id: msgShortId }
} }
private parseNodeContent(nodes: OB11MessageNode[]) { private parseNodeContent(nodes: OB11MessageNode[]) {
@ -82,7 +79,7 @@ export class SendForwardMsg extends BaseAction<Payload, Response> {
}) })
} }
private async handleFakeForwardNode(peer: Peer, nodes: OB11MessageNode[]) { private async handleFakeForwardNode(peer: Peer, nodes: OB11MessageNode[]): Promise<Response> {
const encoder = new MessageEncoder(this.ctx, peer) const encoder = new MessageEncoder(this.ctx, peer)
const raw = await encoder.generate(nodes) const raw = await encoder.generate(nodes)
const transmit = Msg.PbMultiMsgTransmit.encode({ pbItemList: raw.multiMsgItems }).finish() const transmit = Msg.PbMultiMsgTransmit.encode({ pbItemList: raw.multiMsgItems }).finish()
@ -122,7 +119,11 @@ export class SendForwardMsg extends BaseAction<Payload, Response> {
}) })
} }
}], 1800) }], 1800)
return msg! const msgShortId = this.ctx.store.createMsgShortId({
chatType: msg!.chatType,
peerUid: msg!.peerUid
}, msg!.msgId)
return { message_id: msgShortId, forward_id: resid }
} catch (e) { } catch (e) {
this.ctx.logger.error('合并转发失败', e) this.ctx.logger.error('合并转发失败', e)
throw new Error(`发送伪造合并转发消息失败 (res_id: ${resid} `) throw new Error(`发送伪造合并转发消息失败 (res_id: ${resid} `)
@ -153,7 +154,7 @@ export class SendForwardMsg extends BaseAction<Payload, Response> {
} }
// 返回一个合并转发的消息id // 返回一个合并转发的消息id
private async handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[]) { private async handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[]): Promise<Response> {
const selfPeer = { const selfPeer = {
chatType: ChatType.C2C, chatType: ChatType.C2C,
peerUid: selfInfo.uid, peerUid: selfInfo.uid,
@ -245,8 +246,13 @@ export class SendForwardMsg extends BaseAction<Payload, Response> {
if (retMsgIds.length === 0) { if (retMsgIds.length === 0) {
throw Error('转发消息失败,节点为空') throw Error('转发消息失败,节点为空')
} }
const returnMsg = await this.ctx.ntMsgApi.multiForwardMsg(srcPeer!, destPeer, retMsgIds) const msg = await this.ctx.ntMsgApi.multiForwardMsg(srcPeer!, destPeer, retMsgIds)
return returnMsg const resid = JSON.parse(msg.elements[0].arkElement!.bytesData).meta.detail.resid
const msgShortId = this.ctx.store.createMsgShortId({
chatType: msg.chatType,
peerUid: msg.peerUid
}, msg.msgId)
return { message_id: msgShortId, forward_id: resid }
} }
} }

View File

@ -174,7 +174,7 @@ export class MessageEncoder {
const { type, data } = segment const { type, data } = segment
if (type === OB11MessageDataType.Node) { if (type === OB11MessageDataType.Node) {
await this.render(data.content as OB11MessageData[]) await this.render(data.content as OB11MessageData[])
const id = data.id ?? data.user_id const id = data.uin ?? data.user_id
this.uin = id ? +id : undefined this.uin = id ? +id : undefined
this.name = data.name ?? data.nickname this.name = data.name ?? data.nickname
await this.flush() await this.flush()