28 lines
812 B
TypeScript
28 lines
812 B
TypeScript
|
|
export function safeHttpUrl(input: string) {
|
||
|
|
try {
|
||
|
|
const url = new URL(input);
|
||
|
|
if (!["http:", "https:"].includes(url.protocol)) return null;
|
||
|
|
return url;
|
||
|
|
} catch {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function extractXhsPublishUrl(input: string) {
|
||
|
|
const candidates =
|
||
|
|
input.match(/https?:\/\/[^\s<>"',。!?;:、【】()]+/gi) ?? [];
|
||
|
|
for (const candidate of candidates) {
|
||
|
|
const cleaned = candidate.replace(/[.,!?;:~)\]}]+$/g, "");
|
||
|
|
const url = safeHttpUrl(cleaned);
|
||
|
|
if (!url) continue;
|
||
|
|
const hostname = url.hostname.toLowerCase();
|
||
|
|
const isXhs =
|
||
|
|
hostname === "xiaohongshu.com" ||
|
||
|
|
hostname.endsWith(".xiaohongshu.com") ||
|
||
|
|
hostname === "xhslink.cn" ||
|
||
|
|
hostname.endsWith(".xhslink.cn");
|
||
|
|
if (isXhs) return url.toString();
|
||
|
|
}
|
||
|
|
return "";
|
||
|
|
}
|