就这破事也能水一贴
使用 ctx.commend().action(({sission})=>{})
中的 session.content
可以获取用户消息。得到的内容实际上是混合的:
结果是:<at id="xxx"> 你好 <image url="..."/>
台下 这题我会,使用正则不就可以了吗?
从不知道某个版本开始,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];
这个时候,你还觉得正则是规范化的标准吗?
台下 那怎么办,再修改正则然后发布包咯
官方提供了一个 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 获取艾特信息