koishi-plugin-share-links-analysis 0.1.4 → 0.1.5

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.
Files changed (2) hide show
  1. package/lib/index.js +18 -7
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -114,28 +114,38 @@ function apply(ctx, config) {
114
114
  }
115
115
  });
116
116
  }
117
+ function escapeHtml(str) {
118
+ if (!str)
119
+ return '';
120
+ return str.replace(/&/g, '&')
121
+ .replace(/</g, '&lt;')
122
+ .replace(/>/g, '&gt;')
123
+ .replace(/"/g, '&quot;')
124
+ .replace(/'/g, '&#39;');
125
+ }
117
126
  async function sendResult(session, config, result, logger) {
118
127
  let message = config.format;
119
- message = message.replace(/{title}/g, result.title || '');
120
- message = message.replace(/{authorName}/g, result.authorName || '');
121
- message = message.replace(/{description}/g, result.description ? result.description : '');
122
- message = message.replace(/{sourceUrl}/g, result.sourceUrl || '');
128
+ // 对所有文本内容进行 HTML 转义
129
+ message = message.replace(/{title}/g, escapeHtml(result.title || ''));
130
+ message = message.replace(/{authorName}/g, escapeHtml(result.authorName || ''));
131
+ message = message.replace(/{description}/g, escapeHtml(result.description ? result.description : ''));
132
+ message = message.replace(/{sourceUrl}/g, escapeHtml(result.sourceUrl || ''));
123
133
  message = message.replace(/{cover}/g, result.coverUrl ? koishi_1.h.image(result.coverUrl).toString() : '');
124
134
  const imagesText = result.images ? result.images.map(img => koishi_1.h.image(img).toString()).join('\n') : '';
125
135
  message = message.replace(/{images}/g, imagesText);
126
- message = message.replace(/{stats}/g, result.stats || '');
136
+ message = message.replace(/{stats}/g, escapeHtml(result.stats || ''));
127
137
  // 【修复】只要 videoUrl 存在就处理,仅当 duration 明确超长时才替换为提示
128
138
  if (result.videoUrl) {
129
139
  // 仅当 duration 是有效数字且超长时,才显示提示
130
140
  if (typeof result.duration === 'number' && result.duration > config.Maximumduration * 60) {
131
- const tip = config.Maximumduration_tip || '';
141
+ const tip = escapeHtml(config.Maximumduration_tip || '');
132
142
  message = message.replace(/{video}/g, tip);
133
143
  message = message.replace(/{videoUrl}/g, '');
134
144
  }
135
145
  else {
136
146
  // 正常发送视频和链接
137
147
  message = message.replace(/{video}/g, koishi_1.h.video(result.videoUrl).toString());
138
- message = message.replace(/{videoUrl}/g, result.videoUrl);
148
+ message = message.replace(/{videoUrl}/g, escapeHtml(result.videoUrl));
139
149
  if (config.logLevel === 'link_only' || config.logLevel === 'full') {
140
150
  logger.info(`视频直链 (${result.platform}): ${result.videoUrl}`);
141
151
  }
@@ -146,6 +156,7 @@ async function sendResult(session, config, result, logger) {
146
156
  message = message.replace(/{video}/g, '');
147
157
  message = message.replace(/{videoUrl}/g, '');
148
158
  }
159
+ // 过滤空行,保留含有 < 的行(如图片、视频标签)
149
160
  const cleanMessage = message.split('\n').filter(line => line.trim() !== '' || line.includes('<')).join('\n');
150
161
  if (cleanMessage) {
151
162
  await session.send(koishi_1.h.quote(session.messageId) + cleanMessage);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "koishi-plugin-share-links-analysis",
3
3
  "description": "自用插件",
4
4
  "license": "MIT",
5
- "version": "0.1.4",
5
+ "version": "0.1.5",
6
6
  "main": "lib/index.js",
7
7
  "typings": "lib/index.d.ts",
8
8
  "files": [