fix(route): spankbang use puppeteer (#16968)
This commit is contained in:
parent
d9ee8f4361
commit
0f81550c40
|
|
@ -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<Data>;
|
||||
};
|
||||
|
||||
|
|
@ -54,6 +79,7 @@ export const route: Route = {
|
|||
maintainers: ['TonyRL'],
|
||||
features: {
|
||||
antiCrawler: true,
|
||||
requirePuppeteer: true,
|
||||
},
|
||||
radar: [
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue