wechaty-web-panel 1.6.47 → 1.6.48

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 CHANGED
@@ -1,4 +1,8 @@
1
1
  ## 更新日志
2
+ ### V1.6.48(2024-04-23)
3
+ 1、优化 rss 解析
4
+ 2、修复 rss 定时任务初始化失效
5
+
2
6
  ### V1.6.47(2024-04-23)
3
7
  1、添加 Coze支持
4
8
  2、优化文件提取规则
@@ -1,4 +1,5 @@
1
1
  export function delHtmlTag(str: any): any;
2
+ export function isCDNFileUrl(url: any): boolean;
2
3
  /**
3
4
  * 提取文字中的图片链接 文件链接
4
5
  * @param text
@@ -26,11 +26,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.getNewsType = exports.groupArray = exports.cancelAllSchedule = exports.throttle = exports.msgArr = exports.contentDistinguish = exports.getFormatQuery = exports.MD5 = exports.writeFile = exports.randomRange = exports.getConstellation = exports.isRealDate = exports.formatDate = exports.getDay = exports.convertTime = exports.getToday = exports.delay = exports.parseBody = exports.setLocalSchedule = exports.Base64Decode = exports.Base64Encode = exports.extractImageLinks = exports.delHtmlTag = void 0;
29
+ exports.getNewsType = exports.groupArray = exports.cancelAllSchedule = exports.throttle = exports.msgArr = exports.contentDistinguish = exports.getFormatQuery = exports.MD5 = exports.writeFile = exports.randomRange = exports.getConstellation = exports.isRealDate = exports.formatDate = exports.getDay = exports.convertTime = exports.getToday = exports.delay = exports.parseBody = exports.setLocalSchedule = exports.Base64Decode = exports.Base64Encode = exports.extractImageLinks = exports.isCDNFileUrl = exports.delHtmlTag = void 0;
30
30
  const crypto_1 = __importDefault(require("crypto"));
31
31
  const schedule = __importStar(require("node-schedule"));
32
32
  const fs_1 = __importDefault(require("fs"));
33
33
  const dayjs_1 = __importDefault(require("dayjs"));
34
+ const path_1 = __importDefault(require("path"));
34
35
  /**
35
36
  * 设置定时器
36
37
  * @param {*} date 日期
@@ -496,6 +497,21 @@ function delHtmlTag(str) {
496
497
  return str.replace(/<[^>]+>/g, ""); //去掉所有的html标记
497
498
  }
498
499
  exports.delHtmlTag = delHtmlTag;
500
+ function isCDNFileUrl(url) {
501
+ // 常见的CDN文件扩展名
502
+ const cdnFileExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.mp4', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.avi', '.zip', '.wav', '.rar', '.pdf', '.txt', '.log'];
503
+ try {
504
+ const parsedUrl = new URL(url);
505
+ const fileExt = path_1.default.extname(parsedUrl.pathname).toLowerCase();
506
+ // 检查文件扩展名是否在cdnFileExtensions列表中
507
+ return cdnFileExtensions.includes(fileExt);
508
+ }
509
+ catch (err) {
510
+ // 无效的URL
511
+ return false;
512
+ }
513
+ }
514
+ exports.isCDNFileUrl = isCDNFileUrl;
499
515
  /**
500
516
  * 提取文字中的图片链接 文件链接
501
517
  * @param text
@@ -520,7 +536,7 @@ function extractImageLinks(text) {
520
536
  while ((match = mdRegexHttp.exec(text)) !== null || (match = mdRegexHttps.exec(text)) !== null || (match = fileRegexHttp.exec(text)) !== null || (match = filesRegexHttp.exec(text)) !== null) {
521
537
  imageLinks.push(match[1]);
522
538
  }
523
- imageLinks = Array.from(new Set(imageLinks));
539
+ imageLinks = Array.from(new Set(imageLinks)).filter(item => isCDNFileUrl(item));
524
540
  return imageLinks.map(item => ({ type: 2, url: item }));
525
541
  }
526
542
  exports.extractImageLinks = extractImageLinks;
@@ -6,7 +6,7 @@ exports.packageJson = void 0;
6
6
  */
7
7
  exports.packageJson = {
8
8
  "name": "wechaty-web-panel",
9
- "version": "1.6.47",
9
+ "version": "1.6.48",
10
10
  "description": "智能微秘书插件",
11
11
  "exports": {
12
12
  ".": {
@@ -65,7 +65,7 @@ async function setTask(that, item, name, callback) {
65
65
  * @param targets 发送的多个目标
66
66
  * @return {Promise<void>}
67
67
  */
68
- const sendCustom = async ({ that, target, item, isMulti, targets }) => {
68
+ async function sendCustom({ that, target, item, isMulti, targets }) {
69
69
  for (let reply of item.contents) {
70
70
  console.log("定时任务开始发送,内容:", `${reply.type === 1 ? reply.content : reply.url}`);
71
71
  await (0, index_js_1.delay)(1000);
@@ -112,7 +112,8 @@ const sendCustom = async ({ that, target, item, isMulti, targets }) => {
112
112
  }
113
113
  }
114
114
  }
115
- };
115
+ }
116
+ ;
116
117
  /**
117
118
  * 发送新闻资讯
118
119
  * @param that
@@ -122,7 +123,7 @@ const sendCustom = async ({ that, target, item, isMulti, targets }) => {
122
123
  * @param targets 发送的多个目标
123
124
  * @return {Promise<void>}
124
125
  */
125
- const sendNews = async ({ that, target, item, isMulti, targets }) => {
126
+ async function sendNews({ that, target, item, isMulti, targets }) {
126
127
  let content = await (0, index_js_2.getNewsContent)(item.sortId, item.endWord, item.num || 10);
127
128
  console.log("新闻资讯开始发送,内容:", content);
128
129
  await (0, index_js_1.delay)(200);
@@ -145,7 +146,8 @@ const sendNews = async ({ that, target, item, isMulti, targets }) => {
145
146
  }
146
147
  }
147
148
  }
148
- };
149
+ }
150
+ ;
149
151
  /**
150
152
  * 发送自定义定制内容
151
153
  * @param that
@@ -156,7 +158,7 @@ const sendNews = async ({ that, target, item, isMulti, targets }) => {
156
158
  * @param targets 发送的多个目标
157
159
  * @return {Promise<void>}
158
160
  */
159
- const sendCustomContent = async ({ that, target, type, item, isMulti, targets }) => {
161
+ async function sendCustomContent({ that, target, type, item, isMulti, targets }) {
160
162
  let contents = await (0, index_js_2.getCustomContent)(item.sortId);
161
163
  console.log("定制内容发送", contents);
162
164
  if (!isMulti) {
@@ -184,7 +186,8 @@ const sendCustomContent = async ({ that, target, type, item, isMulti, targets })
184
186
  }
185
187
  }
186
188
  }
187
- };
189
+ }
190
+ ;
188
191
  /**
189
192
  * 发送每日说
190
193
  * @param that
@@ -192,7 +195,7 @@ const sendCustomContent = async ({ that, target, type, item, isMulti, targets })
192
195
  * @param item
193
196
  * @return {Promise<void>}
194
197
  */
195
- const sendEveryDay = async ({ that, target, item }) => {
198
+ async function sendEveryDay({ that, target, item }) {
196
199
  let content = "";
197
200
  if (item.type === "room") {
198
201
  content = await (0, index_js_2.getRoomEveryDayContent)(item.memorialDay, item.city, item.endWord);
@@ -203,7 +206,8 @@ const sendEveryDay = async ({ that, target, item }) => {
203
206
  console.log("每日说任务开始工作,发送内容:", content);
204
207
  await (0, index_js_1.delay)(1000);
205
208
  await target.say(content);
206
- };
209
+ }
210
+ ;
207
211
  /**
208
212
  * 发送倒计时
209
213
  * @param that
@@ -213,7 +217,7 @@ const sendEveryDay = async ({ that, target, item }) => {
213
217
  * @param targets 发送的多个目标
214
218
  * @return {Promise<void>}
215
219
  */
216
- const sendCountDown = async ({ that, target, item, isMulti, targets }) => {
220
+ async function sendCountDown({ that, target, item, isMulti, targets }) {
217
221
  let content = await (0, index_js_2.getCountDownContent)(item.memorialDay, item.prefix, item.suffix, item.endWord);
218
222
  console.log("倒计时任务开始工作,发送内容:", content);
219
223
  await (0, index_js_1.delay)(1000);
@@ -236,7 +240,8 @@ const sendCountDown = async ({ that, target, item, isMulti, targets }) => {
236
240
  }
237
241
  }
238
242
  }
239
- };
243
+ }
244
+ ;
240
245
  /**
241
246
  * 立即发送群消息
242
247
  * @param {*} that bot对象
@@ -13,7 +13,12 @@ const puppet_type_js_1 = require("../const/puppet-type.js");
13
13
  const dayjs_1 = __importDefault(require("dayjs"));
14
14
  async function getRssContent(info) {
15
15
  try {
16
- const parser = new rss_parser_1.default();
16
+ const parser = new rss_parser_1.default({
17
+ requestOptions: {
18
+ rejectUnauthorized: false,
19
+ },
20
+ headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' },
21
+ });
17
22
  console.log('订阅源:' + info.rssUrl);
18
23
  const feed = await parser.parseURL(info.rssUrl);
19
24
  const lastItem = await (0, rssHistory_js_1.getRssHistoryById)(info.id);
@@ -21,7 +26,7 @@ async function getRssContent(info) {
21
26
  if (feed.items && feed.items.length) {
22
27
  // 当存在历史推送记录 需要判读是否推送过
23
28
  const last = feed.items[0];
24
- const lastContent = last.link;
29
+ const lastContent = last.link || last.title;
25
30
  if (lastItem) {
26
31
  if (lastContent !== lastItem.lastContent) {
27
32
  const content = await setContent(last, info);
@@ -49,7 +54,7 @@ async function setContent(feed, info) {
49
54
  return [res];
50
55
  }
51
56
  else {
52
- const content = `${info.prefixWord ? info.prefixWord + eol + eol : ''}${(0, index_js_1.delHtmlTag)(feed.title)}${eol}${eol}【摘要】:${(0, index_js_1.delHtmlTag)(feed.content).substring(0, 600)}...${eol}【链接】:${feed.link}${eol}${eol}${info.suffixWord || ''}`;
57
+ const content = `${info.prefixWord ? info.prefixWord + eol + eol : ''}${(0, index_js_1.delHtmlTag)(feed.title)}${eol}${eol}【摘要】:${(0, index_js_1.delHtmlTag)(feed.content).substring(0, 1500)}...${eol}【链接】:${feed.link}${eol}${eol}${info.suffixWord || ''}`;
53
58
  return [{ type: 1, content: content }];
54
59
  }
55
60
  }
@@ -107,7 +112,7 @@ async function setTask(that, item, name, callback) {
107
112
  * @param item
108
113
  * @return {Promise<void>}
109
114
  */
110
- const sendRssContent = async ({ that, target, item }) => {
115
+ async function sendRssContent({ that, target, item }) {
111
116
  const replys = await getRssContent(item);
112
117
  for (let reply of replys) {
113
118
  console.log("检测到rss内容更新,开始发送:", `${reply.type === 1 ? reply.content : reply.url}`);
@@ -119,7 +124,7 @@ const sendRssContent = async ({ that, target, item }) => {
119
124
  await index_js_2.contactSay.call(that, target, reply);
120
125
  }
121
126
  }
122
- };
127
+ }
123
128
  /**
124
129
  * 立即发送rss消息
125
130
  * @param {*} that bot对象
@@ -151,6 +156,7 @@ async function initRssTask(that) {
151
156
  try {
152
157
  (0, index_js_1.cancelAllSchedule)("task_rss");
153
158
  const rssTasks = await (0, rssConfig_js_1.getAllRssConfig)(); // 获取配置信息
159
+ console.log(`获取到 rss 任务 :${rssTasks.length}个`);
154
160
  // 每日说定时任务
155
161
  if (rssTasks && rssTasks.length > 0) {
156
162
  rssTasks.forEach((item, index) => {
@@ -1,4 +1,5 @@
1
1
  export function delHtmlTag(str: any): any;
2
+ export function isCDNFileUrl(url: any): boolean;
2
3
  /**
3
4
  * 提取文字中的图片链接 文件链接
4
5
  * @param text
@@ -2,6 +2,7 @@ import Crypto from 'crypto';
2
2
  import * as schedule from 'node-schedule';
3
3
  import fs from 'fs';
4
4
  import dayjs from "dayjs";
5
+ import path from 'path';
5
6
  /**
6
7
  * 设置定时器
7
8
  * @param {*} date 日期
@@ -445,6 +446,20 @@ function groupArray(array, subGroupLength) {
445
446
  export function delHtmlTag(str) {
446
447
  return str.replace(/<[^>]+>/g, ""); //去掉所有的html标记
447
448
  }
449
+ export function isCDNFileUrl(url) {
450
+ // 常见的CDN文件扩展名
451
+ const cdnFileExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.mp4', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.avi', '.zip', '.wav', '.rar', '.pdf', '.txt', '.log'];
452
+ try {
453
+ const parsedUrl = new URL(url);
454
+ const fileExt = path.extname(parsedUrl.pathname).toLowerCase();
455
+ // 检查文件扩展名是否在cdnFileExtensions列表中
456
+ return cdnFileExtensions.includes(fileExt);
457
+ }
458
+ catch (err) {
459
+ // 无效的URL
460
+ return false;
461
+ }
462
+ }
448
463
  /**
449
464
  * 提取文字中的图片链接 文件链接
450
465
  * @param text
@@ -469,7 +484,7 @@ export function extractImageLinks(text) {
469
484
  while ((match = mdRegexHttp.exec(text)) !== null || (match = mdRegexHttps.exec(text)) !== null || (match = fileRegexHttp.exec(text)) !== null || (match = filesRegexHttp.exec(text)) !== null) {
470
485
  imageLinks.push(match[1]);
471
486
  }
472
- imageLinks = Array.from(new Set(imageLinks));
487
+ imageLinks = Array.from(new Set(imageLinks)).filter(item => isCDNFileUrl(item));
473
488
  return imageLinks.map(item => ({ type: 2, url: item }));
474
489
  }
475
490
  export { Base64Encode };
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const packageJson = {
5
5
  "name": "wechaty-web-panel",
6
- "version": "1.6.47",
6
+ "version": "1.6.48",
7
7
  "description": "智能微秘书插件",
8
8
  "exports": {
9
9
  ".": {
@@ -59,7 +59,7 @@ async function setTask(that, item, name, callback) {
59
59
  * @param targets 发送的多个目标
60
60
  * @return {Promise<void>}
61
61
  */
62
- const sendCustom = async ({ that, target, item, isMulti, targets }) => {
62
+ async function sendCustom({ that, target, item, isMulti, targets }) {
63
63
  for (let reply of item.contents) {
64
64
  console.log("定时任务开始发送,内容:", `${reply.type === 1 ? reply.content : reply.url}`);
65
65
  await delay(1000);
@@ -106,7 +106,8 @@ const sendCustom = async ({ that, target, item, isMulti, targets }) => {
106
106
  }
107
107
  }
108
108
  }
109
- };
109
+ }
110
+ ;
110
111
  /**
111
112
  * 发送新闻资讯
112
113
  * @param that
@@ -116,7 +117,7 @@ const sendCustom = async ({ that, target, item, isMulti, targets }) => {
116
117
  * @param targets 发送的多个目标
117
118
  * @return {Promise<void>}
118
119
  */
119
- const sendNews = async ({ that, target, item, isMulti, targets }) => {
120
+ async function sendNews({ that, target, item, isMulti, targets }) {
120
121
  let content = await getNewsContent(item.sortId, item.endWord, item.num || 10);
121
122
  console.log("新闻资讯开始发送,内容:", content);
122
123
  await delay(200);
@@ -139,7 +140,8 @@ const sendNews = async ({ that, target, item, isMulti, targets }) => {
139
140
  }
140
141
  }
141
142
  }
142
- };
143
+ }
144
+ ;
143
145
  /**
144
146
  * 发送自定义定制内容
145
147
  * @param that
@@ -150,7 +152,7 @@ const sendNews = async ({ that, target, item, isMulti, targets }) => {
150
152
  * @param targets 发送的多个目标
151
153
  * @return {Promise<void>}
152
154
  */
153
- const sendCustomContent = async ({ that, target, type, item, isMulti, targets }) => {
155
+ async function sendCustomContent({ that, target, type, item, isMulti, targets }) {
154
156
  let contents = await getCustomContent(item.sortId);
155
157
  console.log("定制内容发送", contents);
156
158
  if (!isMulti) {
@@ -178,7 +180,8 @@ const sendCustomContent = async ({ that, target, type, item, isMulti, targets })
178
180
  }
179
181
  }
180
182
  }
181
- };
183
+ }
184
+ ;
182
185
  /**
183
186
  * 发送每日说
184
187
  * @param that
@@ -186,7 +189,7 @@ const sendCustomContent = async ({ that, target, type, item, isMulti, targets })
186
189
  * @param item
187
190
  * @return {Promise<void>}
188
191
  */
189
- const sendEveryDay = async ({ that, target, item }) => {
192
+ async function sendEveryDay({ that, target, item }) {
190
193
  let content = "";
191
194
  if (item.type === "room") {
192
195
  content = await getRoomEveryDayContent(item.memorialDay, item.city, item.endWord);
@@ -197,7 +200,8 @@ const sendEveryDay = async ({ that, target, item }) => {
197
200
  console.log("每日说任务开始工作,发送内容:", content);
198
201
  await delay(1000);
199
202
  await target.say(content);
200
- };
203
+ }
204
+ ;
201
205
  /**
202
206
  * 发送倒计时
203
207
  * @param that
@@ -207,7 +211,7 @@ const sendEveryDay = async ({ that, target, item }) => {
207
211
  * @param targets 发送的多个目标
208
212
  * @return {Promise<void>}
209
213
  */
210
- const sendCountDown = async ({ that, target, item, isMulti, targets }) => {
214
+ async function sendCountDown({ that, target, item, isMulti, targets }) {
211
215
  let content = await getCountDownContent(item.memorialDay, item.prefix, item.suffix, item.endWord);
212
216
  console.log("倒计时任务开始工作,发送内容:", content);
213
217
  await delay(1000);
@@ -230,7 +234,8 @@ const sendCountDown = async ({ that, target, item, isMulti, targets }) => {
230
234
  }
231
235
  }
232
236
  }
233
- };
237
+ }
238
+ ;
234
239
  /**
235
240
  * 立即发送群消息
236
241
  * @param {*} that bot对象
@@ -7,7 +7,12 @@ import { getPuppetEol } from "../const/puppet-type.js";
7
7
  import dayjs from "dayjs";
8
8
  async function getRssContent(info) {
9
9
  try {
10
- const parser = new rssParser();
10
+ const parser = new rssParser({
11
+ requestOptions: {
12
+ rejectUnauthorized: false,
13
+ },
14
+ headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' },
15
+ });
11
16
  console.log('订阅源:' + info.rssUrl);
12
17
  const feed = await parser.parseURL(info.rssUrl);
13
18
  const lastItem = await getRssHistoryById(info.id);
@@ -15,7 +20,7 @@ async function getRssContent(info) {
15
20
  if (feed.items && feed.items.length) {
16
21
  // 当存在历史推送记录 需要判读是否推送过
17
22
  const last = feed.items[0];
18
- const lastContent = last.link;
23
+ const lastContent = last.link || last.title;
19
24
  if (lastItem) {
20
25
  if (lastContent !== lastItem.lastContent) {
21
26
  const content = await setContent(last, info);
@@ -43,7 +48,7 @@ async function setContent(feed, info) {
43
48
  return [res];
44
49
  }
45
50
  else {
46
- const content = `${info.prefixWord ? info.prefixWord + eol + eol : ''}${delHtmlTag(feed.title)}${eol}${eol}【摘要】:${delHtmlTag(feed.content).substring(0, 600)}...${eol}【链接】:${feed.link}${eol}${eol}${info.suffixWord || ''}`;
51
+ const content = `${info.prefixWord ? info.prefixWord + eol + eol : ''}${delHtmlTag(feed.title)}${eol}${eol}【摘要】:${delHtmlTag(feed.content).substring(0, 1500)}...${eol}【链接】:${feed.link}${eol}${eol}${info.suffixWord || ''}`;
47
52
  return [{ type: 1, content: content }];
48
53
  }
49
54
  }
@@ -101,7 +106,7 @@ async function setTask(that, item, name, callback) {
101
106
  * @param item
102
107
  * @return {Promise<void>}
103
108
  */
104
- const sendRssContent = async ({ that, target, item }) => {
109
+ async function sendRssContent({ that, target, item }) {
105
110
  const replys = await getRssContent(item);
106
111
  for (let reply of replys) {
107
112
  console.log("检测到rss内容更新,开始发送:", `${reply.type === 1 ? reply.content : reply.url}`);
@@ -113,7 +118,7 @@ const sendRssContent = async ({ that, target, item }) => {
113
118
  await contactSay.call(that, target, reply);
114
119
  }
115
120
  }
116
- };
121
+ }
117
122
  /**
118
123
  * 立即发送rss消息
119
124
  * @param {*} that bot对象
@@ -144,6 +149,7 @@ export async function initRssTask(that) {
144
149
  try {
145
150
  cancelAllSchedule("task_rss");
146
151
  const rssTasks = await getAllRssConfig(); // 获取配置信息
152
+ console.log(`获取到 rss 任务 :${rssTasks.length}个`);
147
153
  // 每日说定时任务
148
154
  if (rssTasks && rssTasks.length > 0) {
149
155
  rssTasks.forEach((item, index) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wechaty-web-panel",
3
- "version": "1.6.47",
3
+ "version": "1.6.48",
4
4
  "description": "智能微秘书插件",
5
5
  "exports": {
6
6
  ".": {