napcat+onebot+koishi 如何获取私聊历史记录

尝试使用 ctx.bots[0].getMessageList(channel.id) 出错
但是群聊历史消息是可以这样获得的

2 个赞

getMessageList() 目前仅支持群聊历史消息,因为标准的 OneBot 11 协议只提供了 get_group_msg_history API,没有对应的私聊历史消息接口。

不过,如果你使用的是 NapCat 协议端,它提供了扩展 API get_friend_msg_history 来获取私聊历史记录。

参考文档:https://napneko.github.io/develop/api/doc#get-friend-msg-history-获取私聊历史记录

无独有偶,llonebot 也有这样的API支持 https://llonebot.apifox.cn/api-227239657

使用方法

你可以通过 bot.internal._request() 直接调用扩展 API:

import { Universal, Bot } from "koishi";

// 获取指定的 bot 实例
const bot = (Object.values(ctx.bots) as Bot[]).find(
  b => b.selfId === "你的botId" || b.user?.id === "你的botId"
);

if (!bot || bot.status !== Universal.Status.ONLINE) {
  ctx.logger.error(`机器人离线或未找到。`);
  return;
}

// 调用 NapCat 的 get_friend_msg_history API
const result = await bot.internal._request('get_friend_msg_history', {
  user_id: 123456789,  // 好友 QQ 号
  message_seq: 0,      // 起始消息序号(可选)
  count: 20,           // 获取消息数量(可选)
  reverseOrder: false  // 倒序(可选)
});

ctx.logger.info(result);

注意事项

  • 此方法仅适用于支持此API的协议端
  • _request() 是底层 API 调用方法,返回的是原始 OneBot 协议数据

另外,我觉得各协议端达成一致的API 理应内置在adapter-onebot适配器里去实现调用,你可以关注一下此仓库的PR情况 → https://github.com/koishijs/koishi-plugin-adapter-onebot/pull/75#issuecomment-4013326875

2 个赞

谢谢!我尝试一下!

3 个赞

上文我提及到的 Pull Request 目前已经通过,你可以像这样子调用来获取私聊的历史记录。

  ctx.command('历史记录')
    .action(async ({ session }, id) => {
      const aaa = await session.bot.internal.getFriendMsgHistory(session.userId)
      ctx.logger.info(aaa)
      return
    })