fix(route/foresightnews): fetch API via Playwright

Amp-Thread-ID: https://ampcode.com/threads/T-019fc331-8a09-7609-bc48-7ffd887a05d6
Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
pseudoyu 2026-08-03 00:13:38 +08:00
parent ec501c4e4e
commit baa8d99308
No known key found for this signature in database
5 changed files with 30 additions and 6 deletions

View File

@ -9,7 +9,7 @@ export const route: Route = {
parameters: {},
features: {
requireConfig: false,
requirePuppeteer: false,
requirePuppeteer: true,
antiCrawler: false,
supportBT: false,
supportPodcast: false,

View File

@ -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,

View File

@ -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,

View File

@ -9,7 +9,7 @@ export const route: Route = {
parameters: {},
features: {
requireConfig: false,
requirePuppeteer: false,
requirePuppeteer: true,
antiCrawler: false,
supportBT: false,
supportPodcast: false,

View File

@ -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)));