rsshub
Version:
Make RSS Great Again!
89 lines (73 loc) • 2.46 kB
text/typescript
import { Route } from '@/types';
import puppeteer from '@/utils/puppeteer';
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import timezone from '@/utils/timezone';
import { Context } from 'hono';
import logger from '@/utils/logger';
const domain = 'www.colamanga.com';
export const route: Route = {
path: '/:id',
parameters: { id: '漫画id' },
name: 'Manga',
maintainers: ['machsix'],
example: '/colamanga/manga-qq978758',
categories: ['anime'],
radar: [
{
source: [`${domain}/:id/`],
target: '/:id',
},
],
features: {
requireConfig: false,
requirePuppeteer: true,
antiCrawler: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
handler,
};
function shift_date(date, days) {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
async function handler(ctx: Context) {
const id = ctx.req.param('id');
const url = `https://${domain}/${id}`;
const browser = await puppeteer();
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', (request) => {
request.resourceType() === 'document' ? request.continue() : request.abort();
});
logger.http(`Requesting ${url}`);
await page.goto(url, {
// 指定页面等待载入的时间
waitUntil: 'domcontentloaded',
});
const response = await page.content();
await browser.close();
const $ = load(response);
const book_name = $("meta[property='og:comic:book_name']").attr('content');
const updateDateAttr = $("meta[property='og:comic:update_time']").attr('content');
const updateDate = updateDateAttr ? timezone(parseDate(updateDateAttr)) : timezone(new Date());
const author = $("span:contains('作者')").parent().contents().eq(1).text();
// const cover = $(".fed-deta-images a").attr('data-original');
const items = $('.all_data_list >ul>li>a')
.toArray()
.map((elem, i) => ({
title: `${book_name} ${$(elem).text()}`,
link: elem.attribs.href,
description: $('.fed-part-esan').text(),
author,
pubDate: shift_date(updateDate, -7 * i),
}));
return {
title: book_name || 'Unknown Manga',
link: url,
item: items,
};
}