使用onebot适配器给qq信息贴表情 有没有更好的方法?

我找了一下好像koishi没有支持这个,只能通过调用onebot的底层接口来实现,如
koishi+onebot+napcat 如何回应表情 - 交流讨论 - Koishi Forum
里面提到的方法(对收到的消息):
先写个接口

interface OneBotLike {
  _request(action: string, params: Record<string, unknown>): Promise<unknown>
}
type OneBotSession = Session & {
  onebot?: OneBotLike
}
function getOneBot(session: Session) {
  const onebot = (session as OneBotSession).onebot
  if (onebot && typeof onebot._request === 'function') return onebot
}

然后调接口

const onebot = getOneBot(session)
await onebot._request(
  "set_msg_emoji_like",
  {
    message_id: session.event.message.id,
    emoji_id: 324, 
  }
).catch((err) => {
  ctx.logger.error(`napcat添加表情失败: ${err.message}`);
})

主动对某个 messageID 贴表情的话也要先写个接口:

interface OneBotLike {
  platform?: string
  isActive?: boolean
  sendMessage?: (...args: any[]) => any
  internal?: {
    _request?: (action: string, params: Record<string, unknown>) => Promise<unknown>
  }
}

ctx.bot里面通过 platformisActive 选择正确的bot,然后再使用

bot.internal._request {...}

像前面那样发请求。

这就是我目前的做法,但是感觉这样转换有点蠢(
大佬们有没有更好的方法?

1 个赞

反正都是收到消息了才会贴表情

那你看到就会收到onebot的消息,也就能拿到session

你可以直接用session.bot去调用方法

不要ctx.bot去寻找了

比如有时候需要对bot自己发的信息贴表情,但是napcat又设置不接收自己发的消息,这时候就需要这样做了。

1 个赞

基本只有一种情况可以更简单地处理

就是 是你自己的插件发消息,并且是被动交互,是有session的 并且是可以拿到返回的消息ID的

其实你也可以用这个消息id去贴表情。

const messageId = await session.send("你好哦")

可以拿到这个 messageId 去用 session.bot 请求 set_msg_emoji_like API


对于其他情况,不管是你主动发消息 还是其他插件发被动消息,都还是如你之前做的那样请求API比较好

感觉没什么问题

另外不需要自己写接口,

import type { OneBotBot } from 'koishi-plugin-adapter-onebot'

即可

1 个赞

感谢,我目前就是类似的做法

1 个赞

感谢,这个可以考虑一下

1 个赞

onebot 适配器没有跟进这个API哦~~~

没有set_msg_emoji_like这个api,import这个OneBotBot 就可以不用像我上面那样自己写一个接口层OneBotLike,然后直接调用internal._request

1 个赞
2 个赞