node-karin
Version:
Lightweight, efficient, concise, and stable robot framework.
2,136 lines (2,124 loc) • 450 kB
TypeScript
import EventEmitter from 'events';
import * as chalk from 'chalk';
export { basePath, commentPath, configPath, consolePath, dataPath, dbPath, defaultConfigPath, defaultViewPath, htmlPath, isPackaged, isPkg, karinDir, karinMain, karinPathBase, karinPathComment, karinPathConfig, karinPathConsole, karinPathData, karinPathDb, karinPathDefaultConfig, karinPathDefaultView, karinPathHtml, karinPathKv, karinPathLogs, karinPathMain, karinPathPlugins, karinPathPm2Config, karinPathRedisSqlite3, karinPathResource, karinPathRoot, karinPathSandboxData, karinPathSandboxTemp, karinPathTaskDb, karinPathTemp, kvPath, logsPath, pluginDir, pm2Path, redisSqlite3Path, resourcePath, sandboxDataPath, sandboxTempPath, tempPath } from './root.js';
import { a as LogMethodNames, b as LoggerLevel, L as Logger } from './types-BjA-iIW1.js';
export { D as DEFAULT_LOGGER_CONFIG, F as FileLogConfig, c as LogMethodsOnly, d as LoggerConfig } from './types-BjA-iIW1.js';
import sqlite3, { Database } from 'sqlite3';
import schedule from 'node-schedule';
import fs$1, { WriteStream } from 'node:fs';
import { Readable } from 'node:stream';
import { AxiosRequestConfig, AxiosResponse } from 'axios';
import YAML from 'yaml';
import { FSWatcher } from 'chokidar';
import { exec as exec$2, ExecException as ExecException$1 } from 'node:child_process';
import { Request as Request$1, Router, Response, RequestHandler, Express } from 'express';
import { exec as exec$1, ExecException } from 'child_process';
export { ExecException } from 'child_process';
import { RedisClientOptions, RedisClientType } from 'redis';
import * as http from 'http';
import { WebSocket } from 'ws';
import 'log4js';
declare const debug: {
chalk: chalk.ChalkInstance;
setColor: (fnc: (text: string) => string) => void;
enable: (bool: boolean) => void;
} & ((...args: any[]) => void);
/**
* 事件来源
* - group: 群聊
* - friend: 好友聊天
* - guild: 频道
* - direct: 频道私信
* - groupTemp: 临时群会话
*/
type Scene = 'group' | 'friend' | 'guild' | 'direct' | 'groupTemp';
/**
* 事件来源类型基类
*/
interface BaseContact {
/** 事件来源 */
scene: Scene;
/** 事件来源id */
peer: string;
/** 事件来源子id 仅在频道、频道私信和临时会话中存在 */
subPeer?: string;
/** 来源场景的昵称 */
name: string;
/** 来源场景的子昵称 */
subName?: string;
}
/**
* 群聊来源信息类型
*/
interface GroupContact extends BaseContact {
scene: 'group';
/** 群ID */
peer: string;
/** 群名 */
name: string;
}
/**
* 好友来源信息类型
*/
interface FriendContact extends BaseContact {
scene: 'friend';
/** 好友ID */
peer: string;
/** 好友昵称 */
name: string;
}
/**
* 频道私信来源信息类型
*/
interface DirectContact extends BaseContact {
scene: 'direct';
/** 频道ID 虚拟ID 用于请求Api使用 */
peer: string;
/** 频道名称 */
name: string;
/** 子频道ID 虚拟ID */
subPeer: string;
/** 子频道名称 */
subName?: string;
}
/**
* 频道来源信息类型
*/
interface GuildContact extends BaseContact {
scene: 'guild';
/** 频道ID */
peer: string;
/** 频道名称 */
name: string;
/** 子频道ID */
subPeer: string;
/** 子频道名称 */
subName: string;
}
/**
* 群临时会话来源信息类型
*/
interface GroupTempContact extends BaseContact {
scene: 'groupTemp';
/** 群ID */
peer: string;
/** 发起临时会话用户ID */
subPeer: string;
/** 群名 */
name: string;
}
/**
* 事件来源信息
* - `group`: 群聊
* - `friend`: 好友
* - `guild`: 频道
* - `direct`: 频道私信
* - `groupTemp`: 临时群会话
*/
type Contact<T extends Scene = Scene> = T extends 'group' ? GroupContact : T extends 'friend' ? FriendContact : T extends 'guild' ? GuildContact : T extends 'direct' ? DirectContact : T extends 'groupTemp' ? GroupTempContact : never;
/**
* 事件发送者性别
* - `male` 男
* - `female` 女
* - `unknown` 未知
*/
type Sex = 'male' | 'female' | 'unknown';
/**
* 事件发送者身份 仅在群聊、频道中存在
* - `owner` 群主、频道主
* - `admin` 管理员、超管
* - `member` 群成员、频道成员
* - `unknown` 未知身份
*/
type Role = 'owner' | 'admin' | 'member' | 'unknown';
/**
* 事件发送者信息父类
*/
interface SenderBase {
/** 发送者ID */
userId: string;
/** 发送者昵称 与`name`一致 */
nick: string;
/** 发送者昵称 与`nick`一致 */
name: string;
/** 发送者性别 */
sex?: Sex;
/** 发送者年龄 */
age?: number;
/** 发送者uid QQ场景专属 */
uid?: string;
/** 发送者uin QQ场景专属 */
uin?: number;
}
/**
* - 好友事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
type FriendSender = SenderBase;
/**
* - 群聊事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
interface GroupSender extends SenderBase {
/** 群成员身份 */
role: Role;
/** 群名片/备注 */
card?: string;
/** 地区 */
area?: string;
/** 成员等级 */
level?: number;
/** 专属头衔 */
title?: string;
}
/**
* - 群聊临时会话事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
type GroupTempSender = SenderBase;
/**
* - 频道事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
interface GuildSender extends SenderBase {
/** 频道成员身份 */
role: Role;
}
/**
* - 频道私信事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
type DirectSender = SenderBase;
/**
* 事件发送者信息
* - `friend`: 好友
* - `group`: 群聊
* - `guild`: 频道
* - `direct`: 频道私信
* - `groupTemp`: 临时群会话
* - `notice`: 通知
* - `request`: 请求
*/
type Sender<T extends Scene = Scene> = T extends 'friend' ? FriendSender : T extends 'group' ? GroupSender : T extends 'guild' ? GuildSender : T extends 'direct' ? DirectSender : T extends 'groupTemp' ? GroupTempSender : never;
/** 构建群聊场景的`sender`函数重载类型 */
interface SenderGroup {
/**
* 构建群聊场景的`sender`
* @param userId 用户ID
* @param role 群成员身份
* @param name 用户名
* @param sex 性别
* @param age 年龄
* @param card 群名片/备注
* @param area 地区
* @param level 成员等级
* @param title 专属头衔
* @param uid QQ场景专属
* @param uin QQ场景专属
*/
(userId: Sender<'group'>['userId'], role?: Sender<'group'>['role'], name?: Sender<'group'>['name'], sex?: Sender<'friend'>['sex'], age?: Sender<'friend'>['age'], card?: Sender<'group'>['card'], area?: Sender<'group'>['area'], level?: Sender<'group'>['level'], title?: Sender<'group'>['title'], uid?: Sender<'friend'>['uid'], uin?: Sender<'friend'>['uin']): Sender<'group'>;
(options: Sender<'group'>): Sender<'group'>;
}
/**
* 适配器所属平台
* - `qq`: QQ
* - `wechat`: 微信
* - `telegram`: Telegram
* - `discord`: Discord
* - `koko`: 开黑吧
* - `other`: 其他
*/
type AdapterPlatform = 'qq' | 'wechat' | 'telegram' | 'discord' | 'koko' | 'other';
/**
* 适配器所使用的标准接口协议
* - `onebot11`: OneBot v11 标准
* - `onebot12`: OneBot v12 标准
* - `oicq`: OICQ 标准
* - `icqq`: OICQ fork 标准
* - `other`: 其他标准
*/
type AdapterStandard = 'onebot11' | 'onebot12' | 'oicq' | 'icqq' | 'other';
/**
* 适配器协议实现名称
* - `console`: 控制台
* - `qqbot`: https://bot.q.qq.com/wiki
* - `icqq`: https://github.com/icqqjs/icqq
* - `gocq-http`: https://docs.go-cqhttp.org/
* - `napcat`: https://napneko.github.io/zh-CN/
* - `oicq`: https://github.com/takayama-lily/oicq
* - `llonebot`: https://llonebot.github.io/zh-CN/
* - `conwechat`: https://justundertaker.github.io/ComWeChatBotClient/
* - `lagrange`: https://lagrangedev.github.io/Lagrange.Doc/Lagrange.OneBot/
*/
type AdapterProtocol = 'qqbot' | 'icqq' | 'gocq-http' | 'napcat' | 'oicq' | 'llonebot' | 'conwechat' | 'lagrange' | 'console' | 'other';
/**
* 适配器通信方式
* - `http`: HTTP 通信
* - `webSocketServer`: WebSocket 服务端
* - `webSocketClient`: WebSocket 客户端
* - `grpc`: gRPC 通信
* - `other`: 其他通信方式
*/
type AdapterCommunication = 'http' | 'webSocketServer' | 'webSocketClient' | 'grpc' | 'other';
/**
* 适配器基本信息
*/
interface AdapterInfo {
/** 适配器索引 默认为-1 在注册适配器时会自动更改为对应的索引 */
index: number;
/** 适配器名称 如lagrange-onebot */
name: string;
/** 适配器版本 */
version: string;
/** 适配器平台 */
platform: AdapterPlatform;
/** 适配器使用的协议标准 如onebot11 */
standard: AdapterStandard;
/** 适配器协议实现 如gocq、napcat */
protocol: AdapterProtocol;
/** 适配器通信方式 */
communication: AdapterCommunication;
/**
* 适配器通信地址
* @example `http://127.0.0.1:7000`
* @example `ws://127.0.0.1:7000/ws`
* @example `grpc://127.0.0.1:7001`
* @example `internal://127.0.0.1`
*/
address: string;
/** 连接时间 */
connectTime: number;
/** 鉴权秘钥 */
secret: string | null;
}
/**
* 适配器账号信息
*/
interface AccountInfo {
/** Bot的uin */
uin: string;
/** Bot的uid */
uid: string;
/** Bot的selfId 一般使用此参数即可 */
selfId: string;
/** 账号名 不存在则是空字符串 */
name: string;
/** Bot的头像链接 */
avatar: string;
/**
* - Bot的子账号键值对
* - 结构约定: key=场景 value=id
* - 此部分由适配器自行实现
* @example
* ```json
* {
* "group": "123456",
* "guild": "123456",
* "friend": "123456",
* "direct": "123456"
* }
* ```
*/
subId: Record<string, string>;
}
/** 按钮结构 */
interface KarinButton {
/** 按钮显示文本 */
text: string;
/** 按钮类型 不建议使用 此为预留字段 */
type?: number;
/**
* - 是否为回调按钮
* @default false
*/
callback?: boolean;
/** 跳转按钮 */
link?: string;
/** 操作相关的数据 */
data?: string;
/** 按钮点击后显示的文字,不传为text */
show?: string;
/**
* 按钮样式
* - 0-灰色线框
* - 1-蓝色线框
* - 2-特殊样式按钮
* - 3-红色文字
* - 4-白色填充
*/
style?: number;
/** 点击按钮后直接自动发送 data */
enter?: boolean;
/** 指令是否带引用回复本消息 */
reply?: boolean;
/** 是否仅群管理员可操作 */
admin?: boolean;
/** 有权限点击的用户UID列表 群聊、私聊 */
list?: string[];
/** 有权限点击的用户UID列表 频道 */
role?: string[];
/** 客户端不支持本 action 的时候,弹出的 toast 文案 */
tips?: string;
}
/** QQ官方按钮消息结构 */
interface QQBotButton {
/** 按钮ID:在一个keyboard消息内设置唯一 */
id: string;
/** 按钮上的文字 */
render_data: {
/** 按钮上的文字 */
label: string;
/** 点击后按钮的上文字 */
visited_label: string;
/**
* 按钮样式
* - 0-灰色线框
* - 1-蓝色线框
* - 2-特殊样式按钮
* - 3-红色文字
* - 4-白色填充
*/
style: number;
};
/** 操作相关的数据 */
action: {
/** 设置 0 跳转按钮:http 或 小程序 客户端识别 scheme,设置 1 回调按钮:回调后台接口, data 传给后台,设置 2 指令按钮:自动在输入框插入 @bot data */
type: 0 | 1 | 2;
/** 权限设置 */
permission: {
/** 0 指定用户可操作,1 仅管理者可操作,2 所有人可操作,3 指定身份组可操作(仅频道可用) */
type: number;
/** 有权限的用户 id 的列表 */
specify_user_ids?: string[];
/** 有权限的身份组 id 的列表(仅频道可用) */
specify_role_ids?: string[];
};
/** 操作相关的数据 */
data: string;
/** 指令按钮可用,指令是否带引用回复本消息,默认 false */
reply?: boolean;
/** 指令按钮可用,点击按钮后直接自动发送 data,默认 false */
enter?: boolean;
/** 本字段仅在指令按钮下有效,设置后后会忽略 action.enter 配置。
设置为 1 时 ,点击按钮自动唤起启手Q选图器,其他值暂无效果。
(仅支持手机端版本 8983+ 的单聊场景,桌面端不支持) */
anchor?: number;
/** 【已弃用】可操作点击的次数,默认不限 */
click_limit?: number;
/** 【已弃用】指令按钮可用,弹出子频道选择器,默认 false */
at_bot_show_channel_list?: boolean;
/** 客户端不支持本action的时候,弹出的toast文案 */
unsupport_tips: string;
};
}
/** QQ按钮消息结构 */
interface QQButtonTextType {
link?: string;
text: string;
show: string;
style: number;
tips: string;
admin?: boolean;
list?: string[];
role?: string[];
enter?: boolean;
reply?: boolean;
callback?: boolean;
}
/**
* @description 消息段类型
* - `text`: 文本
* - `image`: 图片
* - `at`: @
* - `face`: 表情
* - `reply`: 引用回复
* - `video`: 视频
* - `record`: 语音
* - `music`: 音乐
* - `json`: JSON
* - `xml`: XML
* - `markdown`: Markdown
* - `markdownTpl`: Markdown模板
* - `pasmsg`: 被动消息
* - `keyboard`: 多维按钮
* - `button`: 单行按钮
* - `longMsg`: 长消息
* - `raw`: 原始消息
* - `basketball`: 篮球
* - `dice`: 骰子
* - `rps`: 猜拳
* - `bubbleFace`: 气泡表情
* - `weather`: 天气
* - `location`: 位置
* - `share`: 分享
* - `gift`: 礼物
* - `marketFace`: 商城表情
* - `contact`: 联系人
*/
type messageType = 'text' | 'image' | 'at' | 'face' | 'reply' | 'video' | 'record' | 'music' | 'json' | 'xml' | 'markdown' | 'markdownTpl' | 'pasmsg' | 'keyboard' | 'button' | 'longMsg' | 'raw' | 'basketball' | 'dice' | 'rps' | 'bubbleFace' | 'weather' | 'location' | 'share' | 'gift' | 'marketFace' | 'contact' | 'node' | 'file';
interface Element$1 {
/** 消息段类型 */
type: messageType;
}
/** 文本元素 */
interface TextElement extends Element$1 {
type: 'text';
/** 文本内容 */
text: string;
}
/** At元素 */
interface AtElement extends Element$1 {
type: 'at';
/** 目标id atall=all at在线成员=online */
targetId: string;
/** At的名称 */
name?: string;
}
/** 表情元素 */
interface FaceElement extends Element$1 {
type: 'face';
/** 表情ID */
id: number;
/** 是否大表情,默认不是 */
isBig?: boolean;
}
/** 回复元素 */
interface ReplyElement extends Element$1 {
type: 'reply';
/** 回复的消息ID */
messageId: string;
}
/** 图片元素 */
interface ImageElement extends Element$1 {
type: 'image';
/** 图片url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 图片名称 */
name?: string;
/** 图片外显名称 */
summary?: string;
/** 图片MD5 */
md5?: string;
/** 图片宽度 */
width?: number;
/** 图片高度 */
height?: number;
/** 图片子类型 */
subType?: string;
/**
* show: 展示图片
* flash: 闪照
* original: 原图
*/
fileType?: 'show' | 'flash' | 'original';
}
/** 视频元素 */
interface VideoElement extends Element$1 {
type: 'video';
/** 视频url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 视频名称 */
name?: string;
/** 视频MD5 */
md5?: string;
/** 视频宽度 */
width?: number;
/** 视频高度 */
height?: number;
}
/** 文件元素 */
interface FileElement extends Element$1 {
type: 'file';
/** url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 文件名称 */
name?: string;
/** 文件大小 */
size?: number;
/** 文件hash */
hash?: string;
}
/** 语音元素 */
interface RecordElement extends Element$1 {
type: 'record';
/** 语音文件url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 是否为魔法语音 */
magic: boolean;
/** 语音md5 */
md5?: string;
/** 语音名称 */
name?: string;
}
/**
* 支持的音乐平台
* - `custom`: 自定义音乐
* - `qq`: QQ音乐
* - `163`: 网易云音乐
* - `migu`: 咪咕音乐
* - `kugou`: 酷狗音乐
* - `kuwo`: 酷我音乐
*/
type MusicPlatform = 'custom' | 'qq' | '163' | 'migu' | 'kugou' | 'kuwo';
/** 常规音乐 */
interface ReadyMusicElement extends Element$1 {
type: 'music';
/** 音乐平台 */
platform: 'qq' | '163' | 'migu' | 'kugou' | 'kuwo';
/** 歌曲ID */
id: string;
}
/** 自定义音乐元素 */
interface CustomMusicElement extends Element$1 {
type: 'music';
/** 音乐平台 */
platform: 'custom';
/** 跳转链接 */
url: string;
/** 音乐音频链接 */
audio: string;
/** 标题 */
title: string;
/** 歌手 */
author: string;
/** 封面 */
pic: string;
}
/** 音乐元素 */
type MusicElement = CustomMusicElement | ReadyMusicElement;
/** JSON元素 */
interface JsonElement extends Element$1 {
type: 'json';
/** JSON内容 未反序 */
data: string;
}
/** XML元素 */
interface XmlElement extends Element$1 {
type: 'xml';
/** XML内容 未反序 */
data: string;
}
/** Markdown元素 */
interface MarkdownElement extends Element$1 {
type: 'markdown';
/** Markdown内容 */
markdown: string;
config?: {
/** 未知的参数 */
unknown?: number;
time: number;
token: string;
};
}
/** Markdown模板元素 */
interface MarkdownTplElement extends Element$1 {
type: 'markdownTpl';
/** 模板ID */
templateId: string;
/** 模板参数 */
params: Array<{
/** 模板参数键名称 */
key: string;
/** 模板参数值 */
values: Array<string>;
}>;
}
/** 被动事件元素 */
interface PasmsgElement extends Element$1 {
type: 'pasmsg';
/** 事件id来源 */
source: 'msg' | 'event';
/** 被动事件ID */
id: string;
}
/** 多行按钮 */
interface KeyboardElement extends Element$1 {
type: 'keyboard';
/** 按钮行数组 */
rows: KarinButton[][];
}
/** 单行按钮 */
interface ButtonElement extends Element$1 {
type: 'button';
/** 按钮数组 */
data: KarinButton[];
}
/** 长消息元素 */
interface LongMsgElement extends Element$1 {
type: 'longMsg';
/** 消息ID */
id: string;
}
/** 原始元素 */
interface RawElement extends Element$1 {
type: 'raw';
/** 原始数据 */
data: any;
}
/** 篮球元素 */
interface BasketballElement extends Element$1 {
type: 'basketball';
/** 篮球ID */
id: number;
}
/** 骰子元素 */
interface DiceElement extends Element$1 {
type: 'dice';
/** 骰子ID */
id: number;
}
/** 猜拳元素 */
interface RpsElement extends Element$1 {
type: 'rps';
/** 猜拳ID */
id: number;
}
/** 弹射表情元素 */
interface BubbleFaceElement extends Element$1 {
type: 'bubbleFace';
/** 表情ID */
id: number;
/** 表情数量 */
count: number;
}
/** 天气元素 */
interface WeatherElement extends Element$1 {
type: 'weather';
/** 城市名称 */
city: string;
/** 城市代码 */
code: string;
}
/** 位置元素 */
interface LocationElement extends Element$1 {
type: 'location';
/** 纬度 */
lat: number;
/** 经度 */
lon: number;
/** 标题 */
title: string;
/** 地址 */
address: string;
}
/** 分享元素 */
interface ShareElement extends Element$1 {
type: 'share';
/** 分享链接 */
url: string;
/** 分享标题 */
title: string;
/** 分享内容 */
content: string;
/** 分享图片 */
image: string;
}
/** 礼物元素 */
interface GiftElement extends Element$1 {
type: 'gift';
/** QQ 号 */
qq: number;
/** 礼物ID */
id: number;
}
/** 商城表情元素 */
interface MarketFaceElement extends Element$1 {
type: 'marketFace';
/** 表情ID */
id: string;
}
/** 分享名片元素 */
interface ContactElement extends Element$1 {
type: 'contact';
/** 分享类型 */
scene: 'group' | 'friend';
/** 被推荐人的QQ号或者被推荐群的群号 */
peer: string;
}
/**
* 全部消息段元素
*/
type Elements = TextElement | AtElement | FaceElement | ReplyElement | ImageElement | VideoElement | RecordElement | MusicElement | JsonElement | XmlElement | MarkdownElement | MarkdownTplElement | PasmsgElement | KeyboardElement | ButtonElement | LongMsgElement | RawElement | BasketballElement | DiceElement | RpsElement | BubbleFaceElement | WeatherElement | LocationElement | ShareElement | GiftElement | MarketFaceElement | ContactElement | FileElement;
/**
* 发送消息段类型
*/
type SendMessage = string | Elements | Array<string | Elements>;
/**
* 全部消息段元素
*/
type ElementTypes = Elements;
interface Element {
type: 'node';
/** 节点类型 */
subType: 'messageID' | 'fake';
}
/** 合并转发接口外显参数 */
interface ForwardOptions {
/** 小卡片中间的外显 */
news: Array<{
text: string;
}>;
/** qwqa说这个叫不懂 消息列表的外显 */
prompt: string;
/** 小卡片底下文本: 查看1条转发消息 */
summary: string;
/** 小卡片标题 */
source: string;
}
/** 常规合并转发节点 */
interface DirectNodeElement extends Element {
subType: 'messageID';
/** 消息ID */
messageId: string;
/** @deprecated 即将废弃 请使用 `messageId` */
message_id: string;
}
/** 自定义节点 */
interface CustomNodeElement extends Element {
subType: 'fake';
/** 目标ID */
userId: string;
/** 目标名称 */
nickname: string;
/** 转发的元素节点 */
message: Array<SendElement>;
/** 外显设置 */
options?: ForwardOptions;
}
/** 合并转发节点消息段 */
type NodeElement = DirectNodeElement | CustomNodeElement;
/** 合并转发节点消息段 */
type SendElement = NodeElement | Elements;
/** 发送消息后的通用返回值 */
interface SendMsgResults {
/** 消息ID */
messageId: string;
/** 消息发送时间戳 */
time: number;
/** 原始结果 一般是Object、Array */
rawData: any;
/** @deprecated 已废弃 请使用 `messageId` */
message_id: string;
/** @deprecated 已废弃 请使用 `time` */
messageTime: number;
}
/** 基本消息Api返回值结构 */
interface MessageResponse {
/** 消息发送时间 */
time: number;
/** 消息ID */
messageId: string;
/** 消息序列号 */
messageSeq: number;
/** 消息来源目标信息 */
contact: Contact;
/** 消息发送者 */
sender: GroupSender;
/** 消息元素 */
elements: Array<Elements>;
}
/** 发送转发消息后返回值接口 */
interface SendForwardMessageResponse {
/** 消息ID */
messageId: string;
/** resID 可通过长消息接口进行发送 */
forwardId: string;
}
/** 获取精华消息返回值结构 */
interface GetGroupHighlightsResponse {
/** 群ID */
groupId: string;
/** 消息发送者ID */
senderId: string;
/** 发送者昵称 */
senderName: string;
/** 操作者ID */
operatorId: string;
/** 操作者昵称 */
operatorName: string;
/** 操作时间 */
operationTime: number;
/** 消息发送时间 */
messageTime: number;
/** 消息ID */
messageId: string;
/** 消息序列号 */
messageSeq: number;
/** 被设置的精华消息元素文本 */
jsonElements: string;
}
/**
* 用户信息结构
* @description 此接口仅可保证返回user_id、nick这两个字段
*/
interface UserInfo {
/** 用户ID */
userId: string;
/** 名称 */
nick: string;
/** 用户UID */
uid?: string;
/** 用户UIN */
uin?: string;
/** qid */
qid?: string;
/** 备注 */
remark?: string;
/** 用户等级 */
level?: number;
/** 生日 */
birthday?: string;
/** 登录天数 */
loginDay?: number;
/** 点赞数 */
likeCount?: number;
/** 学校是否已核实 */
isSchoolVerified?: boolean;
/** 年龄 */
age?: number;
/** 性别 */
sex?: Sex;
/** 好莱坞/腾讯视频会员 */
hollywoodVip?: boolean;
/** QQ会员 */
qqVip?: boolean;
/** QQ超级会员 */
qqSvip?: boolean;
/** 大会员 */
bigVip?: boolean;
/** 是否已经赞过 */
isLike?: boolean;
[key: string]: any;
}
/**
* 群信息结构
* @description 此接口仅可保证返回group_id这个字段
*/
interface GroupInfo {
/** 群ID */
groupId: string;
/** 群名称 */
groupName?: string;
/** 群主ID */
owner?: string;
/** 群备注 */
groupRemark?: string;
/** 群管理员ID列表 */
admins?: Array<string>;
/** 最大成员数 */
maxMemberCount?: number;
/** 当前成员数 */
memberCount?: number;
/** 群描述 */
groupDesc?: string;
}
/**
* 群成员信息
* @description 此接口仅可保证返回user_id这个字段
*/
interface GroupMemberInfo {
/** 用户ID */
userId: string;
/** 用户角色 */
role: Role;
/** 用户昵称 */
nick?: string;
/** 年龄 */
age?: number;
/** 群内头衔 */
uniqueTitle?: string;
/** 群名片 */
card?: string;
/** 加群时间 */
joinTime?: number;
/** 最后活跃时间 */
lastActiveTime?: number;
/** 用户等级 */
level?: number;
/** 禁言时间 */
shutUpTime?: number;
/** 距离 */
distance?: number;
/** 荣誉列表 */
honors?: Array<number>;
/** 是否好友 */
unfriendly?: boolean;
/** 性别 */
sex?: Sex;
/** 构建成发送者 方便使用 */
get sender(): GroupSender;
}
/**
* 群荣誉信息
* @description 此接口仅可在QQ协议端中使用
*/
interface QQGroupHonorInfo {
/** 荣誉成员ID */
userId: string;
/** 荣誉成员昵称 */
nick: string;
/** 荣誉名称 */
honorName: string;
/** 荣誉图标url */
avatar: string;
/** 荣誉id */
id: number;
/** 荣誉描述 */
description: string;
}
/**
* 群文件信息
* @description 此接口仅可在QQ协议端中使用
*/
interface QQGroupFileInfo {
/** 文件ID */
id: string;
/** 文件名 */
name: string;
/** 文件大小 */
size: number;
/** 上传时间 */
uploadTime: number;
/** 过期时间 */
expireTime: number;
/** 修改时间 */
modifyTime: number;
/** 下载次数 */
downloadCount: number;
/** 上传者ID */
uploadId: string;
/** 上传者昵称 */
uploadName: string;
/** SHA1 */
sha1: string;
/** SHA3 */
sha3: string;
/** MD5 */
md5: string;
}
/**
* 群文件夹信息
* @description 此接口仅可在QQ协议端中使用
*/
interface QQGroupFolderInfo {
/** 文件夹ID */
id: string;
/** 文件夹名 */
name: string;
/** 文件数量 */
fileCount: number;
/** 创建时间 */
createTime: number;
/** 创建者UID */
creatorId: string;
/** 创建者昵称 */
creatorName: string;
}
/** 获取at全体成员剩余次数返回值结构 */
interface GetAtAllCountResponse {
/** 是否允许at全体成员 */
accessAtAll: boolean;
/** 全群剩余次数 */
groupRemainCount: number;
/** 个人剩余次数 */
userRremainCount: number;
}
/** 获取群被禁言用户列表返回值结构 */
interface GetGroupMuteListResponse {
/** 用户ID */
userId: string;
/** 禁言时间 */
muteTime: number;
}
/** 获取群文件夹下文件列表返回值结构 */
interface GetGroupFileListResponse {
/** 文件列表 */
files: QQGroupFileInfo[];
/** 文件夹列表 */
folders: QQGroupFolderInfo[];
}
/** 获取群文件系统信息返回值结构 */
interface GetGroupFileSystemInfoResponse {
/** 文件数量 */
fileCount: number;
/** 文件夹数量 */
totalCount: number;
/** 已使用空间 */
usedSpace: number;
/** 总空间 */
totalSpace: number;
}
/** 创建群文件夹返回值结构 */
interface CreateGroupFolderResponse {
/** 文件夹ID */
id: string;
/** 已使用空间 */
usedSpace: string;
}
/** 基础选项,不包含 url 和 base64 */
interface DownloadFileOptionsBase {
/** 下载文件的根目录,需确保 Kritor 有该目录访问权限,可选 */
rootPath?: string;
/** 保存的文件名称,默认为文件 MD5,可选 */
fileName?: string;
/** 下载文件的线程数,默认为 3,可选 */
threadCnt?: number;
/** 下载文件的请求头,可选 */
headers?: string;
}
/** 包含 url 的选项,base64 必须为 never */
interface DownloadFileOptionsWithUrl extends DownloadFileOptionsBase {
/** 下载文件的 URL,二选一 */
url: string;
/** 下载文件的 base64,不允许 */
base64?: never;
}
/** 包含 base64 的选项,url 必须为 never */
interface DownloadFileOptionsWithBase64 extends DownloadFileOptionsBase {
/** 下载文件的 base64,二选一 */
base64: string;
/** 下载文件的 URL,不允许 */
url?: never;
}
/** 让协议端下载文件到协议端本地请求参数结构 */
type DownloadFileOptions = DownloadFileOptionsWithUrl | DownloadFileOptionsWithBase64;
/** 让协议端下载文件到协议端本地返回值结构 */
interface DownloadFileResponse {
/** 下载后文件的绝对路径 */
filePath: string;
}
/** OneBot11消息类型 */
type OB11SegmentType = 'text' | 'face' | 'image' | 'record' | 'video' | 'at' | 'rps' | 'dice' | 'shake' | 'poke' | 'anonymous' | 'share' | 'contact' | 'location' | 'music' | 'music_custom' | 'reply' | 'forward' | 'node' | 'xml' | 'json' | 'file';
interface Segment {
type: OB11SegmentType;
}
/** 纯文本 */
interface TextSegment extends Segment {
type: 'text';
data: {
text: string;
};
}
/** QQ表情 */
interface FaceSegment extends Segment {
type: 'face';
data: {
id: string;
};
}
/** 图片消息段 */
interface ImageSegment extends Segment {
type: 'image';
data: {
file: string;
type?: 'flash';
url?: string;
cache?: 0 | 1;
proxy?: 0 | 1;
timeout?: number;
};
}
/** 语音消息段 */
interface RecordSegment extends Segment {
type: 'record';
data: {
file: string;
magic?: 0 | 1;
url?: string;
cache?: 0 | 1;
proxy?: 0 | 1;
timeout?: number;
};
}
/** 短视频消息段 */
interface VideoSegment extends Segment {
type: 'video';
data: {
file: string;
url?: string;
cache?: 0 | 1;
proxy?: 0 | 1;
timeout?: number;
};
}
/** @某人消息段 */
interface AtSegment extends Segment {
type: 'at';
data: {
qq: string | 'all';
name?: string;
};
}
/** 猜拳魔法表情消息段 */
interface RpsSegment extends Segment {
type: 'rps';
data: {};
}
/** 掷骰子魔法表情消息段 */
interface DiceSegment extends Segment {
type: 'dice';
data: {};
}
/** 窗口抖动(戳一戳)消息段 */
interface ShakeSegment extends Segment {
type: 'shake';
data: {};
}
/** 戳一戳消息段 */
interface PokeSegment extends Segment {
type: 'poke';
data: {
type: string;
id: string;
name?: string;
};
}
/** 匿名发消息消息段 */
interface AnonymousSegment extends Segment {
type: 'anonymous';
data: {
ignore?: 0 | 1;
};
}
/** 链接分享消息段 */
interface ShareSegment extends Segment {
type: 'share';
data: {
url: string;
title: string;
content?: string;
image?: string;
};
}
/** 推荐好友/群消息段 */
interface ContactSegment extends Segment {
type: 'contact';
data: {
type: 'qq' | 'group';
id: string;
};
}
/** 位置消息段 */
interface LocationSegment extends Segment {
type: 'location';
data: {
lat: string;
lon: string;
title?: string;
content?: string;
};
}
/** 音乐分享消息段 */
interface MusicSegment extends Segment {
type: 'music';
data: {
type: 'qq' | '163' | 'xm';
id: string;
};
}
/** 音乐自定义分享消息段 */
interface CustomMusicSegment extends Segment {
type: 'music';
data: {
type: 'custom';
url: string;
audio: string;
title: string;
content?: string;
image?: string;
};
}
/** 回复消息段 */
interface ReplySegment extends Segment {
type: 'reply';
data: {
id: string;
};
}
/** 合并转发消息段 */
interface ForwardSegment extends Segment {
type: 'forward';
data: {
id: string;
};
}
/** XML消息段 */
interface XmlSegment extends Segment {
type: 'xml';
data: {
data: string;
};
}
/** JSON消息段 */
interface JsonSegment extends Segment {
type: 'json';
data: {
data: string;
};
}
/** OneBot11消息段 */
type OB11SegmentBase = TextSegment | FaceSegment | ImageSegment | RecordSegment | VideoSegment | AtSegment | RpsSegment | DiceSegment | ShakeSegment | PokeSegment | AnonymousSegment | ShareSegment | ContactSegment | LocationSegment | MusicSegment | CustomMusicSegment | ReplySegment | ForwardSegment | XmlSegment | JsonSegment | FileSegment;
/** 合并转发已有消息节点消息段 */
interface DirectNodeSegment extends Segment {
type: 'node';
data: {
id: string;
};
}
/** 合并转发自定义节点消息段 */
interface CustomNodeSegments extends Segment {
type: 'node';
data: {
user_id: string;
nickname: string;
content: OB11Segment[];
prompt?: string;
summary?: string;
source?: string;
};
}
/** 文件消息段 */
interface FileSegment<T = any> extends Segment {
type: 'file';
data: T;
}
/** 合并转发消息段 */
type OB11NodeSegment = DirectNodeSegment | CustomNodeSegments;
/** OneBot11消息段 */
type OB11Segment = OB11SegmentBase | OB11NodeSegment;
declare const enum OB11ApiAction {
/** 发送私聊消息 */
sendPrivateMsg = "send_private_msg",
/** 发送群消息 */
sendGroupMsg = "send_group_msg",
/** 发送消息 */
sendMsg = "send_msg",
/** 撤回消息 */
deleteMsg = "delete_msg",
/** 获取消息 */
getMsg = "get_msg",
/** 获取转发消息 */
getForwardMsg = "get_forward_msg",
/** 发送好友赞 */
sendLike = "send_like",
/** 群组踢人 */
setGroupKick = "set_group_kick",
/** 群组禁言 */
setGroupBan = "set_group_ban",
/** 群组匿名用户禁言 */
setGroupAnonymousBan = "set_group_anonymous_ban",
/** 群组全员禁言 */
setGroupWholeBan = "set_group_whole_ban",
/** 设置群管理员 */
setGroupAdmin = "set_group_admin",
/** 设置群匿名聊天 */
setGroupAnonymous = "set_group_anonymous",
/** 设置群名片(群备注) */
setGroupCard = "set_group_card",
/** 设置群名 */
setGroupName = "set_group_name",
/** 退出群组 */
setGroupLeave = "set_group_leave",
/** 设置群成员专属头衔 */
setGroupSpecialTitle = "set_group_special_title",
/** 处理好友添加请求 */
setFriendAddRequest = "set_friend_add_request",
/** 处理群添加请求/邀请 */
setGroupAddRequest = "set_group_add_request",
/** 获取登录号信息 */
getLoginInfo = "get_login_info",
/** 获取陌生人信息 */
getStrangerInfo = "get_stranger_info",
/** 获取好友列表 */
getFriendList = "get_friend_list",
/** 获取群信息 */
getGroupInfo = "get_group_info",
/** 获取群列表 */
getGroupList = "get_group_list",
/** 获取群成员信息 */
getGroupMemberInfo = "get_group_member_info",
/** 获取群成员列表 */
getGroupMemberList = "get_group_member_list",
/** 获取群荣誉信息 */
getGroupHonorInfo = "get_group_honor_info",
/** 获取 Cookies */
getCookies = "get_cookies",
/** 获取 CSRF Token */
getCsrfToken = "get_csrf_token",
/** 获取 QQ 相关接口凭证 */
getCredentials = "get_credentials",
/** 获取语音 */
getRecord = "get_record",
/** 获取图片 */
getImage = "get_image",
/** 是否可以发送图片 */
canSendImage = "can_send_image",
/** 是否可以发送语音 */
canSendRecord = "can_send_record",
/** 获取插件运行状态 */
getStatus = "get_status",
/** 获取版本信息 */
getVersionInfo = "get_version_info",
/** 获取版本信息 */
getVersion = "get_version",
/** 重启插件 */
setRestart = "set_restart",
/** 清理数据缓存 */
cleanCache = "clean_cache",
/** 发送合并转发消息 */
sendForwardMsg = "send_forward_msg",
/** 发送群聊合并转发消息 */
sendGroupForwardMsg = "send_group_forward_msg",
/** 发送好友合并转发消息 */
sendPrivateForwardMsg = "send_private_forward_msg",
/** 获取好友历史消息记录 */
getFriendMsgHistory = "get_friend_msg_history",
/** 获取群组历史消息记录 */
getGroupMsgHistory = "get_group_msg_history",
/** 对消息进行表情回应 */
setMsgEmojiLike = "set_msg_emoji_like",
/** 上传群文件 */
uploadGroupFile = "upload_group_file",
/** 上传私聊文件 */
uploadPrivateFile = "upload_private_file",
/** 获取精华消息列表 */
getEssenceMsgList = "get_essence_msg_list",
/** 设置精华消息 */
setEssenceMsg = "set_essence_msg",
/** 删除精华消息 */
deleteEssenceMsg = "delete_essence_msg",
/** 获取群文件url */
getGroupFileUrl = "get_group_file_url",
/** 获取私聊文件url */
getPrivateFileUrl = "get_private_file_url"
}
/** Api请求参数 */
interface OB11ApiParams {
/** 发送私聊消息 */
[OB11ApiAction.sendPrivateMsg]: {
/** 对方 QQ 号 */
user_id: number;
/** 主动发起临时会话时的来源群号(可选, 机器人本身必须是管理员/群主) */
group_id?: number;
/** 要发送的内容 */
message: Array<OB11Segment>;
/** 消息内容是否作为纯文本发送(即不解析 CQ 码),只在 `message` 字段是字符串时有效 */
auto_escape?: boolean;
};
/** 发送群消息 */
[OB11ApiAction.sendGroupMsg]: {
/** 群号 */
group_id: number;
/** 要发送的内容 */
message: Array<OB11Segment>;
/** 消息内容是否作为纯文本发送(即不解析 CQ 码),只在 `message` 字段是字符串时有效 */
auto_escape?: boolean;
};
/** 发送消息 */
[OB11ApiAction.sendMsg]: {
/** 消息类型 */
message_type: 'private' | 'group';
/** 对方 QQ 号,当消息类型为 "private" 时有效 */
user_id?: number;
/** 群号,当消息类型为 "group" 时有效 */
group_id?: number;
/** 要发送的内容 */
message: Array<OB11Segment>;
/** 消息内容是否作为纯文本发送(即不解析 CQ 码),只在 `message` 字段是字符串时有效 */
auto_escape?: boolean;
};
/** 撤回消息 */
[OB11ApiAction.deleteMsg]: {
/** 消息 ID */
message_id: number;
};
/** 获取消息 */
[OB11ApiAction.getMsg]: {
/** 消息 ID */
message_id: number;
};
/** 获取转发消息 */
[OB11ApiAction.getForwardMsg]: {
/** 转发消息 ID */
id: string;
};
/** 发送好友赞 */
[OB11ApiAction.sendLike]: {
/** 对方 QQ 号 */
user_id: number;
/** 赞的次数,每个赞为一个好友赞,每个用户每天最多赞 10 次 */
times?: number;
};
/** 群组踢人 */
[OB11ApiAction.setGroupKick]: {
/** 群号 */
group_id: number;
/** 要踢的 QQ 号 */
user_id: number;
/** 拒绝此人的加群请求 */
reject_add_request?: boolean;
};
/** 群组禁言 */
[OB11ApiAction.setGroupBan]: {
/** 群号 */
group_id: number;
/** 要禁言的 QQ 号 */
user_id: number;
/** 禁言时长,单位秒,0 表示取消禁言 */
duration?: number;
};
/** 群组匿名用户禁言 */
[OB11ApiAction.setGroupAnonymousBan]: {
/** 群号 */
group_id: number;
/** 匿名用户对象 */
anonymous?: object;
/** 匿名用户标识,使用匿名用户对象时此参数无效 */
anonymous_flag?: string;
/** 禁言时长,单位秒,无法取消匿名用户禁言 */
duration?: number;
};
/** 群组全员禁言 */
[OB11ApiAction.setGroupWholeBan]: {
/** 群号 */
group_id: number;
/** 是否禁言,true 为开启,false 为关闭 */
enable?: boolean;
};
/** 设置群管理员 */
[OB11ApiAction.setGroupAdmin]: {
/** 群号 */
group_id: number;
/** 要设置管理员的 QQ 号 */
user_id: number;
/** 是否设置为管理员,true 为设置,false 为取消 */
enable?: boolean;
};
/** 设置群匿名聊天 */
[OB11ApiAction.setGroupAnonymous]: {
/** 群号 */
group_id: number;
/** 是否允许匿名聊天,true 为开启,false 为关闭 */
enable?: boolean;
};
/** 设置群名片(群备注) */
[OB11ApiAction.setGroupCard]: {
/** 群号 */
group_id: number;
/** 要设置的 QQ 号 */
user_id: number;
/** 名片内容,不填或空字符串表示删除群名片 */
card?: string;
};
/** 设置群名 */
[OB11ApiAction.setGroupName]: {
/** 群号 */
group_id: number;
/** 新群名 */
group_name: string;
};
/** 退出群组 */
[OB11ApiAction.setGroupLeave]: {
/** 群号 */
group_id: number;
/** 是否解散,如果登录号是群主,则仅在此项为 true 时能够解散 */
is_dismiss?: boolean;
};
/** 设置群成员专属头衔 */
[OB11ApiAction.setGroupSpecialTitle]: {
/** 群号 */
group_id: number;
/** 要设置的 QQ 号 */
user_id: number;
/** 专属头衔,不填或空字符串表示删除专属头衔 */
special_title?: string;
/** 专属头衔有效期,单位秒,-1 表示永久,不过此项似乎没有效果 */
duration?: number;
};
/** 处理好友添加请求 */
[OB11ApiAction.setFriendAddRequest]: {
/** 请求 flag,在调用处理请求的事件中返回 */
flag: string;
/** 是否同意请求 */
approve?: boolean;
/** 添加后的好友备注 */
remark?: string;
};
/** 处理群添加请求/邀请 */
[OB11ApiAction.setGroupAddRequest]: {
/** 请求 flag,在调用处理请求的事件中返回 */
flag: string;
/** 请求子类型,add 或 invite,请求子类型为 invite 时为邀请 */
sub_type: 'add' | 'invite';
/** 是否同意请求/邀请 */
approve?: boolean;
/** 拒绝理由,仅在拒绝时有效 */
reason?: string;
};
/** 获取登录号信息 */
[OB11ApiAction.getLoginInfo]: {};
/** 获取陌生人信息 */
[OB11ApiAction.getStrangerInfo]: {
/** QQ 号 */
user_id: number;
/** 是否不使用缓存,true 表示不使用缓存,false 或留空表示使用缓存 */
no_cache?: boolean;
};
/** 获取好友列表 */
[OB11ApiAction.getFriendList]: {};
/** 获取群信息 */
[OB11ApiAction.getGroupInfo]: {
/** 群号 */
group_id: number;
/** 是否不使用缓存,true 表示不使用缓存,false 或留空表示使用缓存 */
no_cache?: boolean;
};
/** 获取群列表 */
[OB11ApiAction.getGroupList]: {};
/** 获取群成员信息 */
[OB11ApiAction.getGroupMemberInfo]: {
/** 群号 */
group_id: number;
/** QQ 号 */
user_id: number;
/** 是否不使用缓存,true 表示不使用缓存,false 或留空表示使用缓存 */
no_cache?: boolean;
};
/** 获取群成员列表 */
[OB11ApiAction.getGroupMemberList]: {
/** 群号 */
group_id: number;
/** 是否不使用缓存,true 表示不使用缓存,false 或留空表示使用缓存 */
no_cache?: boolean;
};
/** 获取群荣誉信息 */
[OB11ApiAction.getGroupHonorInfo]: {
/** 群号 */
group_id: number;
/** 荣誉类型,可选值为 "talkative"(龙王)、"performer"(群聊之火)、"legend"(群聊炽焰)、"strong_newbie"(新人王)、"emotion"(快乐源泉)、"all"(所有类型) */
type: 'talkative' | 'performer' | 'legend' | 'strong_newbie' | 'emotion' | 'all';
};
/** 获取 Cookies */
[OB11ApiAction.getCookies]: {
/** 指定域名,不填或空字符串表示获取当前域名下的 Cookies */
domain?: string;
};
/** 获取 CSRF Token */
[OB11ApiAction.getCsrfToken]: {};
/** 获取 QQ 相关接口凭证 */
[OB11ApiAction.getCredentials]: {
/** 指定域名,不填或空字符串表示获取当前域名下的凭证 */
domain?: string;
};
/** 获取语音 */
[OB11ApiAction.getRecord]: {
/** 文件路径 */
file: string;
/** 输出格式,可选值为 "amr"、"silk"、"mp3"、"wav",默认为 "amr" */
out_format: string;
};
/** 获取图片 */
[OB11ApiAction.getImage]: {
/** 文件路径 */
file: string;
};
/** 是否可以发送图片 */
[OB11ApiAction.canSendImage]: {};
/** 是否可以发送语音 */
[OB11ApiAction.canSendRecord]: {};
/** 获取插件运行状态 */
[OB11ApiAction.getStatus]: {};
/** 获取版本信息 */
[OB11ApiAction.getVersionInfo]: {};
/** 获取版本信息 */
[OB11ApiAction.getVersion]: {};
/** 重启插件 */
[OB11ApiAction.setRestart]: {
/** 延迟重启时间,单位毫秒,不填或留空表示立即重启 */
delay?: number;
};
/** 清理数据缓存 */
[OB11ApiAction.cleanCache]: {};
/** 发送合并转发消息 */
[OB11ApiAction.sendForwardMsg]: {
/** 对方 QQ 号,当消息类型为 "private" 时有效 */
user_id?: number;
/** 群号,当消息类型为 "group" 时有效 */
group_id?: number;
/** 要发送的内容 */
messages: Array<OB11NodeSegment>;
};
/** 发送群聊合并转发消息 */
[OB11ApiAction.sendGroupForwardMsg]: {
/** 群号 */
group_id: number;
/** 要发送的内容 */
messages: Array<OB11NodeSegment>;
};
/** 发送好友合并转发消息 */
[OB11ApiAction.sendPrivateForwardMsg]: {
/** 对方 QQ 号 */
user_id: number;
/** 要发送的内容 */
messages: Array<OB11NodeSegment>;
};
/** 获取好友历史消息记录 */
[OB11ApiAction.getFriendMsgHistory]: {
/** 对方 QQ 号 */
user_id: number;
/** 起始消息序号 */
message_seq?: number;
/** 起始消息ID lgl */
message_id?: number;
/** 消息数量 */
count: number;
};
/** 获取群组历史消息记录 */
[OB11ApiAction.getGroupMsgHistory]: {
/** 群号 */
group_id: number;
/** 起始消息序号 */
message_seq?: number;
/** 起始消息ID lgl */
message_id?: number;
/** 消息数量 */
count: number;
};
/** 对消息进行表情回应 */
[OB11ApiAction.setMsgEmojiLike]: {
/** 需要回应的消息 ID */
message_id: string;
/** 回应的表情 ID */
emoji_id: number;
/** 设置、取消 */
is_set: boolean;
};
/**
* 上传群文件
*/
[OB11ApiAction.uploadGroupFile]: {
/** 群号 */
group_id: number;
/** 文件路径 需要提供绝对路径 */
file: string;
/** 文件名称 必须提供 */
name: string;
/** 父目录ID 不提供则上传到根目录 */
folder?: string;
};
/**
* 上传私聊文件
*/
[OB11ApiAction.uploadPrivateFile]: {
/** 对方 QQ 号 */
user_id: number;
/** 文件路径 需要提供绝对路径 */
file: string;
/** 文件名称 必须提供 */
name: string;
};
/**
* 获取精华消息列表
*/
[OB11ApiAction.getEssenceMsgList]: {
/** 群号 */
group_id: number;
};
/**
* 设置精华消息
*/
[OB11ApiAction.setEssenceMsg]: {
/** 消息ID */
message_id: number;
};
/**
* 移除精华消息
*/
[OB11ApiAction.deleteEssenceMsg]: {
/** 消息ID */
message_id: number;
};
/**
* 获取群文件url
*/
[OB11ApiAction.getGroupFileUrl]: {
/** 群号 */
group_id: number;
/** 文件ID */
file_id: string;
};
/**
* 获取私聊文件url
*/
[OB11ApiAction.getPrivateFileUrl]: {
/** 对方 QQ 号 napcat不需要这个 随便传一个就行 */
user_id: number;
/** 文件ID */
file_id: string;
};
}
interface GetGroupInfo {
/** 群号 */
group_id: number;
/** 群名称 */
group_name: string;
/** 成员数 */
member_count: number;
/** 最大成员数(群容量) */
max_member_count: number;
}
interface HonorInfoList {
/** QQ 号 */
user_id: number;
/** QQ 昵称 */
nickname: string;
/** 头像url */
avatar: string;
/** 荣誉描述 */
description: string;
}
interface GetGroupMemberInfo {
/** 群号 */
group_id: number;
/** QQ 号 */
user_id: number;
/** 昵称 */
nickname: string;
/** 群名片/备注 */
card: string;
/** 性别 */
sex: 'male' | 'female' | 'unknown';
/** 年龄 */
age: number;
/** 地区 */
area: string;
/** 加群时间戳 */
join_time: number;
/** 最后发言时间戳 */
last_sent_time: number;
/** 成员等级 */
level: string;
/** 角色 */
role: 'owner' | 'admin' | 'member' | 'unknown';
/** 是否不良记录成员 */
unfriendly: boolean;
/** 专属头衔 */
title: string;
/** 专属头衔过期时间戳 */
title_expire_time: number;
/** 是否允许修改群名片 */
card_changeable: boolean;
}
interface GetMsg {
/** 发送时间 */
time: number;
/** 消息类型 */
message_type: 'private' | 'group';
message_id: number;
message_seq: number;
real_id: number;
sender: {
/** 发送者 QQ 号 */
user_id: number;
/** 昵称 不存在则为空字符串 */
nickname: string;
/** 性别 */
sex?: 'male' | 'female' | 'unknown';
/** 年龄 */
age?: number;
/** 群名片/备注 */
card?: string;
/** 地区 */
area?: string;
/** 成员等级 */
level?: string;
/** 角色 不存在则为空字符串 */
role: 'owner' | 'admin' | 'member' | 'unknown';
/** 专属头衔 */
title?: string;
};
message: OB11Segment[];
}
interface OB11serInfo {
/** QQ 号 */
uid?: string;
/** QQ 号 */
user_id: number;
/** QQ 昵称 */
nick?: string;
/** QQ 昵称 */
nickname: string;
/** 备注名 */
remark?: string;
/** 星座 */
constellation?: number;
/** 生肖 */
shengXiao?: number;
/** 血型 */
kBloodType?: number;
/** 家乡地址 */
homeTown?: string;
/** 交友行业 */
makeFriendCareer?: number;
/** 职位 */
pos?: string;
/** 大学 */
college?: string;
/** 国家 */
country?: string;
/** 省份 */
province?: string;
/** 城市 */
city?: string;
/** 邮政编码 */
postCode?: string;
/** 详细地址 */
address?: string;
/** 注册时间戳 */
regTime?: number;
/** 注册时间戳 */
reg_time?: number;
/** 兴趣爱好 */
interest?: string;
/** 标签 */
labels?: string[];
/** QQ 等级 */
qqLevel?: number;
/** qid */
qid?: string;
/** 个性签名 */
longNick?: string;
/** 个性签名 */
long_nick?: string;
/** 生日年份 */
birthday_year?: number;
/** 生日月份 */
birthday_month?: number;
/** 生日日期 */
birthday_day?: number;
/** 年龄 */
age?: number;
/** 性别 */
sex?: 'male' | 'female' | 'unknown';
/** 邮箱地址 */
eMail?: string;
/** 手机号码 */
phoneNum?: string;
/** 用户分类 ID */
categoryId?: number;
/** 财富时间戳 */
richTime?: number;
/** 财富缓存 */
richBuffer?: Record<number, number>;
/** 用户状态 */
status?: number;
/** 扩展状态 */
extStatus?: number;
/** 电池状态 */
batteryStatus?: number;
/** 终端类型 */
termType?: number;
/** 网络类型 */
netType?: number;
/** 头像类型 */
iconType?: number;
/** 自定义状态 */
customStatus?: string | null;
/** 设置时间 */
setTime?: string;
/** 特殊标记 */
specialFlag?: number;
/** ABI 标志 */
abiFlag?: number;
/** 网络类型扩展 */
eNetworkType?: number;
/** 显示名称 */
showName?: string;
/** 终端描述 */
termDesc?: string;
/** 音乐信息 */
musicInfo?: {
/** 音乐缓存 */
buf?: Record<string, unknown>;
};
/** 扩展在线业务信息 */
extOnlineBusinessInfo?: {
/** 缓存 */
buf?: Record<string, unknown>;
/** 自定义状态 */
customStatus?: string | null;
/** 视频业务信息 */
videoBizInfo?: {
/** 视频 ID */
cid?: string;
/** 视频 URL */
tvUrl?: string;
/** 同步类型 */
synchType?: string;
};
/** 视频信息 */
videoInfo?: {
/** 视频名称 */
name?: string;
};
};
/** 扩展缓冲 */
extBuffer?: {
/** 缓存 */
buf?: Record<string, unknown>;
};
/** 是否为 VIP 用户 */
is_vip?: boolean;
/** 是否为年费 VIP */
is_years_vip?: boolean;
/** VIP 等级 */
vip_level?: number;
/** 登录天数 */
login_days?: number;
}
/** Api返回参数 */
interface OB11ApiRequest {
/** 发送私聊消息 */
[OB11ApiAction.sendPrivateMsg]: {
/** 消息 ID */
message_id: number;
};
/** 发送群消息 */
[OB11ApiAction.sendGroupMsg]: {
/** 消息 ID */
message_id: number;
};
/** 发送消息 */
[OB11ApiAction.sendMsg]: {
/** 消息 ID */
message_id: number;
};
/** 撤回消息 */
[OB11ApiAction.deleteMsg]: {
/** 消息 ID */
message_id: number;
};
/** 获取消息 */
[OB11ApiAction.getMsg]: GetMsg;
/** 获取转发消息 */
[OB11ApiAction.getForwardMsg]: {
message: Array<OB11NodeSegment>;
};
/** 发送好友赞 */
[OB11ApiAction.sendLike]: {};
/** 群组踢人 */
[OB11ApiAction.setGroupKick]: {};
/** 群组禁言 */
[OB11ApiAction.setGroupBan]: {};
/** 群组匿名用户禁言 */
[OB11ApiAction.setGroupAnonymousBan]: {};
/** 群组全员禁言 */
[OB11ApiAction.setGroupWholeBan]: {};
/** 设置群管理员 */
[OB11ApiAction.setGroupAdmin]: {};
/** 设置群匿名聊天 */
[OB11ApiAction.setGroupAnonymous]: {};
/** 设置群名片(群备注) */
[OB11ApiAction.setGroupCard]: {};
/** 设置群名 */
[OB11ApiAction.setGroupName]: {};
/** 退出群组 */
[OB11ApiAction.setGroupLeave]: {};
/** 设置群成员专属头衔 */
[OB11ApiAction.setGroupSpecialTitle]: {};
/** 处理好友添加请求 */
[OB11ApiAction.setFriendAddRequest]: {};
/** 处理群添加请求/邀请 */
[OB11ApiAction.setGroupAddRequest]: {};
/** 获取登录号信息 */
[OB11ApiAction.getLoginInfo]: {
/** QQ 号 */
user_id: number;
/** QQ 昵称 */
nickname: string;
};
/** 获取陌生人信息 */
[OB11ApiAction.getStrangerInfo]: OB11serInfo;
/** 获取好友列表 */
[OB11ApiAction.getFriendList]: Array<OB11serInfo>;
/** 获取群信息 */
[OB11ApiAction.getGroupInfo]: GetGroupInfo;
/** 获取群列表 */
[OB11ApiAction.getGroupList]: Array<GetGroupInfo>;
/** 获取群成员信息 */
[OB11ApiAction.getGroupMemberInfo]: GetGroupMemberInfo;
/** 获取群成员列表 */
[OB11ApiAction.getGroupMemberList]: Array<GetGroupMemberInfo>;
/** 获取群荣誉信息 */
[OB11ApiAction.getGroupHonorInfo]: {
/** 群号 */
group_id: number;
/**
* 当前龙王
*/
current_talkative?: {
/** QQ 号 */
user_id: number;
/** QQ 昵称 */
nickname: string;
/** 头像url */
avatar: string;
/** 持续天数 */
day_count: number;
};
/** 历史龙王 */
talkative_list: Array<HonorInfoList>;
/** 群聊之火 */
performer_list: Array<HonorInfoList>;
/** 群聊炽焰 */
legend_list: Array<HonorInfoList>;
/** 冒尖小春笋 */
strong_newbie_list: Array<HonorInfoList>;
/** 快乐之源 */
emotion_list: Array<HonorInfoList>;
};
/** 获取 Cookies */
[OB11ApiAction.getCookies]: {
cookies: string;
};
/** 获取 CSRF Token */
[OB11ApiAction.getCsrfToken]: {
token: number;
};
/** 获取 QQ 相关接口凭证 */
[OB11ApiAction.getCredentials]: {
cookies: string;
csrf_token: number;
};
/** 获取语音 */
[OB11ApiAction.getRecord]: {
/** 转换后的语音文件绝对路径 如 /home/somebody/cqhttp/data/record/0B38145AA44505000B38145AA4450500.mp3 */
file: string;
};
/** 获取图片 */
[OB11ApiAction.getImage]: {
/** 下载后的图片文件路径,如 /home/somebody/cqhttp/data/image/6B4DE3DFD1BD271E3297859D41C530F5.jpg */
file: string;
};
/** 是否可以发送图片 */
[OB11ApiAction.canSendImage]: {
yes: boolean;
};
/** 是否可以发送语音 */
[OB11ApiAction.canSendRecord]: {
yes: boolean;
};
/** 获取插件运行状态 */
[OB11ApiAction.getStatus]: {
/** 当前 QQ 在线,null 表示无法查询到在线状态 */
online: boolean;
/** 状态符合预期,意味着各模块正常运行、功能正常,且 QQ 在线 */
good: boolean;