ChatGPT-Next-Web/scripts/fetch-prompts.mjs

99 lines
2.7 KiB
JavaScript

import fs from 'node:fs/promises';
import fetch from 'node-fetch';
const RAW_FILE_URL = 'https://raw.githubusercontent.com/';
const MIRRORF_FILE_URL = 'http://raw.fgit.ml/';
const RAW_CN_URL = 'PlexPt/awesome-chatgpt-prompts-zh/main/prompts-zh.json';
const CN_URL = MIRRORF_FILE_URL + RAW_CN_URL;
const RAW_TW_URL = 'PlexPt/awesome-chatgpt-prompts-zh/main/prompts-zh-TW.json';
const TW_URL = MIRRORF_FILE_URL + RAW_TW_URL;
const RAW_EN_URL = 'f/awesome-chatgpt-prompts/main/prompts.csv';
const EN_URL = MIRRORF_FILE_URL + RAW_EN_URL;
const FILE = './public/prompts.json';
const ignoreWords = ['涩涩', '魅魔', '澀澀'];
function timeoutPromise(timeout) {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('Request timeout'));
}, timeout);
});
}
async function fetchCN() {
console.log('[Fetch] fetching cn prompts...');
try {
const response = await Promise.race([fetch(CN_URL), timeoutPromise(5000)]);
const raw = await response.json();
return raw
.map(v => [v.act, v.prompt])
.filter(
v =>
v[0]
&& v[1]
&& ignoreWords.every(w => !v[0].includes(w) && !v[1].includes(w)),
);
} catch (error) {
console.error('[Fetch] failed to fetch cn prompts', error);
return [];
}
}
async function fetchTW() {
console.log('[Fetch] fetching tw prompts...');
try {
const response = await Promise.race([fetch(TW_URL), timeoutPromise(5000)]);
const raw = await response.json();
return raw
.map(v => [v.act, v.prompt])
.filter(
v =>
v[0]
&& v[1]
&& ignoreWords.every(w => !v[0].includes(w) && !v[1].includes(w)),
);
} catch (error) {
console.error('[Fetch] failed to fetch tw prompts', error);
return [];
}
}
async function fetchEN() {
console.log('[Fetch] fetching en prompts...');
try {
// const raw = await (await fetch(EN_URL)).text();
const response = await Promise.race([fetch(EN_URL), timeoutPromise(5000)]);
const raw = await response.text();
return raw
.split('\n')
.slice(1)
.map(v =>
v
.split('","')
.map(v => v.replace(/^"|"$/g, '').replaceAll('""', '"'))
.filter(v => v[0] && v[1]),
);
} catch (error) {
console.error('[Fetch] failed to fetch en prompts', error);
return [];
}
}
async function main() {
Promise.all([fetchCN(), fetchTW(), fetchEN()])
.then(([cn, tw, en]) => {
fs.writeFile(FILE, JSON.stringify({ cn, tw, en }));
})
.catch((e) => {
console.error('[Fetch] failed to fetch prompts');
fs.writeFile(FILE, JSON.stringify({ cn: [], tw: [], en: [] }));
})
.finally(() => {
console.log(`[Fetch] saved to ${FILE}`);
});
}
main();