获取用户发送的图片

就这破事也能水一贴

使用 ctx.commend().action(({sission})=>{}) 中的 session.content 可以获取用户消息。得到的内容实际上是混合的:

QQ截图20240110223617

结果是:<at id="xxx"> 你好 <image url="..."/>

台下 :person_raising_hand: 这题我会,使用正则不就可以了吗?

从不知道某个版本开始,koishi 的图片获取从 <image url> 改为了 <img src>。似乎偏向 HTML 的格式了

这个时候,原先正则的写法就得进行修改了。

    const regex = /url="([^"]+)"/;
    // 匹配双引号之间的内容作为地址
    const match = regex.exec(session.content);
    const imageUrl = match[1];

改为

    const regex = /src="([^"]+)"/;
    // 匹配双引号之间的内容作为地址
    const match = regex.exec(session.content);
    const imageUrl = match[1];

这个时候,你还觉得正则是规范化的标准吗?

台下 :person_raising_hand: 那怎么办,再修改正则然后发布包咯

官方提供了一个 h.select() 的方法,可以获取 指定 type 阿内容信息。
而 消息的内容结构似乎又放在 session.element 中。

[
  Element {
    type: 'at',
    attrs: { id: 'xxx' },
    children: []
  },
  Element {
    type: 'text',
    attrs: { content: ' 你好 ' },
    children: []
  },
  Element {
    type: 'img',
    attrs: {
      src: 'https://gchat.qpic.cn/...'
    },
    children: []
  }
]

对应的操作就显然可见该怎么做了嗯…


有点错误的

TypeScript

import { Context, Schema } from 'koishi'

// ...
ctx.command('取图').action(async ({session}) => {

    const regex = /src="([^"]+)"/;
    // 匹配双引号之间的内容作为地址
    const match = regex.exec(session.content);
    const imageUrl = match[1];
})

正确的

TypeScript

import { Context, Schema, h } from 'koishi'

// ...
ctx.command('取图').action(async ({session}) => {

    const [img] = h.select(session.elements, 'img');
    const imageUrl = img.attrs.src;
})

获取内容、获取艾特信息

如上所示,修改 h.select(session.element,query) 中 query 的值,即可获取对应的内容。注意它返回的是数组

  • text 获取内容
  • at 获取艾特信息

相关文档

10 个赞

谢谢你的帖子,对我帮助很大:heart:

排班工整、内容清晰,整体简洁美观,很容易看懂,像是老师在我面前一步一步,考虑的很全面,

真的十分感激,

谢谢你!

4 个赞