yz-yuki-plugin 1.0.4 → 2.0.2-1
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/CHANGELOG.md +14 -4
- package/README.md +8 -7
- package/lib/apps/bilibili.js +52 -20
- package/lib/apps/help.js +7 -0
- package/lib/apps/version.js +7 -0
- package/lib/apps/weibo.js +34 -16
- package/lib/components/dynamic/Account.js +2 -0
- package/lib/components/dynamic/Content.js +2 -0
- package/lib/components/dynamic/Footer.js +1 -0
- package/lib/components/dynamic/ForwardContent.js +2 -0
- package/lib/components/dynamic/LogoText.js +2 -0
- package/lib/components/dynamic/MainPage.js +1 -0
- package/lib/components/help/Help.js +1 -0
- package/lib/components/loginQrcode/Page.js +1 -0
- package/lib/index.js +53 -2
- package/lib/models/bilibili/bilibili.api.d.ts +3 -0
- package/lib/models/bilibili/bilibili.api.js +9 -0
- package/lib/models/bilibili/bilibili.get.web.data.d.ts +3 -0
- package/lib/models/bilibili/bilibili.get.web.data.js +4 -0
- package/lib/models/bilibili/bilibili.models.d.ts +37 -0
- package/lib/models/bilibili/bilibili.models.js +71 -19
- package/lib/models/bilibili/bilibili.query.d.ts +24 -0
- package/lib/models/bilibili/bilibili.query.js +69 -11
- package/lib/models/bilibili/bilibili.task.d.ts +41 -0
- package/lib/models/bilibili/bilibili.task.js +78 -35
- package/lib/models/bilibili/bilibili.wbi.d.ts +6 -0
- package/lib/models/bilibili/bilibili.wbi.js +16 -3
- package/lib/models/version/version.d.ts +10 -0
- package/lib/models/version/version.js +12 -1
- package/lib/models/weibo/weibo.api.d.ts +1 -0
- package/lib/models/weibo/weibo.api.js +2 -0
- package/lib/models/weibo/weibo.get.web.data.d.ts +3 -0
- package/lib/models/weibo/weibo.get.web.data.js +3 -0
- package/lib/models/weibo/weibo.query.d.ts +20 -0
- package/lib/models/weibo/weibo.query.js +63 -6
- package/lib/models/weibo/weibo.task.d.ts +49 -0
- package/lib/models/weibo/weibo.task.js +85 -35
- package/lib/utils/config.d.ts +50 -0
- package/lib/utils/config.js +55 -2
- package/lib/utils/image.d.ts +11 -0
- package/lib/utils/image.js +15 -0
- package/lib/utils/paths.js +7 -7
- package/lib/utils/puppeteer.render.d.ts +15 -0
- package/lib/utils/puppeteer.render.js +37 -15
- package/package.json +6 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,32 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 2.0.2
|
|
2
|
+
* fix DYNAMIC_TYPE_ARTICLE
|
|
3
|
+
* 优化Next npm包插件 Task加载
|
|
4
|
+
|
|
5
|
+
# 2.0.1
|
|
6
|
+
* 规范版本号
|
|
7
|
+
* 调整渲染出图类型为webp格式,减小发送图片消息带宽压力
|
|
8
|
+
|
|
9
|
+
# 2.0.0
|
|
2
10
|
* 优化代码,npm 包增加 typescript 类型定义文件
|
|
3
11
|
* 统一配置文件目录:yunzai/data/yuki-plugin/config/,更新后如需使用旧配置文件,请自行移动旧配置文件到新目录
|
|
12
|
+
|
|
13
|
+
# 1.4.0
|
|
4
14
|
* 优化哔哩登录日志
|
|
5
15
|
* 优化渲染
|
|
6
16
|
* 增加哔哩 MAJOR_TYPE_DRAW MAJOR_TYPE_ARTICLE 动态子类型
|
|
7
17
|
|
|
8
|
-
# 1.0
|
|
18
|
+
# 1.3.0
|
|
9
19
|
* 修复群组与好友动态推送混淆问题
|
|
10
20
|
* 更新获取B站up信息api
|
|
11
21
|
* 优化动态字体样式
|
|
12
22
|
* 优化文字动态内容排版
|
|
13
23
|
* 修复转发动态内容缺失
|
|
14
24
|
|
|
15
|
-
# 1.0
|
|
25
|
+
# 1.2.0
|
|
16
26
|
* 新增支持获取完整文章动态内容
|
|
17
27
|
* 修复宫格样式
|
|
18
28
|
|
|
19
|
-
# 1.0
|
|
29
|
+
# 1.1.0
|
|
20
30
|
* 修复了一些bug
|
|
21
31
|
* 优化了一些功能
|
|
22
32
|
* 新增 Yunzai-v4.1 npm包方式安装支持,yarn add yz-yuki-plugin -W
|
package/README.md
CHANGED
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
>```
|
|
22
22
|
接着修改 `yunzaijs/yunzai.config.js`,按版本选择修改方式:
|
|
23
23
|
|
|
24
|
-
Yunzai-Next v4.1.
|
|
24
|
+
Yunzai-Next v4.1.33+及以上版本:
|
|
25
25
|
```js
|
|
26
26
|
import { defineConfig } from 'yunzai'
|
|
27
27
|
export default defineConfig({
|
|
28
28
|
applications: ['yz-system', 'yz-yuki-plugin'], //该行添加 'yz-yuki-plugin'
|
|
29
|
-
middlewares: ['
|
|
29
|
+
middlewares: ['yunzai-mys/runtime', 'yunzai-mys/message']
|
|
30
30
|
})
|
|
31
31
|
```
|
|
32
32
|
|
|
@@ -75,6 +75,12 @@ pnpm install --filter=yuki-plugin
|
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
## 📦插件配置
|
|
78
|
+
|
|
79
|
+
> [!IMPORTANT]
|
|
80
|
+
> 统一的配置文件路径:
|
|
81
|
+
|
|
82
|
+
`Yunzai/data/yuki-plugin/config/`,启动一次后,即可查看配置文件。
|
|
83
|
+
|
|
78
84
|
### 1.B站动态功能:
|
|
79
85
|
使用建议先绑定B站账号或配置cookie,绑定后即可使用相关功能。
|
|
80
86
|
|
|
@@ -127,11 +133,6 @@ https://m.weibo.cn/u/7643376782 # 7643376782 为崩坏星穹铁道博主uid
|
|
|
127
133
|
|
|
128
134
|
<details><summary>点击展开</summary>
|
|
129
135
|
|
|
130
|
-
> [!IMPORTANT]
|
|
131
|
-
> 统一的配置文件路径:
|
|
132
|
-
|
|
133
|
-
`Yunzai/data/yuki-plugin/config/`,启动一次后,即可查看配置文件。
|
|
134
|
-
|
|
135
136
|
> [!TIP]
|
|
136
137
|
> 指令前缀:`#优纪`、`#yuki`、`/优纪`、`/yuki`,
|
|
137
138
|
|
package/lib/apps/bilibili.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import JSON from 'json5';
|
|
2
2
|
import lodash from 'lodash';
|
|
3
|
-
import { Messages,
|
|
3
|
+
import { Messages, Bot, Redis } from 'yunzai';
|
|
4
4
|
import { BiliQuery } from '../models/bilibili/bilibili.query.js';
|
|
5
5
|
import { BiliTask } from '../models/bilibili/bilibili.task.js';
|
|
6
6
|
import Config from '../utils/config.js';
|
|
@@ -8,49 +8,47 @@ import { BiliGetWebData } from '../models/bilibili/bilibili.get.web.data.js';
|
|
|
8
8
|
import { applyLoginQRCode, pollLoginQRCode, saveLoginCookie, postGateway, exitBiliLogin, checkBiliLogin, readSavedCookieItems, saveLocalBiliCk, readSyncCookie, getNewTempCk, readTempCk } from '../models/bilibili/bilibili.models.js';
|
|
9
9
|
|
|
10
10
|
const message = new Messages('message');
|
|
11
|
-
let biliConfigData = Config.getConfigData("config", "bilibili", "config");
|
|
12
11
|
let biliPushData = Config.getConfigData("config", "bilibili", "push");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
newPushTask();
|
|
16
|
-
if (biliConfigData.pushTaskLog) {
|
|
17
|
-
Bot.logger.mark("yuki插件---B站动态推送定时任务");
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
catch (err) {
|
|
21
|
-
console.error('B站动态推送定时任务', err);
|
|
22
|
-
}
|
|
23
|
-
}, biliConfigData.pushStatus ? biliConfigData.pushTime : "");
|
|
24
|
-
async function newPushTask(e) {
|
|
12
|
+
/** 推送任务 函数 */
|
|
13
|
+
async function biliNewPushTask(e) {
|
|
25
14
|
await new BiliTask(e).runTask();
|
|
26
15
|
}
|
|
16
|
+
/**B站动态推送 */
|
|
27
17
|
message.use(async (e) => {
|
|
28
|
-
await
|
|
18
|
+
await biliNewPushTask(e);
|
|
29
19
|
}, [/^(#|\/)(yuki|优纪)?执行(b站|B站|bili|bilibili|哔哩|哔哩哔哩)任务$/]);
|
|
20
|
+
/** 添加B站动态订阅 */
|
|
30
21
|
message.use(async (e) => {
|
|
31
22
|
if (!e.isMaster) {
|
|
32
23
|
e.reply("未取得bot主人身份,无权限添加B站动态订阅");
|
|
33
24
|
}
|
|
34
25
|
else {
|
|
26
|
+
// 从消息中提取UID
|
|
35
27
|
const uid = e.msg.replace(/^(#|\/)(yuki|优纪)?(订阅|添加|add|ADD)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*|直播\s*)*/g, "").trim().replace(/^(uid|UID)?(:|:)?/g, '');
|
|
36
28
|
if (!uid) {
|
|
37
29
|
e.reply(`请在指令末尾指定订阅的B站up主的UID!`);
|
|
38
30
|
return true;
|
|
39
31
|
}
|
|
32
|
+
// 获取或初始化推送数据
|
|
40
33
|
let subData = biliPushData || { group: {}, private: {} };
|
|
34
|
+
// 根据聊天类型初始化数据
|
|
41
35
|
let chatType = e.isGroup ? "group" : "private";
|
|
42
36
|
let chatId = e.isGroup ? e.group_id : e.user_id;
|
|
37
|
+
// 初始化群组或私聊数据
|
|
43
38
|
if (!subData[chatType][chatId]) {
|
|
44
39
|
subData[chatType][chatId] = [];
|
|
45
40
|
}
|
|
41
|
+
// 检查该 uid 是否已存在
|
|
46
42
|
const upData = subData[chatType][chatId].find((item) => item.uid === uid);
|
|
47
43
|
if (upData) {
|
|
44
|
+
// 更新推送类型
|
|
48
45
|
upData.type = BiliQuery.typeHandle(upData, e.msg, "add");
|
|
49
46
|
biliPushData = subData;
|
|
50
47
|
Config.saveConfig("config", "bilibili", "push", subData);
|
|
51
48
|
e.reply(`修改b站推送动态类型成功~\n${upData.name}:${uid}`);
|
|
52
49
|
return;
|
|
53
50
|
}
|
|
51
|
+
// 获取 Bilibili 动态信息
|
|
54
52
|
const res = await new BiliGetWebData(e).getBiliDynamicListDataByUid(uid);
|
|
55
53
|
if (res.statusText !== "OK") {
|
|
56
54
|
e.reply("出了点网络问题,等会再试试吧~");
|
|
@@ -76,8 +74,9 @@ message.use(async (e) => {
|
|
|
76
74
|
else {
|
|
77
75
|
name = uid;
|
|
78
76
|
}
|
|
77
|
+
// 添加新的推送数据
|
|
79
78
|
subData[chatType][chatId].push({
|
|
80
|
-
bot_id: e.self_id,
|
|
79
|
+
bot_id: e.self_id, // 使用 bot_id, 对应 e_self_id
|
|
81
80
|
uid,
|
|
82
81
|
name: name,
|
|
83
82
|
type: BiliQuery.typeHandle({ uid, name }, e.msg, "add"),
|
|
@@ -87,30 +86,38 @@ message.use(async (e) => {
|
|
|
87
86
|
e.reply(`添加b站推送成功~\n${name}:${uid}`);
|
|
88
87
|
}
|
|
89
88
|
}, [/^(#|\/)(yuki|优纪)?(订阅|添加|add|ADD)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*|直播\s*)*.*$/]);
|
|
89
|
+
/** 删除B站动态订阅 */
|
|
90
90
|
message.use(async (e) => {
|
|
91
91
|
if (!e.isMaster) {
|
|
92
92
|
e.reply("未取得bot主人身份,无权限删除B站动态订阅");
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
95
|
+
// 提取用户输入的UID
|
|
95
96
|
const uid = e.msg.replace(/^(#|\/)(yuki|优纪)?(取消|删除|del|DEL)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*|直播\s*)*/g, "").trim().replace(/^(uid|UID)?(:|:)?/g, '');
|
|
96
97
|
if (!uid) {
|
|
97
98
|
e.reply(`请在指令末尾指定订阅的B站up主的UID!`);
|
|
98
99
|
return;
|
|
99
100
|
}
|
|
101
|
+
// 获取或初始化B站推送数据
|
|
100
102
|
let subData = Config.getConfigData("config", "bilibili", "push") || { group: {}, private: {} };
|
|
103
|
+
// 根据聊天类型初始化数据
|
|
101
104
|
let chatType = e.isGroup ? "group" : "private";
|
|
102
105
|
let chatId = e.isGroup ? e.group_id : e.user_id;
|
|
106
|
+
// 初始化群组或私聊数据
|
|
103
107
|
if (!subData[chatType][chatId]) {
|
|
104
108
|
subData[chatType][chatId] = [];
|
|
105
109
|
}
|
|
110
|
+
// 查找指定UID的订阅数据
|
|
106
111
|
const upData = subData[chatType][chatId].find((item) => item.uid == uid);
|
|
107
112
|
if (!upData) {
|
|
108
113
|
e.reply(`订阅列表中没有找到该UID~\n${uid}可能是无效的`);
|
|
109
114
|
return;
|
|
110
115
|
}
|
|
116
|
+
// 处理订阅类型
|
|
111
117
|
const newType = BiliQuery.typeHandle(upData, e.msg, "del");
|
|
112
118
|
let isDel = false;
|
|
113
119
|
if (newType.length) {
|
|
120
|
+
// 更新订阅类型
|
|
114
121
|
subData[chatType][chatId] = subData[chatType][chatId].map((item) => {
|
|
115
122
|
if (item.uid == uid) {
|
|
116
123
|
item.type = newType;
|
|
@@ -119,23 +126,31 @@ message.use(async (e) => {
|
|
|
119
126
|
});
|
|
120
127
|
}
|
|
121
128
|
else {
|
|
129
|
+
// 删除订阅
|
|
122
130
|
isDel = true;
|
|
123
131
|
subData[chatType][chatId] = subData[chatType][chatId].filter((item) => item.uid !== uid);
|
|
124
132
|
}
|
|
133
|
+
// 保存更新后的数据
|
|
134
|
+
//biliPushData = subData;
|
|
125
135
|
Config.saveConfig("config", "bilibili", "push", subData);
|
|
136
|
+
// 回复用户操作结果
|
|
126
137
|
e.reply(`${isDel ? "删除" : "修改"}b站推送成功~\n${uid}`);
|
|
127
138
|
}
|
|
128
139
|
}, [/^(#|\/)(yuki|优纪)?(取消|删除|del|DEL)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*|直播\s*)*.*$/]);
|
|
140
|
+
/** 扫码登录B站 */
|
|
129
141
|
message.use(async (e) => {
|
|
130
142
|
if (e.isMaster) {
|
|
131
143
|
try {
|
|
132
144
|
const token = await applyLoginQRCode(e);
|
|
133
145
|
let biliLoginCk = await pollLoginQRCode(e, token);
|
|
146
|
+
//let _uuid = readSavedCookieItems(biliLoginCk, ['_uuid'])
|
|
147
|
+
//const buvid_fp = await get_buvid_fp(_uuid);
|
|
148
|
+
//biliLoginCk = buvid_fp + biliLoginCk;
|
|
134
149
|
if (lodash.trim(biliLoginCk).length != 0) {
|
|
135
150
|
await saveLoginCookie(e, biliLoginCk);
|
|
136
151
|
e.reply(`get bilibili LoginCk:成功!`);
|
|
137
|
-
const result = await postGateway(biliLoginCk);
|
|
138
|
-
const { code, data } = await result.data;
|
|
152
|
+
const result = await postGateway(biliLoginCk); //激活ck
|
|
153
|
+
const { code, data } = await result.data; // 解析校验结果
|
|
139
154
|
switch (code) {
|
|
140
155
|
case 0:
|
|
141
156
|
(logger ?? Bot.logger)?.mark(`优纪插件:获取biliLoginCK,Gateway校验成功:${JSON.stringify(data)}`);
|
|
@@ -157,6 +172,7 @@ message.use(async (e) => {
|
|
|
157
172
|
e.reply("未取得bot主人身份,无权限配置B站登录ck");
|
|
158
173
|
}
|
|
159
174
|
}, [/^(#|\/)(yuki|优纪)?(扫码|添加|ADD|add)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)登录$/]);
|
|
175
|
+
/** 删除登陆的B站ck */
|
|
160
176
|
message.use(async (e) => {
|
|
161
177
|
if (e.isMaster) {
|
|
162
178
|
await exitBiliLogin(e);
|
|
@@ -167,6 +183,7 @@ message.use(async (e) => {
|
|
|
167
183
|
e.reply("未取得bot主人身份,无权限删除B站登录ck");
|
|
168
184
|
}
|
|
169
185
|
}, [/^(#|\/)(yuki|优纪)?(取消|删除|del|DEL)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)登录$/]);
|
|
186
|
+
/** 显示我的B站登录信息 */
|
|
170
187
|
message.use(async (e) => {
|
|
171
188
|
if (e.isMaster) {
|
|
172
189
|
await checkBiliLogin(e);
|
|
@@ -175,6 +192,7 @@ message.use(async (e) => {
|
|
|
175
192
|
e.reply("未取得bot主人身份,无权限查看B站登录状态");
|
|
176
193
|
}
|
|
177
194
|
}, [/^(#|\/)(yuki|优纪)?我的(b站|B站|bili|bilibili|哔哩|哔哩哔哩)登录$/]);
|
|
195
|
+
/** 手动绑定本地获取的B站cookie */
|
|
178
196
|
message.use(async (e) => {
|
|
179
197
|
if (e.isMaster) {
|
|
180
198
|
if (e.isPrivate) {
|
|
@@ -184,6 +202,7 @@ message.use(async (e) => {
|
|
|
184
202
|
let localBiliCookie = e.msg.replace(/^(#|\/)(yuki|优纪)?(绑定|添加|ADD|add)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)(ck|CK|cookie|COOKIE)(:|:)?/g, "").trim();
|
|
185
203
|
let param = {};
|
|
186
204
|
localBiliCookie.split(';').forEach((v) => {
|
|
205
|
+
// 处理分割特殊cookie_token
|
|
187
206
|
let tmp = lodash.trim(v).replace('=', '$').split('$');
|
|
188
207
|
param[tmp[0]] = tmp[1];
|
|
189
208
|
});
|
|
@@ -207,13 +226,16 @@ message.use(async (e) => {
|
|
|
207
226
|
}
|
|
208
227
|
return;
|
|
209
228
|
}
|
|
229
|
+
//筛选ck
|
|
210
230
|
localBiliCookie = await readSavedCookieItems(localBiliCookie, ['buvid3', 'buvid4', '_uuid', 'SESSDATA', 'DedeUserID', 'DedeUserID__ckMd5', 'bili_jct', 'b_nut', 'b_lsid'], false);
|
|
231
|
+
//const buvid_fp = await get_buvid_fp(param._uuid)
|
|
232
|
+
//localBiliCookie = buvid_fp + localBiliCookie; //添加buvid_fp值
|
|
211
233
|
await saveLocalBiliCk(localBiliCookie);
|
|
212
234
|
logger.mark(`${e.logFnc} 保存B站cookie成功 [UID:${param.DedeUserID}]`);
|
|
213
235
|
let uidMsg = [`好耶~绑定B站cookie成功:\n${param.DedeUserID}`];
|
|
214
236
|
await e.reply(uidMsg);
|
|
215
|
-
const result = await postGateway(localBiliCookie);
|
|
216
|
-
const { code, data } = await result.data;
|
|
237
|
+
const result = await postGateway(localBiliCookie); //激活ck
|
|
238
|
+
const { code, data } = await result.data; // 解析校验结果
|
|
217
239
|
switch (code) {
|
|
218
240
|
case 0:
|
|
219
241
|
(logger ?? Bot.logger)?.mark(`优纪插件:绑定localCK,Gateway校验成功:${JSON.stringify(data)}`);
|
|
@@ -228,6 +250,7 @@ message.use(async (e) => {
|
|
|
228
250
|
e.reply("未取得bot主人身份,无权限配置B站登录ck");
|
|
229
251
|
}
|
|
230
252
|
}, [/^^(#|\/)(yuki|优纪)?(绑定|添加|ADD|add)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)本地(ck|CK|cookie|COOKIE)(:|:)?.*$/]);
|
|
253
|
+
/** 删除绑定的本地B站ck */
|
|
231
254
|
message.use(async (e) => {
|
|
232
255
|
if (e.isMaster) {
|
|
233
256
|
await saveLocalBiliCk("");
|
|
@@ -237,6 +260,7 @@ message.use(async (e) => {
|
|
|
237
260
|
e.reply("未取得bot主人身份,无权限删除B站登录ck");
|
|
238
261
|
}
|
|
239
262
|
}, [/^(#|\/)(yuki|优纪)?(取消|删除|del|DEL)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)本地(ck|CK|cookie|COOKIE)$/]);
|
|
263
|
+
/** 当前正在使用的B站ck */
|
|
240
264
|
message.use(async (e) => {
|
|
241
265
|
if (e.isGroup) {
|
|
242
266
|
await e.reply('注意账号安全,请私聊查看叭');
|
|
@@ -265,6 +289,7 @@ message.use(async (e) => {
|
|
|
265
289
|
}
|
|
266
290
|
}
|
|
267
291
|
}, [/^(#|\/)(yuki|优纪)?(取消|删除|del|DEL)(b站|B站|bili|bilibili|哔哩|哔哩哔哩)本地(ck|CK|cookie|COOKIE)$/]);
|
|
292
|
+
/** 删除并刷新redis缓存的临时B站ck */
|
|
268
293
|
message.use(async (e) => {
|
|
269
294
|
try {
|
|
270
295
|
await getNewTempCk();
|
|
@@ -281,6 +306,7 @@ message.use(async (e) => {
|
|
|
281
306
|
(logger ?? Bot.logger)?.mark(`优纪插件:B站临时ck刷新error:${error}`);
|
|
282
307
|
}
|
|
283
308
|
}, [/^(#|\/)(yuki|优纪)?刷新(b站|B站|bili|bilibili|哔哩|哔哩哔哩)临时(ck|CK|cookie|COOKIE)$/]);
|
|
309
|
+
/** 订阅的全部b站推送列表 */
|
|
284
310
|
message.use(async (e) => {
|
|
285
311
|
if (!e.isMaster) {
|
|
286
312
|
e.reply("未取得bot主人身份,无权限查看Bot的全部B站订阅列表");
|
|
@@ -296,6 +322,7 @@ message.use(async (e) => {
|
|
|
296
322
|
DYNAMIC_TYPE_FORWARD: "转发",
|
|
297
323
|
DYNAMIC_TYPE_LIVE_RCMD: "直播",
|
|
298
324
|
};
|
|
325
|
+
// 处理群组订阅
|
|
299
326
|
if (subData.group && Object.keys(subData.group).length > 0) {
|
|
300
327
|
messages.push("------群组B站订阅------\n");
|
|
301
328
|
Object.keys(subData.group).forEach((groupId) => {
|
|
@@ -313,6 +340,7 @@ message.use(async (e) => {
|
|
|
313
340
|
});
|
|
314
341
|
});
|
|
315
342
|
}
|
|
343
|
+
// 处理私聊订阅
|
|
316
344
|
if (subData.private && Object.keys(subData.private).length > 0) {
|
|
317
345
|
messages.push("\n------私聊B站订阅------");
|
|
318
346
|
Object.keys(subData.private).forEach((userId) => {
|
|
@@ -333,6 +361,7 @@ message.use(async (e) => {
|
|
|
333
361
|
e.reply(`推送列表如下:\n${messages.join("\n")}`);
|
|
334
362
|
}
|
|
335
363
|
}, [/^(#|\/)(yuki|优纪)?(b站|B站|bili|bilibili|哔哩|哔哩哔哩)全部(推送|动态|订阅)列表$/]);
|
|
364
|
+
/** 单独群聊或私聊的订阅的b站推送列表 */
|
|
336
365
|
message.use(async (e) => {
|
|
337
366
|
let subData = Config.getConfigData("config", "bilibili", "push") || { group: {}, private: {} };
|
|
338
367
|
const messages = [];
|
|
@@ -344,6 +373,7 @@ message.use(async (e) => {
|
|
|
344
373
|
DYNAMIC_TYPE_FORWARD: "转发",
|
|
345
374
|
DYNAMIC_TYPE_LIVE_RCMD: "直播",
|
|
346
375
|
};
|
|
376
|
+
// 根据聊天类型初始化数据
|
|
347
377
|
let chatType = e.isGroup ? "group" : "private";
|
|
348
378
|
let chatId = e.isGroup ? e.group_id : e.user_id;
|
|
349
379
|
if (!subData[chatType][chatId]) {
|
|
@@ -362,6 +392,7 @@ message.use(async (e) => {
|
|
|
362
392
|
});
|
|
363
393
|
e.reply(`推送列表如下:\n${messages.join("\n")}`);
|
|
364
394
|
}, [/^(#|\/)(yuki|优纪)?(b站|B站|bili|bilibili|哔哩|哔哩哔哩)(推送|动态|订阅)列表$/]);
|
|
395
|
+
/**通过uid获取up主信息 */
|
|
365
396
|
message.use(async (e) => {
|
|
366
397
|
let uid = e.msg.replace(/^(#|\/)(yuki|优纪)?(b站|B站|bili|bilibili|哔哩|哔哩哔哩)(up|UP)主/g, "").trim();
|
|
367
398
|
const res = await new BiliGetWebData(e).getBilibiUserInfoByUid(uid);
|
|
@@ -393,6 +424,7 @@ message.use(async (e) => {
|
|
|
393
424
|
}
|
|
394
425
|
e.reply(message);
|
|
395
426
|
}, [/^(#|\/)(yuki|优纪)?(b站|B站|bili|bilibili|哔哩|哔哩哔哩)(up|UP)主.*$/]);
|
|
427
|
+
/** 根据名称搜索up的uid*/
|
|
396
428
|
message.use(async (e) => {
|
|
397
429
|
let keyword = e.msg.replace(/^(#|\/)(yuki|优纪)?搜索(b站|B站|bili|bilibili|哔哩|哔哩哔哩)(up|UP)主/g, "").trim();
|
|
398
430
|
const res = await new BiliGetWebData(e).searchBiliUserInfoByKeyword(keyword);
|
package/lib/apps/help.js
CHANGED
|
@@ -3,6 +3,9 @@ import Image from '../utils/image.js';
|
|
|
3
3
|
import Help from '../models/help/help.js';
|
|
4
4
|
|
|
5
5
|
const message = new Messages('message');
|
|
6
|
+
/**
|
|
7
|
+
* 优纪帮助
|
|
8
|
+
*/
|
|
6
9
|
message.use(async (e) => {
|
|
7
10
|
const helpData = await Help.get();
|
|
8
11
|
const renderData = {
|
|
@@ -16,6 +19,10 @@ message.use(async (e) => {
|
|
|
16
19
|
}))
|
|
17
20
|
};
|
|
18
21
|
const ScreenshotOptionsData = {
|
|
22
|
+
SOptions: {
|
|
23
|
+
type: 'webp',
|
|
24
|
+
quality: 90,
|
|
25
|
+
},
|
|
19
26
|
isSplit: false,
|
|
20
27
|
modelName: 'yukiHelp',
|
|
21
28
|
};
|
package/lib/apps/version.js
CHANGED
|
@@ -3,6 +3,9 @@ import Image from '../utils/image.js';
|
|
|
3
3
|
import VersionData from '../models/version/version.js';
|
|
4
4
|
|
|
5
5
|
const message = new Messages('message');
|
|
6
|
+
/**
|
|
7
|
+
* 优纪版本
|
|
8
|
+
*/
|
|
6
9
|
message.use(async (e) => {
|
|
7
10
|
const version = new VersionData;
|
|
8
11
|
const versionData = await version.getChangelogContent();
|
|
@@ -13,6 +16,10 @@ message.use(async (e) => {
|
|
|
13
16
|
}))
|
|
14
17
|
};
|
|
15
18
|
const ScreenshotOptionsData = {
|
|
19
|
+
SOptions: {
|
|
20
|
+
type: 'webp',
|
|
21
|
+
quality: 90,
|
|
22
|
+
},
|
|
16
23
|
isSplit: false,
|
|
17
24
|
modelName: 'yukiVersion',
|
|
18
25
|
};
|
package/lib/apps/weibo.js
CHANGED
|
@@ -1,53 +1,51 @@
|
|
|
1
|
-
import { Messages
|
|
1
|
+
import { Messages } from 'yunzai';
|
|
2
2
|
import { WeiboQuery } from '../models/weibo/weibo.query.js';
|
|
3
3
|
import { WeiboTask } from '../models/weibo/weibo.task.js';
|
|
4
4
|
import Config from '../utils/config.js';
|
|
5
5
|
import { WeiboGetWebData } from '../models/weibo/weibo.get.web.data.js';
|
|
6
6
|
|
|
7
7
|
const message = new Messages('message');
|
|
8
|
-
let weiboConfigData = Config.getConfigData("config", "weibo", "config");
|
|
9
8
|
let weiboPushData = Config.getConfigData("config", "weibo", "push");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
await newPushTask();
|
|
13
|
-
if (weiboConfigData.pushTaskLog) {
|
|
14
|
-
Bot.logger.mark("yuki插件---微博动态推送定时任务");
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
catch (err) {
|
|
18
|
-
console.error('微博动态推送定时任务', err);
|
|
19
|
-
}
|
|
20
|
-
}, weiboConfigData.pushStatus ? weiboConfigData.pushTime : "");
|
|
21
|
-
async function newPushTask(e) {
|
|
9
|
+
/** 定义 动态任务 函数 */
|
|
10
|
+
async function weiboNewPushTask(e) {
|
|
22
11
|
await new WeiboTask(e).runTask();
|
|
23
12
|
}
|
|
13
|
+
/**微博动态推送 */
|
|
24
14
|
message.use(async (e) => {
|
|
25
|
-
await
|
|
15
|
+
await weiboNewPushTask(e);
|
|
26
16
|
}, [/^(#|\/)(yuki|优纪)?执行(微博|weibo|WEIBO)任务$/]);
|
|
17
|
+
/** 添加微博动态订阅 */
|
|
27
18
|
message.use(async (e) => {
|
|
28
19
|
if (!e.isMaster) {
|
|
29
20
|
e.reply("未取得bot主人身份,无权限添加微博动态订阅");
|
|
30
21
|
}
|
|
31
22
|
else {
|
|
23
|
+
// 从消息中提取UID
|
|
32
24
|
const uid = e.msg.replace(/^(#|\/)(yuki|优纪)?(订阅|添加|add|ADD)(微博|weibo|WEIBO)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*)*/g, "").trim();
|
|
33
25
|
if (!uid) {
|
|
34
26
|
e.reply(`请在指令末尾指定订阅的微博博主的UID!`);
|
|
35
27
|
return true;
|
|
36
28
|
}
|
|
29
|
+
// 获取或初始化推送数据
|
|
37
30
|
let subData = weiboPushData || { group: {}, private: {} };
|
|
31
|
+
// 根据聊天类型初始化数据
|
|
38
32
|
let chatType = e.isGroup ? "group" : "private";
|
|
39
33
|
let chatId = e.isGroup ? e.group_id : e.user_id;
|
|
34
|
+
// 初始化群组或私聊数据
|
|
40
35
|
if (!subData[chatType][chatId]) {
|
|
41
36
|
subData[chatType][chatId] = [];
|
|
42
37
|
}
|
|
38
|
+
// 检查该 uid 是否已存在
|
|
43
39
|
const upData = subData[chatType][chatId].find((item) => item.uid === uid);
|
|
44
40
|
if (upData) {
|
|
41
|
+
// 更新推送类型
|
|
45
42
|
upData.type = WeiboQuery.typeHandle(upData, e.msg, "add");
|
|
46
43
|
weiboPushData = subData;
|
|
47
44
|
Config.saveConfig("config", "weibo", "push", subData);
|
|
48
45
|
e.reply(`修改微博推送动态类型成功~\n${upData.name}:${uid}`);
|
|
49
46
|
return;
|
|
50
47
|
}
|
|
48
|
+
// 获取 微博 博主信息
|
|
51
49
|
const res = await new WeiboGetWebData(e).getBloggerInfo(uid);
|
|
52
50
|
if (res.statusText !== "OK") {
|
|
53
51
|
e.reply("出了点网络问题,等会再试试吧~");
|
|
@@ -63,8 +61,9 @@ message.use(async (e) => {
|
|
|
63
61
|
if (userInfo && (userInfo.length !== 0)) {
|
|
64
62
|
name = userInfo.screen_name || uid;
|
|
65
63
|
}
|
|
64
|
+
// 添加新的推送数据
|
|
66
65
|
subData[chatType][chatId].push({
|
|
67
|
-
bot_id: e?.self_id,
|
|
66
|
+
bot_id: e?.self_id, // 使用 bot_id 对应 e_self_id
|
|
68
67
|
uid,
|
|
69
68
|
name: name,
|
|
70
69
|
type: WeiboQuery.typeHandle({ uid, name }, e.msg, "add"),
|
|
@@ -74,30 +73,38 @@ message.use(async (e) => {
|
|
|
74
73
|
e.reply(`添加微博推送成功~\n${name}:${uid}`);
|
|
75
74
|
}
|
|
76
75
|
}, [/^(#|\/)(yuki|优纪)?(订阅|添加|add|ADD)(微博|weibo|WEIBO)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*)*.*$/]);
|
|
76
|
+
/** 删除微博动态订阅 */
|
|
77
77
|
message.use(async (e) => {
|
|
78
78
|
if (!e.isMaster) {
|
|
79
79
|
e.reply("未取得bot主人身份,无权限删除微博动态订阅");
|
|
80
80
|
}
|
|
81
81
|
else {
|
|
82
|
+
// 提取用户输入的UID
|
|
82
83
|
const uid = e.msg.replace(/^(#|\/)(yuki|优纪)?(取消|删除|del|DEL)(微博|weibo|WEIBO)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*)*/g, "").trim();
|
|
83
84
|
if (!uid) {
|
|
84
85
|
e.reply(`请在指令末尾指定订阅的微博博主的UID!`);
|
|
85
86
|
return;
|
|
86
87
|
}
|
|
88
|
+
// 获取或初始化微博推送数据
|
|
87
89
|
let data = weiboPushData || { group: {}, private: {} };
|
|
90
|
+
// 根据聊天类型初始化数据
|
|
88
91
|
let chatType = e.isGroup ? "group" : "private";
|
|
89
92
|
let chatId = e.isGroup ? e.group_id : e.user_id;
|
|
93
|
+
// 初始化群组或私聊数据
|
|
90
94
|
if (!data[chatType][chatId]) {
|
|
91
95
|
data[chatType][chatId] = [];
|
|
92
96
|
}
|
|
97
|
+
// 查找指定UID的订阅数据
|
|
93
98
|
const upData = data[chatType][chatId].find((item) => item.uid == uid);
|
|
94
99
|
if (!upData) {
|
|
95
100
|
e.reply(`订阅列表中没有找到该UID~\n${uid}可能是无效的`);
|
|
96
101
|
return;
|
|
97
102
|
}
|
|
103
|
+
// 处理订阅类型
|
|
98
104
|
const newType = WeiboQuery.typeHandle(upData, e.msg, "del");
|
|
99
105
|
let isDel = false;
|
|
100
106
|
if (newType.length) {
|
|
107
|
+
// 更新订阅类型
|
|
101
108
|
data[chatType][chatId] = data[chatType][chatId].map((item) => {
|
|
102
109
|
if (item.uid == uid) {
|
|
103
110
|
item.type = newType;
|
|
@@ -106,13 +113,18 @@ message.use(async (e) => {
|
|
|
106
113
|
});
|
|
107
114
|
}
|
|
108
115
|
else {
|
|
116
|
+
// 删除订阅
|
|
109
117
|
isDel = true;
|
|
110
118
|
data[chatType][chatId] = data[chatType][chatId].filter((item) => item.uid !== uid);
|
|
111
119
|
}
|
|
120
|
+
// 保存更新后的数据
|
|
121
|
+
//weiboPushData = data;
|
|
112
122
|
Config.saveConfig("config", "weibo", "push", data);
|
|
123
|
+
// 回复用户操作结果
|
|
113
124
|
e.reply(`${isDel ? "删除" : "修改"}微博推送成功~\n${uid}`);
|
|
114
125
|
}
|
|
115
126
|
}, [/^(#|\/)(yuki|优纪)?(取消|删除|del|DEL)(微博|weibo|WEIBO)推送\s*(视频\s*|图文\s*|文章\s*|转发\s*)*.*$/]);
|
|
127
|
+
/** 订阅的全部微博推送列表 */
|
|
116
128
|
message.use(async (e) => {
|
|
117
129
|
if (!e.isMaster) {
|
|
118
130
|
e.reply("未取得bot主人身份,无权限查看Bot的全部微博推送列表");
|
|
@@ -127,6 +139,7 @@ message.use(async (e) => {
|
|
|
127
139
|
DYNAMIC_TYPE_ARTICLE: "文章",
|
|
128
140
|
DYNAMIC_TYPE_FORWARD: "转发",
|
|
129
141
|
};
|
|
142
|
+
// 处理群组订阅
|
|
130
143
|
if (subData.group && Object.keys(subData.group).length > 0) {
|
|
131
144
|
messages.push("------群组微博订阅------");
|
|
132
145
|
Object.keys(subData.group).forEach((groupId) => {
|
|
@@ -144,6 +157,7 @@ message.use(async (e) => {
|
|
|
144
157
|
});
|
|
145
158
|
});
|
|
146
159
|
}
|
|
160
|
+
// 处理私聊订阅
|
|
147
161
|
if (subData.private && Object.keys(subData.private).length > 0) {
|
|
148
162
|
messages.push("------私聊微博订阅------");
|
|
149
163
|
Object.keys(subData.private).forEach((userId) => {
|
|
@@ -164,6 +178,7 @@ message.use(async (e) => {
|
|
|
164
178
|
e.reply(`推送列表如下:\n${messages.join("\n")}`);
|
|
165
179
|
}
|
|
166
180
|
}, [/^(#|\/)(yuki|优纪)?(微博|weibo|WEIBO)全部(推送|动态|订阅)列表$/]);
|
|
181
|
+
/** 单独群聊或私聊的订阅的b站推送列表 */
|
|
167
182
|
message.use(async (e) => {
|
|
168
183
|
let subData = weiboPushData || { group: {}, private: {} };
|
|
169
184
|
const messages = [];
|
|
@@ -174,6 +189,7 @@ message.use(async (e) => {
|
|
|
174
189
|
DYNAMIC_TYPE_ARTICLE: "文章",
|
|
175
190
|
DYNAMIC_TYPE_FORWARD: "转发",
|
|
176
191
|
};
|
|
192
|
+
// 根据聊天类型初始化数据
|
|
177
193
|
let chatType = e.isGroup ? "group" : "private";
|
|
178
194
|
let chatId = e.isGroup ? e.group_id : e.user_id;
|
|
179
195
|
if (!subData[chatType][chatId]) {
|
|
@@ -192,6 +208,7 @@ message.use(async (e) => {
|
|
|
192
208
|
});
|
|
193
209
|
e.reply(`推送列表如下:\n${messages.join("\n")}`);
|
|
194
210
|
}, [/^(#|\/)(yuki|优纪)?(微博|weibo|WEIBO)(推送|动态|订阅)列表$/]);
|
|
211
|
+
/**通过uid获取up主信息 */
|
|
195
212
|
message.use(async (e) => {
|
|
196
213
|
let uid = e.msg.replace(/^(#|\/)(yuki|优纪)?(微博|weibo|WEIBO)(博|bo|BO)主/g, "").trim();
|
|
197
214
|
const res = await new WeiboGetWebData(e).getBloggerInfo(uid);
|
|
@@ -220,6 +237,7 @@ message.use(async (e) => {
|
|
|
220
237
|
];
|
|
221
238
|
e.reply(message);
|
|
222
239
|
}, [/^(#|\/)(yuki|优纪)?(微博|weibo|WEIBO)(博|bo|BO)主.*$/]);
|
|
240
|
+
/** 根据昵称搜索博主信息*/
|
|
223
241
|
message.use(async (e) => {
|
|
224
242
|
let keyword = e.msg.replace(/^(#|\/)(yuki|优纪)?搜索(微博|weibo|WEIBO)(博|bo|BO)主/g, "").trim();
|
|
225
243
|
const res = await new WeiboGetWebData(e).searchBloggerInfo(keyword);
|
|
@@ -2,6 +2,8 @@ import React from 'react';
|
|
|
2
2
|
import LogoText from './LogoText.js';
|
|
3
3
|
import { createRequire } from 'react-puppeteer';
|
|
4
4
|
|
|
5
|
+
// Account
|
|
6
|
+
// up账户组件
|
|
5
7
|
const require = createRequire(import.meta.url);
|
|
6
8
|
const bilibililogo = require('./../../../resources/img/icon/dynamic/bilibili.svg');
|
|
7
9
|
const weibilogo = require('./../../../resources/img/icon/dynamic/weibo.svg');
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { createRequire } from 'react-puppeteer';
|
|
3
3
|
|
|
4
|
+
// DynamicContent.tsx
|
|
4
5
|
const require = createRequire(import.meta.url);
|
|
5
6
|
const Content = ({ data }) => {
|
|
6
7
|
const picItems = data.pics && (React.createElement("div", { className: 'pic-content' }, data.pics.map((item, index) => {
|
|
@@ -12,6 +13,7 @@ const Content = ({ data }) => {
|
|
|
12
13
|
})));
|
|
13
14
|
const boxGrid_4 = React.createElement("link", { key: "0", rel: "stylesheet", href: require('./../../../resources/css/dynamic/Content.box.grid.4.css') });
|
|
14
15
|
const boxGrid_9 = React.createElement("link", { key: "0", rel: "stylesheet", href: require('./../../../resources/css/dynamic/Content.box.grid.9.css') });
|
|
16
|
+
/**动态宫格样式 */
|
|
15
17
|
function getBoxGridStyle(pics) {
|
|
16
18
|
if (!Array.isArray(pics) || pics.length === 0) {
|
|
17
19
|
return null;
|
|
@@ -3,6 +3,7 @@ import { ConfigController, BOT_NAME } from 'yunzai';
|
|
|
3
3
|
import Config from '../../utils/config.js';
|
|
4
4
|
import { createRequire } from 'react-puppeteer';
|
|
5
5
|
|
|
6
|
+
// Footer.tsx
|
|
6
7
|
const botVersion = ConfigController.package?.version;
|
|
7
8
|
const require = createRequire(import.meta.url);
|
|
8
9
|
const bilibililogo = require('./../../../resources/img/icon/dynamic/bilibili.svg');
|
|
@@ -3,6 +3,8 @@ import Account from './Account.js';
|
|
|
3
3
|
import Content from './Content.js';
|
|
4
4
|
import { createRequire } from 'react-puppeteer';
|
|
5
5
|
|
|
6
|
+
// ForwardContent
|
|
7
|
+
// 转发动态内容组件
|
|
6
8
|
const require = createRequire(import.meta.url);
|
|
7
9
|
const ForwardContent = ({ data }) => (React.createElement(React.Fragment, null,
|
|
8
10
|
React.createElement("link", { rel: "stylesheet", href: require("./../../../resources/css/dynamic/ForwardContent.css") }),
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { createRequire } from 'react-puppeteer';
|
|
3
3
|
|
|
4
|
+
// LogoText
|
|
5
|
+
// Logo 文本组件
|
|
4
6
|
const require = createRequire(import.meta.url);
|
|
5
7
|
const LogoText = ({ data }) => (React.createElement(React.Fragment, null,
|
|
6
8
|
React.createElement("link", { rel: "stylesheet", href: require('./../../../resources/css/dynamic/LogoText.css') }),
|
|
@@ -5,6 +5,7 @@ import ForwardContent from './ForwardContent.js';
|
|
|
5
5
|
import Footer from './Footer.js';
|
|
6
6
|
import { createRequire } from 'react-puppeteer';
|
|
7
7
|
|
|
8
|
+
// MainPage.tsx
|
|
8
9
|
const require = createRequire(import.meta.url);
|
|
9
10
|
function App({ data }) {
|
|
10
11
|
return (React.createElement(React.Fragment, null,
|
|
@@ -3,6 +3,7 @@ import { BOT_NAME, ConfigController } from 'yunzai';
|
|
|
3
3
|
import Config from '../../utils/config.js';
|
|
4
4
|
import { createRequire } from 'react-puppeteer';
|
|
5
5
|
|
|
6
|
+
//help.tsx
|
|
6
7
|
const botVersion = ConfigController.package?.version;
|
|
7
8
|
const require = createRequire(import.meta.url);
|
|
8
9
|
function App({ data }) {
|