图源
介绍
图源插件是用于获取图片的插件,它可以从网络、本地文件、剪贴板、数据库等地方获取图片。
由于图源插件本身也是一个标准的 Koishi 插件,这意味着它必须导出一个函数,或者一个带有 apply
方法的对象。为了方便开发,我们提供了一个抽象类 ImageSource
,当你继承它并实现相应方法后以默认方式导出,就可以作为 Koishi 插件被加载,这有助于插件作者快速开发图源插件。
准备工作
在此,我们将假设你已经阅读了认识插件,并且配置好了 Koishi 插件的开发环境。
图源插件需要继承的 ImageSource
类定义在 koishi-plugin-booru
包中,因此你需要将 koishi-plugin-booru
插件列为你的图源插件的对等依赖 (peerDependencies)。
json
{
"peerDependencies": {
"booru": "^1.2.0"
}
}
请根据你所需求的功能酌情升级对等依赖的 booru 插件的版本
开发图源插件
此处以简化版的 lolicon
插件为例,可以从 https://api.lolicon.net/
的 API 获取图片及元信息。它的官方实现可以在 这里。
ts
import { Context, Schema } from 'koishi'
import { ImageSource } from 'koishi-plugin-booru'
class LoliconImageSource extends ImageSource<LoliconImageSource.Config> {
// 定义图源支持的语言
// 如 lolicon 支持日语、英语和汉语-简体中文等
languages: string[] = ['en', 'zh-CN', 'ja']
constructor(ctx: Context, config: LoliconImageSource.Config) {
// 调用父类的拟构函数以注册图源
super(ctx, config)
}
// `booru` 默认将标签转换为类 `danbooru` 的形式,即「空格分割标签,下划线替代空格」。
// 而 lolicon 支持的标签不带空格,因此此处需要将其重载为空格分割。
override tokenize(query: string): string[] {
return query.split(/\s+/)
}
async get(query: ImageSource.Query): Promise<ImageSource.Result[]> {
const param = {
// `tags` 是一个字符串数组,根据 Lolicon API 的文档,传入数组等于「与」操作。
tag: query.tags,
// 指定获取数量
num: query.count,
}
// 注:根据图源设计规范,当 `query.tags` 为空数组或空时,应当返回随机图片。
// 由于 Lolicon API 默认对空标签会返回随机图,因此不需要做特别处理,
// 但对于其他图源可能需要传入特别的参数才能使用随机图片功能。
const resp = await this.http.post('https://api.lolicon.app/setu/v2', param)
if (!Array.isArray(resp.data)) {
return
}
// 返回类型为 `Result` 的数组,可用字段可参考类型提示。
// 其中 `urls.*` 字段是图片的地址,也可以是 `base64` 编码。
// 其中 `original` 是必须字段,应当是原图尺寸的 URL。
// 另外还有 `large` (1200px) `medium` (600px) `small` (300px) `thumbnail` 等字段。
// 括号中为该尺寸的参考大小,如果图源不提供对应尺寸,可以忽略此字段。
return resp.data.map((setu) => {
return {
urls: {
original: setu.urls.original,
large: setu.urls.regular,
medium: setu.urls.small,
small: setu.urls.thumb,
thumbnail: setu.urls.mini,
},
title: setu.title,
author: setu.author,
nsfw: setu.r18,
tags: setu.tags,
pageUrl: `https://pixiv.net/i/${setu.pid}`,
}
})
}
}
// 图源插件还需要导出配置项,因此我们采用 TypeScript 的 namespace
// 将配置项 Config 与上面的 class 定义合并。
namespace LoliconImageSource {
export interface Config extends ImageSource.Config {}
export const Config: Schema<Config> = Schema.intersect([
// 结合使用 `Svchema.intersect` 和 `createSchema` 辅助函数,
// 向图源插件的配置项里添加全局的通用配置,`label` 一般为图源插件名。
ImageSource.createSchema({ label: 'lolicon' }),
])
}
// 以默认导出方式导出整个命名空间
export default LoliconImageSource
TIP
上述代码为介绍与解释 booru
图源的开发步骤有一定简化,你可以直接在 GitHub 上阅读 lolicon 插件真正的源码。