onebots 0.4.22 → 0.4.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,51 +2,61 @@
2
2
  <h1>基于icqq的oneBot实现</h1>
3
3
  <p>
4
4
 
5
- [![npm](https://img.shields.io/npm/v/onebots)](https://www.npmjs.com/package/onebots)
6
- [![Release and Publish](https://github.com/icqqjs/onebots/actions/workflows/release.yml/badge.svg?branch=master&event=push)](https://github.com/icqqjs/onebots/actions/workflows/release.yml)
7
- [![dm](https://shields.io/npm/dm/onebots)](https://www.npmjs.com/package/onebots)
8
- [![oneBot V11](https://img.shields.io/badge/OneBot-11-black?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAMAAADxPgR5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////29vbr6+vAAAAk1hCcwAAAAR0Uk5T////AEAqqfQAAAKcSURBVHja7NrbctswDATQXfD//zlpO7FlmwAWIOnOtNaTM5JwDMa8E+PNFz7g3waJ24fviyDPgfhz8fHP39cBcBL9KoJbQUxjA2iYqHL3FAnvzhL4GtVNUcoSZe6eSHizBcK5LL7dBr2AUZlev1ARRHCljzRALIEog6H3U6bCIyqIZdAT0eBuJYaGiJaHSjmkYIZd+qSGWAQnIaz2OArVnX6vrItQvbhZJtVGB5qX9wKqCMkb9W7aexfCO/rwQRBzsDIsYx4AOz0nhAtWu7bqkEQBO0Pr+Ftjt5fFCUEbm0Sbgdu8WSgJ5NgH2iu46R/o1UcBXJsFusWF/QUaz3RwJMEgngfaGGdSxJkE/Yg4lOBryBiMwvAhZrVMUUvwqU7F05b5WLaUIN4M4hRocQQRnEedgsn7TZB3UCpRrIJwQfqvGwsg18EnI2uSVNC8t+0QmMXogvbPg/xk+Mnw/6kW/rraUlvqgmFreAA09xW5t0AFlHrQZ3CsgvZm0FbHNKyBmheBKIF2cCA8A600aHPmFtRB1XvMsJAiza7LpPog0UJwccKdzw8rdf8MyN2ePYF896LC5hTzdZqxb6VNXInaupARLDNBWgI8spq4T0Qb5H4vWfPmHo8OyB1ito+AysNNz0oglj1U955sjUN9d41LnrX2D/u7eRwxyOaOpfyevCWbTgDEoilsOnu7zsKhjRCsnD/QzhdkYLBLXjiK4f3UWmcx2M7PO21CKVTH84638NTplt6JIQH0ZwCNuiWAfvuLhdrcOYPVO9eW3A67l7hZtgaY9GZo9AFc6cryjoeFBIWeU+npnk/nLE0OxCHL1eQsc1IciehjpJv5mqCsjeopaH6r15/MrxNnVhu7tmcslay2gO2Z1QfcfX0JMACG41/u0RrI9QAAAABJRU5ErkJggg==)](https://onebot.dev/)
9
- [![oneBot V12](https://img.shields.io/badge/OneBot-12-black?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAMAAADxPgR5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////29vbr6+vAAAAk1hCcwAAAAR0Uk5T////AEAqqfQAAAKcSURBVHja7NrbctswDATQXfD//zlpO7FlmwAWIOnOtNaTM5JwDMa8E+PNFz7g3waJ24fviyDPgfhz8fHP39cBcBL9KoJbQUxjA2iYqHL3FAnvzhL4GtVNUcoSZe6eSHizBcK5LL7dBr2AUZlev1ARRHCljzRALIEog6H3U6bCIyqIZdAT0eBuJYaGiJaHSjmkYIZd+qSGWAQnIaz2OArVnX6vrItQvbhZJtVGB5qX9wKqCMkb9W7aexfCO/rwQRBzsDIsYx4AOz0nhAtWu7bqkEQBO0Pr+Ftjt5fFCUEbm0Sbgdu8WSgJ5NgH2iu46R/o1UcBXJsFusWF/QUaz3RwJMEgngfaGGdSxJkE/Yg4lOBryBiMwvAhZrVMUUvwqU7F05b5WLaUIN4M4hRocQQRnEedgsn7TZB3UCpRrIJwQfqvGwsg18EnI2uSVNC8t+0QmMXogvbPg/xk+Mnw/6kW/rraUlvqgmFreAA09xW5t0AFlHrQZ3CsgvZm0FbHNKyBmheBKIF2cCA8A600aHPmFtRB1XvMsJAiza7LpPog0UJwccKdzw8rdf8MyN2ePYF896LC5hTzdZqxb6VNXInaupARLDNBWgI8spq4T0Qb5H4vWfPmHo8OyB1ito+AysNNz0oglj1U955sjUN9d41LnrX2D/u7eRwxyOaOpfyevCWbTgDEoilsOnu7zsKhjRCsnD/QzhdkYLBLXjiK4f3UWmcx2M7PO21CKVTH84638NTplt6JIQH0ZwCNuiWAfvuLhdrcOYPVO9eW3A67l7hZtgaY9GZo9AFc6cryjoeFBIWeU+npnk/nLE0OxCHL1eQsc1IciehjpJv5mqCsjeopaH6r15/MrxNnVhu7tmcslay2gO2Z1QfcfX0JMACG41/u0RrI9QAAAABJRU5ErkJggg==)](https://12.onebot.dev/)
10
- [![node engine](https://img.shields.io/node/v/onebots?color=339933&style=flat-square&labelColor=FAFAFA&logo=Node.js)](https://nodejs.org)
5
+ [![npm](https://img.shields.io/npm/v/onebots)](https://www.npmjs.com/package/onebots) [![Release and Publish](https://github.com/icqqjs/onebots/actions/workflows/release.yml/badge.svg?branch=master&event=push)](https://github.com/icqqjs/onebots/actions/workflows/release.yml) [![dm](https://shields.io/npm/dm/onebots)](https://www.npmjs.com/package/onebots) [![oneBot V11](https://img.shields.io/badge/OneBot-11-black?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAMAAADxPgR5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////29vbr6+vAAAAk1hCcwAAAAR0Uk5T////AEAqqfQAAAKcSURBVHja7NrbctswDATQXfD//zlpO7FlmwAWIOnOtNaTM5JwDMa8E+PNFz7g3waJ24fviyDPgfhz8fHP39cBcBL9KoJbQUxjA2iYqHL3FAnvzhL4GtVNUcoSZe6eSHizBcK5LL7dBr2AUZlev1ARRHCljzRALIEog6H3U6bCIyqIZdAT0eBuJYaGiJaHSjmkYIZd+qSGWAQnIaz2OArVnX6vrItQvbhZJtVGB5qX9wKqCMkb9W7aexfCO/rwQRBzsDIsYx4AOz0nhAtWu7bqkEQBO0Pr+Ftjt5fFCUEbm0Sbgdu8WSgJ5NgH2iu46R/o1UcBXJsFusWF/QUaz3RwJMEgngfaGGdSxJkE/Yg4lOBryBiMwvAhZrVMUUvwqU7F05b5WLaUIN4M4hRocQQRnEedgsn7TZB3UCpRrIJwQfqvGwsg18EnI2uSVNC8t+0QmMXogvbPg/xk+Mnw/6kW/rraUlvqgmFreAA09xW5t0AFlHrQZ3CsgvZm0FbHNKyBmheBKIF2cCA8A600aHPmFtRB1XvMsJAiza7LpPog0UJwccKdzw8rdf8MyN2ePYF896LC5hTzdZqxb6VNXInaupARLDNBWgI8spq4T0Qb5H4vWfPmHo8OyB1ito+AysNNz0oglj1U955sjUN9d41LnrX2D/u7eRwxyOaOpfyevCWbTgDEoilsOnu7zsKhjRCsnD/QzhdkYLBLXjiK4f3UWmcx2M7PO21CKVTH84638NTplt6JIQH0ZwCNuiWAfvuLhdrcOYPVO9eW3A67l7hZtgaY9GZo9AFc6cryjoeFBIWeU+npnk/nLE0OxCHL1eQsc1IciehjpJv5mqCsjeopaH6r15/MrxNnVhu7tmcslay2gO2Z1QfcfX0JMACG41/u0RrI9QAAAABJRU5ErkJggg==)](https://onebot.dev/)
6
+ [![oneBot V12](https://img.shields.io/badge/OneBot-12-black?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAMAAADxPgR5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////29vbr6+vAAAAk1hCcwAAAAR0Uk5T////AEAqqfQAAAKcSURBVHja7NrbctswDATQXfD//zlpO7FlmwAWIOnOtNaTM5JwDMa8E+PNFz7g3waJ24fviyDPgfhz8fHP39cBcBL9KoJbQUxjA2iYqHL3FAnvzhL4GtVNUcoSZe6eSHizBcK5LL7dBr2AUZlev1ARRHCljzRALIEog6H3U6bCIyqIZdAT0eBuJYaGiJaHSjmkYIZd+qSGWAQnIaz2OArVnX6vrItQvbhZJtVGB5qX9wKqCMkb9W7aexfCO/rwQRBzsDIsYx4AOz0nhAtWu7bqkEQBO0Pr+Ftjt5fFCUEbm0Sbgdu8WSgJ5NgH2iu46R/o1UcBXJsFusWF/QUaz3RwJMEgngfaGGdSxJkE/Yg4lOBryBiMwvAhZrVMUUvwqU7F05b5WLaUIN4M4hRocQQRnEedgsn7TZB3UCpRrIJwQfqvGwsg18EnI2uSVNC8t+0QmMXogvbPg/xk+Mnw/6kW/rraUlvqgmFreAA09xW5t0AFlHrQZ3CsgvZm0FbHNKyBmheBKIF2cCA8A600aHPmFtRB1XvMsJAiza7LpPog0UJwccKdzw8rdf8MyN2ePYF896LC5hTzdZqxb6VNXInaupARLDNBWgI8spq4T0Qb5H4vWfPmHo8OyB1ito+AysNNz0oglj1U955sjUN9d41LnrX2D/u7eRwxyOaOpfyevCWbTgDEoilsOnu7zsKhjRCsnD/QzhdkYLBLXjiK4f3UWmcx2M7PO21CKVTH84638NTplt6JIQH0ZwCNuiWAfvuLhdrcOYPVO9eW3A67l7hZtgaY9GZo9AFc6cryjoeFBIWeU+npnk/nLE0OxCHL1eQsc1IciehjpJv5mqCsjeopaH6r15/MrxNnVhu7tmcslay2gO2Z1QfcfX0JMACG41/u0RrI9QAAAABJRU5ErkJggg==)](https://12.onebot.dev/) [![node engine](https://img.shields.io/node/v/onebots?color=339933&style=flat-square&labelColor=FAFAFA&logo=Node.js)](https://nodejs.org)
11
7
  [![qq group](https://img.shields.io/badge/group-860669870-blue?style=flat-square&labelColor=FAFAFA&logo=data:image/png;base64,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&logoColor=000000)](https://jq.qq.com/?_wv=1027&k=B22VGXov)
12
8
 
13
-
14
-
15
- [Type Docs](https://lc-cn.github.io/onebots)
16
-
9
+ [Type Docs](https://lc-cn.github.io/onebots)
17
10
 
18
11
  </p>
19
12
  </div>
20
13
 
21
14
  # 使用示例
15
+
22
16
  ## 全局安装(0.4.8以后不推荐)
17
+
23
18
  ### 1 安装依赖
19
+
24
20
  ```shell
25
21
  npm install -g onebots
26
22
  # 0.4.8以上版本需要安装icqq
27
23
  npm install -g icqq
28
24
  ```
25
+
29
26
  ### 2 初始化配置文件
27
+
30
28
  在你想存放配置文件的目录执行如下命令
29
+
31
30
  ```shell
32
31
  onebots
33
32
  ```
33
+
34
34
  ### 3 更改生成的默认配置文件成你想要的配置配置后再次运行上面的指令,启动项目
35
+
35
36
  ## 局部安装
37
+
36
38
  ## 1 初始化node项目
39
+
37
40
  ```shell
38
41
  npm init -y
39
42
  ```
43
+
40
44
  ## 2. 安装onebots和icqq
45
+
41
46
  ```shell
42
47
  npm install onebots icqq
43
48
  ```
49
+
44
50
  ## 3. 执行如下命令生成配置文件
51
+
45
52
  ```shell
46
53
  npx onebots
47
54
  ```
55
+
48
56
  ## 4. 更改生成的默认配置文件成你想要的配置配置后再次运行上面的指令,启动项目
57
+
49
58
  # 默认配置文件
59
+
50
60
  ```yaml
51
61
  port: 6727 # 监听端口
52
62
  log_level: info # 日志等级
@@ -55,9 +65,9 @@ timeout: 30 #登录超时时间(秒)
55
65
  general: # 通用配置,在单个配置省略时的默认值
56
66
  V11: # oneBotV11的通用配置
57
67
  heartbeat: 3 # 心跳间隔 (秒)
58
- access_token: '' # 访问api的token
68
+ access_token: "" # 访问api的token
59
69
  post_timeout: 15 # 上报超时时间,(秒)
60
- secret: '' # 上报数据的sha1签名密钥
70
+ secret: "" # 上报数据的sha1签名密钥
61
71
  rate_limit_interval: 4 # ws心跳间隔(秒)
62
72
  post_message_format: string # "string"或"array"
63
73
  reconnect_interval: 3 # 重连间隔 (秒)
@@ -65,120 +75,138 @@ general: # 通用配置,在单个配置省略时的默认值
65
75
  enable_cors: true # 是否允许跨域
66
76
  filters: {} # 过滤器配置
67
77
  use_ws: true # 是否使用websocket
68
- http_reverse: [ ] # http上报地址
69
- ws_reverse: [ ] # 反向ws连接地址
78
+ http_reverse: [] # http上报地址
79
+ ws_reverse: [] # 反向ws连接地址
70
80
  V12: # oneBotV12的通用配置
71
81
  heartbeat: 3 # 心跳间隔 (秒)
72
- access_token: '' # 访问api的token
82
+ access_token: "" # 访问api的token
73
83
  request_timeout: 15 # 上报超时时间 (秒)
74
84
  reconnect_interval: 3 # 重连间隔 (秒)
75
85
  enable_cors: true # 是否允许跨域
76
86
  use_http: true # 是否启用http
77
87
  use_ws: true # 是否启用 websocket
78
88
  filters: {} # 过滤器配置
79
- webhook: [ ] # http 上报地址
80
- ws_reverse: [ ] # 反向ws连接地址
89
+ webhook: [] # http 上报地址
90
+ ws_reverse: [] # 反向ws连接地址
81
91
  protocol:
82
92
  platform: 2
83
- sign_api_addr: '' #你的签名地址
84
- password: '' # 账号密码,未配置则扫码登陆
93
+ sign_api_addr: "" #你的签名地址
94
+ password: "" # 账号密码,未配置则扫码登陆
85
95
  # ...其他配置项参考icqq的Config配置
86
96
  # 每个账号的单独配置(用于覆盖通用配置)
87
97
  123456789:
88
- password: '' # 账号密码,未配置则扫码登陆
98
+ password: "" # 账号密码,未配置则扫码登陆
89
99
  version: V11 # 使用的oneBot版本
90
100
  # ...其他配置项参见上方对应oneBot版本的通用配置
91
101
  protocol:
92
102
  platform: 2
93
- sign_api_addr: '' #你的签名地址
103
+ sign_api_addr: "" #你的签名地址
94
104
  # ...其他配置项参考icqq的Config配置
95
105
  ```
96
106
 
97
107
  # 配置解释
98
108
 
99
109
  ## Config
100
- | 配置项 | 类型 | 默认值 | desc |
101
- |:---------|:-----------------------------|:--------|:-------|
110
+
111
+ | 配置项 | 类型 | 默认值 | desc |
112
+ | :------- | :--------------------------- | :------ | :----------- |
102
113
  | port | number | 6727 | 服务监听端口 |
103
- | logLevel | string | info | 日志级别 |
104
- | general | OneBotConfig | general | 通用配置 |
105
- | [number] | OneBotConfig\|OneBotConfig[] | - | 机器人配置 |
114
+ | logLevel | string | info | 日志级别 |
115
+ | general | OneBotConfig | general | 通用配置 |
116
+ | [number] | OneBotConfig\|OneBotConfig[] | - | 机器人配置 |
117
+
106
118
  ## OneBotConfig
107
- | 配置项 | 类型 | 默认值 | desc |
108
- |:---------|:----------|:----------|:-------------------|
119
+
120
+ | 配置项 | 类型 | 默认值 | desc |
121
+ | :------- | :-------- | :-------- | :---------------------------------- |
109
122
  | password | string | - | 账号密码 未填写或填写为空则扫码登陆 |
110
- | V11 | ConfigV11 | configV11 | V11配置 |
111
- | V12 | ConfigV12 | configV12 | V12配置 |
112
- | protocol | Config | {} | icqq配置 |
123
+ | V11 | ConfigV11 | configV11 | V11配置 |
124
+ | V12 | ConfigV12 | configV12 | V12配置 |
125
+ | protocol | Config | {} | icqq配置 |
126
+
113
127
  ## ConfigV11
114
- | 配置项 | 类型 | 默认值 | desc |
115
- |:--------------------|:---------|:-------|:-----------|
116
- | heartbeat | number | 3 | 心跳间隔 单位:秒 |
117
- | access_token | string | - | 访问令牌 |
118
- | secret | string | - | 签名密钥 |
119
- | rate_limit_interval | number | 4 | 限速间隔 单位:秒 |
120
- | post_message_format | string | string | 消息格式化 |
121
- | reconnect_interval | number | 3 | 重连间隔 单位:秒 |
122
- | use_http | boolean | false | 是否使用http协议 |
123
- | enable_cors | boolean | false | 是否允许跨域 |
128
+
129
+ | 配置项 | 类型 | 默认值 | desc |
130
+ | :------------------ | :------- | :----- | :---------------- |
131
+ | heartbeat | number | 3 | 心跳间隔 单位:秒 |
132
+ | access_token | string | - | 访问令牌 |
133
+ | secret | string | - | 签名密钥 |
134
+ | rate_limit_interval | number | 4 | 限速间隔 单位:秒 |
135
+ | post_message_format | string | string | 消息格式化 |
136
+ | reconnect_interval | number | 3 | 重连间隔 单位:秒 |
137
+ | use_http | boolean | false | 是否使用http协议 |
138
+ | enable_cors | boolean | false | 是否允许跨域 |
124
139
  | filters | Filters | {} | 事件过滤器配置 |
125
- | use_ws | boolean | false | 是否使用ws协议 |
126
- | http_reverse_url | string[] | - | http上报地址地址 |
127
- | ws_reverse_url | string[] | - | 反向ws连接地址 |
140
+ | use_ws | boolean | false | 是否使用ws协议 |
141
+ | http_reverse_url | string[] | - | http上报地址地址 |
142
+ | ws_reverse_url | string[] | - | 反向ws连接地址 |
143
+
128
144
  ## ConfigV12
129
- | 配置项 | 类型 | 默认值 | desc |
130
- |:--------------------|:---------|:------|:------------|
131
- | heartbeat | number | 3 | 心跳间隔 单位:秒 |
132
- | access_token | string | - | 访问令牌 |
133
- | request_timeout | number | 15 | 请求超时 单位:秒 |
134
- | reconnect_interval | number | 3 | 重连间隔 单位:秒 |
135
- | enable_cors | boolean | false | 是否允许跨域 |
145
+
146
+ | 配置项 | 类型 | 默认值 | desc |
147
+ | :------------------ | :------- | :----- | :---------------- |
148
+ | heartbeat | number | 3 | 心跳间隔 单位:秒 |
149
+ | access_token | string | - | 访问令牌 |
150
+ | request_timeout | number | 15 | 请求超时 单位:秒 |
151
+ | reconnect_interval | number | 3 | 重连间隔 单位:秒 |
152
+ | enable_cors | boolean | false | 是否允许跨域 |
136
153
  | filters | Filters | {} | 事件过滤器配置 |
137
- | use_http | boolean | false | 是否使用http协议 |
138
- | use_ws | boolean | false | 是否使用ws协议 |
139
- | webhook_reverse_url | string[] | - | webhook上报地址 |
140
- | ws_reverse_url | string[] | - | 反向ws连接地址 |
154
+ | use_http | boolean | false | 是否使用http协议 |
155
+ | use_ws | boolean | false | 是否使用ws协议 |
156
+ | webhook_reverse_url | string[] | - | webhook上报地址 |
157
+ | ws_reverse_url | string[] | - | 反向ws连接地址 |
158
+
141
159
  # 事件过滤器
160
+
142
161
  ## 语法说明
162
+
143
163
  - `onebots` 的事件过滤器最外层是一个JSON对象,其中的键是键如果是运算法,则值作为运算符的参数,如果不是运算符,则表示对事件数据对象相应 `key` 进行过滤。
144
164
  - 过滤规则中任何一个对象, 只有在它的所有项都匹配的情况下, 才会让事件通过(等价于一个 and 运算),如果值为一个数组,则表示事件对应 `key` 值需满足其中一个。
145
165
  - 可用逻辑运算符有:`$and` (逻辑与) 、`$or` (逻辑或) 、 `$not` (逻辑非)、`$nor` (逻辑异或)、`$regexp` (文本正则匹配)、`$like` (文本模糊匹配)、`$gt` (数值大于比较)、`$gte` (数值大于等于比较)、`$lt` (数值小于比较)、`$lte` (数值小于等于比较)、`$between` (数值范围比较)
166
+
146
167
  ## 示例
168
+
147
169
  ### 1. 仅上报私聊事件
170
+
148
171
  ```yaml
149
172
  filters:
150
173
  message_type: private
151
174
  ```
175
+
152
176
  ### 2. 私聊或指定群聊
177
+
153
178
  ```yaml
154
179
  filters:
155
180
  $or:
156
181
  message_type: private
157
- group_id:
158
- - 123456789
159
- 987654321
182
+ group_id:
183
+ - 123456789 987654321
160
184
  ```
185
+
161
186
  ### 3. 私聊事件且不是指定用户
187
+
162
188
  ```yaml
163
189
  filters:
164
190
  message_type: private
165
191
  $not:
166
192
  user_id:
167
- - 123456789
168
- 987654321
193
+ - 123456789 987654321
169
194
  ```
195
+
170
196
  ### 4. 私聊事件(排除指定用户的事件)或指定群聊事件
197
+
171
198
  ```yaml
172
199
  filters:
173
200
  $or:
174
201
  - message_type: private
175
202
  $not:
176
203
  user_id: 123456789
177
- -
178
- message_type: group
204
+ - message_type: group
179
205
  group_id: 987654321
180
206
  ```
207
+
181
208
  ### 5. 仅上报消息事件且用户年龄大于18岁
209
+
182
210
  ```yaml
183
211
  filters:
184
212
  type: message
@@ -186,14 +214,18 @@ filters:
186
214
  age:
187
215
  $gt: 18
188
216
  ```
217
+
189
218
  ### 6. 仅上报消息事件且消息内容以!开头的消息
219
+
190
220
  ```yaml
191
221
  filters:
192
222
  type: message
193
223
  raw_message:
194
224
  .regexp: '^!|\!'
195
225
  ```
226
+
196
227
  ### 7. 不上报消息内容包含`cnm`的消息
228
+
197
229
  ```yaml
198
230
  filters:
199
231
  $not:
@@ -201,16 +233,19 @@ filters:
201
233
  raw_message:
202
234
  $like: cnm
203
235
  ```
236
+
204
237
  # 使用API管理oneBot
205
238
 
206
- | url | method | params | desc |
207
- |:--------|:-------|:----------------|:-------------------------------|
208
- | /list | GET | | 获取当前运行的机器人列表 |
209
- | /detail | GET | uin | 获取指定机器人配置 |
210
- | /qrcode | GET | uin | 获取指定机器人登录二维码 |
211
- | /add | POST | {uin,...config} | 添加机器人 config 为机器人配置 |
212
- | /edit | POST | {uin,...config} | 修改机器人配置 config 为机器人配置 |
239
+ | url | method | params | desc |
240
+ | :------ | :----- | :-------------- | :--------------------------------------------- |
241
+ | /list | GET | | 获取当前运行的机器人列表 |
242
+ | /detail | GET | uin | 获取指定机器人配置 |
243
+ | /qrcode | GET | uin | 获取指定机器人登录二维码 |
244
+ | /add | POST | {uin,...config} | 添加机器人 config 为机器人配置 |
245
+ | /edit | POST | {uin,...config} | 修改机器人配置 config 为机器人配置 |
213
246
  | /remove | get | uin,force | 移除机器人,force为true时,将删除机器人data目录 |
247
+
214
248
  # 鸣谢
249
+
215
250
  1. [icqqjs/icqq](https://github.com/icqqjs/icqq) 底层服务支持
216
251
  2. [takayama-lily/onebot](https://github.com/takayama-lily/node-onebot) oneBot V11 原先版本
package/lib/bin.js CHANGED
@@ -7,4 +7,4 @@ const obj = {};
7
7
  for (let i = 0; i < execArgv.length; i += 2) {
8
8
  obj[execArgv[i]] = execArgv[i + 1];
9
9
  }
10
- (0, app_1.createApp)(obj['-c']).start();
10
+ (0, app_1.createApp)(obj["-c"]).start();
package/lib/db.js CHANGED
@@ -7,15 +7,15 @@ class Database {
7
7
  constructor(path) {
8
8
  this.path = path;
9
9
  this.data = {};
10
- if (!this.path.toLowerCase().endsWith('.json'))
11
- this.path = this.path + '.json';
10
+ if (!this.path.toLowerCase().endsWith(".json"))
11
+ this.path = this.path + ".json";
12
12
  if (!(0, fs_1.existsSync)(this.path)) {
13
13
  (0, fs_1.writeFileSync)(this.path, "", "utf-8");
14
14
  }
15
15
  }
16
16
  sync(defaultValue) {
17
17
  try {
18
- this.data = JSON.parse((0, fs_1.readFileSync)(this.path, 'utf-8'));
18
+ this.data = JSON.parse((0, fs_1.readFileSync)(this.path, "utf-8"));
19
19
  }
20
20
  catch {
21
21
  this.data = defaultValue;
@@ -24,7 +24,7 @@ class Database {
24
24
  }
25
25
  get(key) {
26
26
  const value = (0, shared_1.getValue)(this.data, key);
27
- if (typeof value !== 'object')
27
+ if (typeof value !== "object")
28
28
  return value;
29
29
  const saveValue = () => {
30
30
  this.set(key, value);
@@ -44,7 +44,7 @@ class Database {
44
44
  const res = Reflect.defineProperty(target, p, r);
45
45
  saveValue();
46
46
  return res;
47
- }
47
+ },
48
48
  });
49
49
  }
50
50
  delete(key) {
@@ -52,7 +52,7 @@ class Database {
52
52
  }
53
53
  set(key, value) {
54
54
  (0, shared_1.setValue)(this.data, key, value);
55
- return (0, fs_1.writeFileSync)(this.path, JSON.stringify(this.data, null, 2), 'utf-8');
55
+ return (0, fs_1.writeFileSync)(this.path, JSON.stringify(this.data, null, 2), "utf-8");
56
56
  }
57
57
  }
58
58
  exports.Database = Database;
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './server/app';
2
- export * from './server/router';
3
- export * from './onebot';
4
- export * from './types';
5
- export * from './utils';
1
+ export * from "./server/app";
2
+ export * from "./server/router";
3
+ export * from "./onebot";
4
+ export * from "./types";
5
+ export * from "./utils";
package/lib/onebot.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  /// <reference types="node" />
2
- import 'icqq-cq-enable';
3
- import { EventEmitter } from 'events';
2
+ import "icqq-cq-enable";
3
+ import { EventEmitter } from "events";
4
4
  import { App } from "./server/app";
5
5
  import { Client } from "icqq";
6
- import { Config as IcqqConfig } from 'icqq';
6
+ import { Config as IcqqConfig } from "icqq";
7
7
  import { V11 } from "./service/V11";
8
8
  import { V12 } from "./service/V12";
9
9
  import { MayBeArray } from "./types";
@@ -33,14 +33,14 @@ export declare enum OneBotStatus {
33
33
  export type OneBotConfig = OneBot.Config<OneBot.Version>;
34
34
  export declare namespace OneBot {
35
35
  type Filters = {};
36
- type Version = 'V11' | 'V12';
37
- type Config<V extends Version = 'V11'> = ({
36
+ type Version = "V11" | "V12";
37
+ type Config<V extends Version = "V11"> = {
38
38
  version?: V;
39
39
  password?: string;
40
40
  group_whitelist?: number[];
41
41
  filters?: Service.Filters;
42
42
  protocol?: IcqqConfig;
43
- } & (V extends 'V11' ? V11.Config : V12.Config));
43
+ } & (V extends "V11" ? V11.Config : V12.Config);
44
44
  interface Base {
45
45
  start(path?: string): any;
46
46
  stop(): any;
package/lib/onebot.js CHANGED
@@ -37,7 +37,7 @@ const process = __importStar(require("process"));
37
37
  class NotFoundError extends Error {
38
38
  constructor() {
39
39
  super(...arguments);
40
- this.message = '不支持的API';
40
+ this.message = "不支持的API";
41
41
  }
42
42
  }
43
43
  exports.NotFoundError = NotFoundError;
@@ -48,35 +48,35 @@ class OneBot extends events_1.EventEmitter {
48
48
  this.uin = uin;
49
49
  config = [].concat(config);
50
50
  const protocolConfig = {
51
- data_dir: (0, path_1.join)(app_1.App.configDir, 'data'),
52
- ...this.app.config.general.protocol
51
+ data_dir: (0, path_1.join)(app_1.App.configDir, "data"),
52
+ ...this.app.config.general.protocol,
53
53
  };
54
54
  this.config = config.map(c => {
55
55
  if (!c.version)
56
- c.version = 'V11';
56
+ c.version = "V11";
57
57
  if (!c.protocol)
58
58
  c.protocol = {};
59
59
  if (c.password)
60
60
  this.password = c.password;
61
61
  Object.assign(protocolConfig, c.protocol);
62
62
  switch (c.version) {
63
- case 'V11':
63
+ case "V11":
64
64
  return (0, utils_1.deepMerge)((0, utils_1.deepClone)(this.app.config.general.V11), c);
65
- case 'V12':
65
+ case "V12":
66
66
  return (0, utils_1.deepMerge)((0, utils_1.deepClone)(this.app.config.general.V12), c);
67
67
  default:
68
- throw new Error('不支持的oneBot版本:' + c.version);
68
+ throw new Error("不支持的oneBot版本:" + c.version);
69
69
  }
70
70
  });
71
71
  this.client = new icqq_1.Client(protocolConfig);
72
72
  this.instances = this.config.map(c => {
73
73
  switch (c.version) {
74
- case 'V11':
74
+ case "V11":
75
75
  return new V11_1.V11(this, this.client, c);
76
- case 'V12':
76
+ case "V12":
77
77
  return new V12_1.V12(this, this.client, c);
78
78
  default:
79
- throw new Error('不支持的oneBot版本:' + c.version);
79
+ throw new Error("不支持的oneBot版本:" + c.version);
80
80
  }
81
81
  });
82
82
  this.status = OneBotStatus.Good;
@@ -89,60 +89,60 @@ class OneBot extends events_1.EventEmitter {
89
89
  disposeArr.shift()();
90
90
  }
91
91
  };
92
- this.client.trap('system.login.qrcode', function qrcodeHelper() {
93
- console.log('扫码后回车继续');
94
- process.stdin.once('data', () => {
92
+ this.client.trap("system.login.qrcode", function qrcodeHelper() {
93
+ console.log("扫码后回车继续");
94
+ process.stdin.once("data", () => {
95
95
  this.login();
96
96
  });
97
97
  disposeArr.push(() => {
98
- this.off('system.login.qrcode', qrcodeHelper);
98
+ this.off("system.login.qrcode", qrcodeHelper);
99
99
  });
100
100
  });
101
- this.client.trap('system.login.device', function deviceHelper(e) {
102
- console.log('请选择验证方式:1.短信验证 2.url验证');
103
- process.stdin.once('data', (buf) => {
101
+ this.client.trap("system.login.device", function deviceHelper(e) {
102
+ console.log("请选择验证方式:1.短信验证 2.url验证");
103
+ process.stdin.once("data", buf => {
104
104
  const input = buf.toString().trim();
105
- if (input === '1') {
105
+ if (input === "1") {
106
106
  this.sendSmsCode();
107
- console.log('请输入短信验证码:');
108
- process.stdin.once('data', buf => {
107
+ console.log("请输入短信验证码:");
108
+ process.stdin.once("data", buf => {
109
109
  this.submitSmsCode(buf.toString().trim());
110
110
  });
111
111
  }
112
112
  else {
113
113
  console.log(`请前往:${e.url} 完成验证后回车继续`);
114
- process.stdin.once('data', () => {
114
+ process.stdin.once("data", () => {
115
115
  this.login();
116
116
  });
117
117
  }
118
118
  });
119
119
  disposeArr.push(() => {
120
- this.off('system.login.device', deviceHelper);
120
+ this.off("system.login.device", deviceHelper);
121
121
  });
122
122
  });
123
- this.client.trap('system.login.error', function errorHandler(e) {
124
- if (e.message.includes('密码错误')) {
125
- process.stdin.once('data', (e) => {
123
+ this.client.trap("system.login.error", function errorHandler(e) {
124
+ if (e.message.includes("密码错误")) {
125
+ process.stdin.once("data", e => {
126
126
  this.login(e.toString().trim());
127
127
  });
128
128
  }
129
129
  else {
130
130
  process.exit();
131
131
  }
132
- this.off('system.login.error', errorHandler);
132
+ this.off("system.login.error", errorHandler);
133
133
  });
134
- this.client.trap('system.login.slider', function sliderHelper(e) {
135
- console.log('请输入滑块验证返回的ticket');
136
- process.stdin.once('data', (e) => {
134
+ this.client.trap("system.login.slider", function sliderHelper(e) {
135
+ console.log("请输入滑块验证返回的ticket");
136
+ process.stdin.once("data", e => {
137
137
  this.submitSlider(e.toString().trim());
138
138
  });
139
139
  disposeArr.push(() => {
140
- this.off('system.login.slider', sliderHelper);
140
+ this.off("system.login.slider", sliderHelper);
141
141
  });
142
142
  });
143
- this.client.trap('system.online', clean);
143
+ this.client.trap("system.online", clean);
144
144
  return new Promise(async (resolve) => {
145
- const callback = (result) => {
145
+ const callback = result => {
146
146
  if (timer) {
147
147
  clearTimeout(timer);
148
148
  timer = null;
@@ -154,21 +154,25 @@ class OneBot extends events_1.EventEmitter {
154
154
  }
155
155
  };
156
156
  let timer = setTimeout(() => {
157
- callback([false, '登录超时']);
157
+ callback([false, "登录超时"]);
158
158
  }, this.app.config.timeout * 1000);
159
159
  await this.client.login(this.uin, this.password);
160
- const disposes = [this.client.trapOnce('system.online', () => { callback([true, null]); }),
161
- this.client.trapOnce('system.login.error', (e) => callback([false, e.message]))];
160
+ const disposes = [
161
+ this.client.trapOnce("system.online", () => {
162
+ callback([true, null]);
163
+ }),
164
+ this.client.trapOnce("system.login.error", e => callback([false, e.message])),
165
+ ];
162
166
  });
163
167
  }
164
168
  startListen() {
165
- this.client.on('system.online', this.system_online.bind(this, "system.online"));
166
- this.client.trap('system', this.dispatch.bind(this, 'system'));
167
- this.client.trap('notice', this.dispatch.bind(this, 'notice'));
168
- this.client.trap('request', this.dispatch.bind(this, 'request'));
169
- this.client.trap('message', this.dispatch.bind(this, 'message'));
169
+ this.client.on("system.online", this.system_online.bind(this, "system.online"));
170
+ this.client.trap("system", this.dispatch.bind(this, "system"));
171
+ this.client.trap("notice", this.dispatch.bind(this, "notice"));
172
+ this.client.trap("request", this.dispatch.bind(this, "request"));
173
+ this.client.trap("message", this.dispatch.bind(this, "message"));
170
174
  for (const instance of this.instances) {
171
- instance.start(this.instances.length > 1 ? '/' + instance.version : undefined);
175
+ instance.start(this.instances.length > 1 ? "/" + instance.version : undefined);
172
176
  }
173
177
  }
174
178
  async stop(force) {
@@ -192,20 +196,21 @@ class OneBot extends events_1.EventEmitter {
192
196
  continue;
193
197
  }
194
198
  const result = instance.format(event, data);
195
- if (data.source) { // 有 data.source 字段代表这是个回复
199
+ if (data.source) {
200
+ // 有 data.source 字段代表这是个回复
196
201
  switch (data.message_type) {
197
- case 'group':
202
+ case "group":
198
203
  data.message.unshift({
199
- type: 'reply',
204
+ type: "reply",
200
205
  seq: data.source.seq,
201
- id: (0, icqq_2.genGroupMessageId)(data.group_id, data.source.user_id, data.source.seq, data.source.rand, data.source.time)
206
+ id: (0, icqq_2.genGroupMessageId)(data.group_id, data.source.user_id, data.source.seq, data.source.rand, data.source.time),
202
207
  });
203
208
  break;
204
- case 'private':
209
+ case "private":
205
210
  data.message.unshift({
206
- type: 'reply',
211
+ type: "reply",
207
212
  seq: data.source.seq,
208
- id: (0, icqq_2.genDmMessageId)(data.source.user_id, data.source.seq, data.source.rand, data.source.time)
213
+ id: (0, icqq_2.genDmMessageId)(data.source.user_id, data.source.seq, data.source.rand, data.source.time),
209
214
  });
210
215
  break;
211
216
  }
@@ -220,4 +225,13 @@ var OneBotStatus;
220
225
  OneBotStatus[OneBotStatus["Good"] = 0] = "Good";
221
226
  OneBotStatus[OneBotStatus["Bad"] = 1] = "Bad";
222
227
  })(OneBotStatus || (exports.OneBotStatus = OneBotStatus = {}));
223
- exports.BOOLS = ["no_cache", "auto_escape", "as_long", "enable", "reject_add_request", "is_dismiss", "approve", "block"];
228
+ exports.BOOLS = [
229
+ "no_cache",
230
+ "auto_escape",
231
+ "as_long",
232
+ "enable",
233
+ "reject_add_request",
234
+ "is_dismiss",
235
+ "approve",
236
+ "block",
237
+ ];