diff --git a/src/ntqqapi/api/msg.ts b/src/ntqqapi/api/msg.ts index 3ca5551..2953723 100644 --- a/src/ntqqapi/api/msg.ts +++ b/src/ntqqapi/api/msg.ts @@ -235,7 +235,7 @@ export class NTQQMsgApi extends Service { }, null]) } - async queryMsgsWithFilterExBySeq(peer: Peer, msgSeq: string, filterMsgTime: string, filterSendersUid: string[]) { + async queryMsgsWithFilterExBySeq(peer: Peer, msgSeq: string, filterMsgTime: string, filterSendersUid: string[] = []) { return await invoke('nodeIKernelMsgService/queryMsgsWithFilterEx', [{ msgId: '0', msgTime: '0', diff --git a/src/ntqqapi/api/webapi.ts b/src/ntqqapi/api/webapi.ts index faec193..fdaaff2 100644 --- a/src/ntqqapi/api/webapi.ts +++ b/src/ntqqapi/api/webapi.ts @@ -305,4 +305,34 @@ export class NTQQWebApi extends Service { private cookieToString(cookieObject: Dict) { return Object.entries(cookieObject).map(([key, value]) => `${key}=${value}`).join('; ') } + + async findGroupEssenceMsg(groupCode: string, msgSeq: number) { + for (let i = 0; i < 20; i++) { + const res = await this.getGroupEssenceMsgList(groupCode, i, 50) + if (!res) break + const msg = res.data.msg_list.find(e => e.msg_seq === msgSeq) + if (msg) return msg + if (res.data.is_end) break + } + } + + async getGroupEssenceMsgList(groupCode: string, pageStart: number, pageLimit: number) { + const cookieObject = await this.ctx.ntUserApi.getCookies('qun.qq.com') + try { + const ret = await RequestUtil.HttpGetJson( + `https://qun.qq.com/cgi-bin/group_digest/digest_list?${new URLSearchParams({ + bkn: this.genBkn(cookieObject.skey), + page_start: pageStart.toString(), + page_limit: pageLimit.toString(), + group_code: groupCode, + })}`, + 'GET', + '', + { 'Cookie': this.cookieToString(cookieObject) } + ) + return ret.retcode === 0 ? ret : undefined + } catch { + return undefined + } + } } diff --git a/src/ntqqapi/types/msg.ts b/src/ntqqapi/types/msg.ts index 9812fe5..19746f3 100644 --- a/src/ntqqapi/types/msg.ts +++ b/src/ntqqapi/types/msg.ts @@ -482,7 +482,7 @@ export interface RawMessage { msgSeq: string msgRandom: string senderUid: string - senderUin?: string // 发送者QQ号 + senderUin: string // 发送者QQ号 peerUid: string // 群号 或者 QQ uid peerUin: string // 群号 或者 发送者QQ号 guildId: string diff --git a/src/onebot11/entities.ts b/src/onebot11/entities.ts index fb341ae..1ca1551 100644 --- a/src/onebot11/entities.ts +++ b/src/onebot11/entities.ts @@ -15,7 +15,6 @@ import { FaceIndex, GrayTipElementSubType, Group, - Peer, GroupMember, RawMessage, Sex, @@ -585,27 +584,22 @@ export namespace OB11Entities { if (grayTipElement.jsonGrayTipElement?.busiId === '2401') { ctx.logger.info('收到群精华消息', json) const searchParams = new URL(json.items[0].jp).searchParams - const msgSeq = searchParams.get('msgSeq')! - const Group = searchParams.get('groupCode') - const Peer: Peer = { + const msgSeq = searchParams.get('msgSeq') + const groupCode = searchParams.get('groupCode') + if (!groupCode || !msgSeq) return + const peer = { guildId: '', chatType: ChatType.group, - peerUid: Group! + peerUid: groupCode } - const msgList = (await ctx.ntMsgApi.getMsgsBySeqAndCount(Peer, msgSeq.toString(), 1, true, true))?.msgList - if (!msgList?.length) { - return - } - //const origMsg = await dbUtil.getMsgByLongId(msgList[0].msgId) - //const postMsg = await dbUtil.getMsgBySeqId(origMsg?.msgSeq!) ?? origMsg - // 如果 senderUin 为 0,可能是 历史消息 或 自身消息 - //if (msgList[0].senderUin === '0') { - //msgList[0].senderUin = postMsg?.senderUin ?? getSelfUin() - //} + const essence = await ctx.ntWebApi.findGroupEssenceMsg(groupCode, +msgSeq) + if (!essence) return + const { msgList } = await ctx.ntMsgApi.queryMsgsWithFilterExBySeq(peer, msgSeq, String(essence.sender_time)) return new OB11GroupEssenceEvent( parseInt(msg.peerUid), MessageUnique.getShortIdByMsgId(msgList[0].msgId)!, - parseInt(msgList[0].senderUin!) + parseInt(msgList[0].senderUin), + parseInt(essence.add_digest_uin), ) // 获取MsgSeq+Peer可获取具体消息 } diff --git a/src/onebot11/event/notice/OB11GroupEssenceEvent.ts b/src/onebot11/event/notice/OB11GroupEssenceEvent.ts index b6402f0..4786f81 100644 --- a/src/onebot11/event/notice/OB11GroupEssenceEvent.ts +++ b/src/onebot11/event/notice/OB11GroupEssenceEvent.ts @@ -1,16 +1,20 @@ -import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent'; +import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent' + export class OB11GroupEssenceEvent extends OB11GroupNoticeEvent { notice_type = 'essence' message_id: number sender_id: number sub_type: 'add' | 'delete' = 'add' group_id: number - user_id: number = 0 + user_id: number + operator_id: number - constructor(groupId: number, message_id: number, sender_id: number) { + constructor(groupId: number, messageId: number, senderId: number, operatorId: number) { super() this.group_id = groupId - this.message_id = message_id - this.sender_id = sender_id + this.user_id = senderId + this.message_id = messageId + this.sender_id = senderId + this.operator_id = operatorId } } diff --git a/src/version.ts b/src/version.ts index ff2c349..057d44a 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = '3.33.0' +export const version = '3.33.1'