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.
- package/lib/index.js +18 -7
- 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, '<')
|
|
122
|
+
.replace(/>/g, '>')
|
|
123
|
+
.replace(/"/g, '"')
|
|
124
|
+
.replace(/'/g, ''');
|
|
125
|
+
}
|
|
117
126
|
async function sendResult(session, config, result, logger) {
|
|
118
127
|
let message = config.format;
|
|
119
|
-
|
|
120
|
-
message = message.replace(/{
|
|
121
|
-
message = message.replace(/{
|
|
122
|
-
message = message.replace(/{
|
|
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);
|