feat: 重构数据源配置并优化日报生成流程

重构数据源配置,合并多个新闻源为聚合源,简化配置参数
新增广告插入功能和日报页面直接生成功能
优化时区处理为东八区并改进摘要生成提示词
移除不必要的翻译功能并更新相关依赖项
This commit is contained in:
justlovemaki
2025-08-07 16:55:00 +08:00
parent 2000d43058
commit 2834d7886c
16 changed files with 465 additions and 157 deletions

View File

@@ -1,6 +1,4 @@
import { getRandomUserAgent, sleep, isDateWithinLastDays, stripHtml, formatDateToChineseWithTime, escapeHtml} from '../helpers';
import { callChatAPI } from '../chatapi.js';
import { removeMarkdownCodeBlock } from '../helpers.js';
const RedditDataSource = {
async fetch(env, foloCookie) {
@@ -107,61 +105,11 @@ const RedditDataSource = {
return redditData;
}
if (!env.OPEN_TRANSLATE === "true") {
console.warn("Skipping reddit translations.");
redditData.items = redditData.items.map(item => ({
...item,
title_zh: item.title || ""
}));
return redditData;
}
const itemsToTranslate = redditData.items.map((item, index) => ({
id: index,
original_title: item.title || ""
redditData.items = redditData.items.map(item => ({
...item,
title_zh: item.title || ""
}));
const hasContentToTranslate = itemsToTranslate.some(item => item.original_title.trim() !== "");
if (!hasContentToTranslate) {
console.log("No non-empty reddit titles to translate for today's posts.");
redditData.items = redditData.items.map(item => ({ ...item, title_zh: item.title || "" }));
return redditData;
}
const promptText = `You will be given a JSON array of reddit data objects. Each object has an "id" and "original_title".
Translate "original_title" into Chinese.
Return a JSON array of objects. Each output object MUST have:
- "id": The same id from the input.
- "title_zh": Chinese translation of "original_title". Empty if original is empty.
Input: ${JSON.stringify(itemsToTranslate)}
Respond ONLY with the JSON array.`;
let translatedItemsMap = new Map();
try {
console.log(`Requesting translation for ${itemsToTranslate.length} reddit titles for today.`);
const chatResponse = await callChatAPI(env, promptText);
const parsedTranslations = JSON.parse(removeMarkdownCodeBlock(chatResponse));
if (parsedTranslations) {
parsedTranslations.forEach(translatedItem => {
if (translatedItem && typeof translatedItem.id === 'number' &&
typeof translatedItem.title_zh === 'string') {
translatedItemsMap.set(translatedItem.id, translatedItem);
}
});
}
} catch (translationError) {
console.error("Failed to translate reddit titles in batch:", translationError.message);
}
redditData.items = redditData.items.map((originalItem, index) => {
const translatedData = translatedItemsMap.get(index);
return {
...originalItem,
title_zh: translatedData ? translatedData.title_zh : (originalItem.title || "")
};
});
return redditData;
},
@@ -174,7 +122,7 @@ Respond ONLY with the JSON array.`;
id: item.id,
type: sourceType,
url: item.url,
title: item.title_zh || item.title, // Use translated title if available
title: item.title,
description: stripHtml(item.content_html || ""),
published_date: item.date_published,
authors: item.authors ? item.authors.map(author => author.name).join(', ') : 'Unknown',