UNPKG

node-karin

Version:

Lightweight, efficient, concise, and stable robot framework.

2,136 lines (2,124 loc) 450 kB
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;