From 0f81550c409d4f0136a85c4a849ab2f6688dbb5e Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 30 Sep 2024 22:55:52 +0800 Subject: [PATCH] fix(route): spankbang use puppeteer (#16968) --- lib/routes/spankbang/new-videos.ts | 72 ++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/lib/routes/spankbang/new-videos.ts b/lib/routes/spankbang/new-videos.ts index 54490e097..1e69748f7 100644 --- a/lib/routes/spankbang/new-videos.ts +++ b/lib/routes/spankbang/new-videos.ts @@ -1,11 +1,13 @@ import { Data, Route } from '@/types'; import { getCurrentPath } from '@/utils/helpers'; -import ofetch from '@/utils/ofetch'; +import puppeteer from '@/utils/puppeteer'; import * as cheerio from 'cheerio'; import { art } from '@/utils/render'; import path from 'node:path'; import { config } from '@/config'; +import logger from '@/utils/logger'; +import cache from '@/utils/cache'; const __dirname = getCurrentPath(import.meta.url); const render = (data) => art(path.join(__dirname, 'templates/video.art'), data); @@ -14,35 +16,58 @@ const handler = async () => { const baseUrl = 'https://spankbang.com'; const link = `${baseUrl}/new_videos/`; - const response = await ofetch(link, { - headers: { - 'User-Agent': config.trueUA, - }, - }); - const $ = cheerio.load(response); + const browser = await puppeteer(); - const items = $('.video-item') - .toArray() - .map((item) => { - const $item = $(item); - const thumb = $item.find('.thumb'); - const cover = $item.find('img.cover'); + const data = await cache.tryGet( + link, + async () => { + const page = await browser.newPage(); + await page.setRequestInterception(true); + page.on('request', (request) => { + request.resourceType() === 'document' ? request.continue() : request.abort(); + }); + logger.http(`Requesting ${link}`); + await page.goto(link, { + waitUntil: 'domcontentloaded', + }); + + const response = await page.content(); + const $ = cheerio.load(response); + + const items = $('.video-item') + .toArray() + .map((item) => { + const $item = $(item); + const thumb = $item.find('.thumb'); + const cover = $item.find('img.cover'); + + return { + title: thumb.attr('title'), + link: new URL(thumb.attr('href')!, baseUrl).href, + description: render({ + cover: cover.data('src'), + preview: cover.data('preview'), + }), + }; + }); return { - title: thumb.attr('title'), - link: new URL(thumb.attr('href')!, baseUrl).href, - description: render({ - cover: cover.data('src'), - preview: cover.data('preview'), - }), + title: $('head title').text(), + description: $('head meta[name="description"]').attr('content'), + item: items, }; - }); + }, + config.cache.routeExpire, + false + ); + + browser.close(); return { - title: $('head title').text(), - description: $('head meta[name="description"]').attr('content'), + title: data.title, + description: data.description, link, - item: items, + item: data.item, } as unknown as Promise; }; @@ -54,6 +79,7 @@ export const route: Route = { maintainers: ['TonyRL'], features: { antiCrawler: true, + requirePuppeteer: true, }, radar: [ {