From baa8d99308c2d092ad649971a267345e041396f0 Mon Sep 17 00:00:00 2001 From: pseudoyu Date: Mon, 3 Aug 2026 00:13:38 +0800 Subject: [PATCH] fix(route/foresightnews): fetch API via Playwright Amp-Thread-ID: https://ampcode.com/threads/T-019fc331-8a09-7609-bc48-7ffd887a05d6 Co-authored-by: Amp --- lib/routes/foresightnews/article.ts | 2 +- lib/routes/foresightnews/column.ts | 2 +- lib/routes/foresightnews/index.ts | 8 ++++++++ lib/routes/foresightnews/news.ts | 2 +- lib/routes/foresightnews/util.tsx | 22 +++++++++++++++++++--- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/routes/foresightnews/article.ts b/lib/routes/foresightnews/article.ts index b54a14881..b6146bcd0 100644 --- a/lib/routes/foresightnews/article.ts +++ b/lib/routes/foresightnews/article.ts @@ -9,7 +9,7 @@ export const route: Route = { parameters: {}, features: { requireConfig: false, - requirePuppeteer: false, + requirePuppeteer: true, antiCrawler: false, supportBT: false, supportPodcast: false, diff --git a/lib/routes/foresightnews/column.ts b/lib/routes/foresightnews/column.ts index 094711ed8..950dd2f00 100644 --- a/lib/routes/foresightnews/column.ts +++ b/lib/routes/foresightnews/column.ts @@ -9,7 +9,7 @@ export const route: Route = { parameters: { id: '专栏 id, 可在对应专栏页 URL 中找到' }, features: { requireConfig: false, - requirePuppeteer: false, + requirePuppeteer: true, antiCrawler: false, supportBT: false, supportPodcast: false, diff --git a/lib/routes/foresightnews/index.ts b/lib/routes/foresightnews/index.ts index d4268f484..680136dca 100644 --- a/lib/routes/foresightnews/index.ts +++ b/lib/routes/foresightnews/index.ts @@ -12,6 +12,14 @@ export const route: Route = { target: '', }, ], + features: { + requireConfig: false, + requirePuppeteer: true, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, name: '精选资讯', maintainers: ['nczitzk'], handler, diff --git a/lib/routes/foresightnews/news.ts b/lib/routes/foresightnews/news.ts index 3b0c4bbd5..59eecb430 100644 --- a/lib/routes/foresightnews/news.ts +++ b/lib/routes/foresightnews/news.ts @@ -9,7 +9,7 @@ export const route: Route = { parameters: {}, features: { requireConfig: false, - requirePuppeteer: false, + requirePuppeteer: true, antiCrawler: false, supportBT: false, supportPodcast: false, diff --git a/lib/routes/foresightnews/util.tsx b/lib/routes/foresightnews/util.tsx index c1e6fa69d..649b493ec 100644 --- a/lib/routes/foresightnews/util.tsx +++ b/lib/routes/foresightnews/util.tsx @@ -3,8 +3,8 @@ import zlib from 'node:zlib'; import { raw } from 'hono/html'; import { renderToString } from 'hono/jsx/dom/server'; -import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; +import { getPlaywrightPage } from '@/utils/playwright'; const constants = { labelHot: '热门', @@ -40,9 +40,25 @@ const processItems = async (apiUrl, limit, ...parameters) => { column: '', }; - const { data: response } = await got(apiUrl, { - searchParams, + const requestUrl = new URL(apiUrl); + for (const [key, value] of Object.entries(searchParams)) { + requestUrl.searchParams.set(key, String(value)); + } + + // Cloudflare fingerprints the HTTP client, so browser-like headers alone are insufficient. + const { page, destroy } = await getPlaywrightPage(requestUrl.href, { + onBeforeLoad: async (page) => { + await page.route('**/*', (route) => { + route.request().resourceType() === 'document' ? route.continue() : route.abort(); + }); + }, }); + let response; + try { + response = JSON.parse((await page.textContent('body')) ?? ''); + } finally { + await destroy(); + } const buffer = Buffer.from(response.data?.list ?? response.data, 'base64'); let items = JSON.parse(String(zlib.inflateSync(buffer)));