From ab172e3d77de97a13453890c98d040160b4ef0c9 Mon Sep 17 00:00:00 2001 From: MikiVL Date: Tue, 5 May 2026 04:02:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=89=E4=B8=AA=20bug?= =?UTF-8?q?=EF=BC=9A=E6=B8=85=E7=90=86=20API=20=E5=93=8D=E5=BA=94=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=20null=20=E5=AD=97=E6=AE=B5=E3=80=81=E6=94=B9?= =?UTF-8?q?=E7=94=A8=20Google=20Translate=20=E6=8F=90=E5=8D=87=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E8=B4=A8=E9=87=8F=E3=80=81=E8=BF=87=E6=BB=A4=20README?= =?UTF-8?q?=20=E4=B8=AD=E7=9A=84=E5=88=86=E9=9A=94=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/routes/repos.js | 3 ++- backend/src/scraper.js | 3 ++- backend/src/translate.js | 26 +++++++++++++++----------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/backend/src/routes/repos.js b/backend/src/routes/repos.js index 6ce62d6..e26656a 100644 --- a/backend/src/routes/repos.js +++ b/backend/src/routes/repos.js @@ -9,7 +9,8 @@ function computeDaysUntilDeletion(row) { } function formatRepo(row) { - return { ...row, days_until_deletion: computeDaysUntilDeletion(row) }; + const { scraped_at, is_today, ...rest } = row; + return { ...rest, days_until_deletion: computeDaysUntilDeletion(row) }; } function getRepos(req, res) { diff --git a/backend/src/scraper.js b/backend/src/scraper.js index 9b764b1..ebe4ed5 100644 --- a/backend/src/scraper.js +++ b/backend/src/scraper.js @@ -89,13 +89,14 @@ function extractFeaturesSection(readme, description) { if (result && result.length > 20) return result; } - // 兜底:取README正文第一段有意义的文字(跳过徽章行) + // 兜底:取README正文第一段有意义的文字(跳过徽章行和分隔线) const lines = readme.split('\n'); const paragraphs = []; for (const line of lines) { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!') || trimmed.startsWith('[!') || trimmed.startsWith('<')) continue; if (trimmed.startsWith('[![') || trimmed.match(/^\[!\[/)) continue; + if (/^[-=]{3,}$/.test(trimmed)) continue; if (trimmed.length > 40) paragraphs.push(trimmed); if (paragraphs.length >= 3) break; } diff --git a/backend/src/translate.js b/backend/src/translate.js index 7618a0c..ac1cadd 100644 --- a/backend/src/translate.js +++ b/backend/src/translate.js @@ -6,8 +6,8 @@ const HTML_TAG_RE = /<[^>]{1,100}>/g; function cleanText(text) { if (!text) return text; return text - .replace(HTML_TAG_RE, ' ') // 去除 HTML 标签 - .replace(/&[a-z]+;/gi, ' ') // 去除 HTML 实体 + .replace(HTML_TAG_RE, ' ') + .replace(/&[a-z]+;/gi, ' ') .replace(/\s+/g, ' ') .trim(); } @@ -15,21 +15,25 @@ function cleanText(text) { async function translate(text) { const cleaned = cleanText(text); if (!cleaned || cleaned.length < 5) return cleaned || text; - if (CJK_RE.test(cleaned)) return cleaned; // 已含中文,跳过 + if (CJK_RE.test(cleaned)) return cleaned; try { - const res = await axios.get('https://api.mymemory.translated.net/get', { - params: { q: cleaned.slice(0, 500), langpair: 'en|zh-CN' }, - headers: { 'User-Agent': 'github-trending-app/1.0' }, + const res = await axios.get('https://translate.googleapis.com/translate_a/single', { + params: { + client: 'gtx', + sl: 'en', + tl: 'zh-CN', + dt: 't', + q: cleaned.slice(0, 500), + }, + headers: { 'User-Agent': 'Mozilla/5.0' }, timeout: 10000, }); - const translated = res.data?.responseData?.translatedText; - if (!translated || translated === cleaned || translated.startsWith('PLEASE SELECT')) { - return cleaned; - } + const translated = res.data?.[0]?.map(s => s?.[0]).filter(Boolean).join(''); + if (!translated || translated === cleaned) return cleaned; return translated.trim(); } catch { - return cleaned; // 失败静默降级,返回清理后原文 + return cleaned; } }