feat(route): add xuci again #3485 (#15470)

* feat: add xuci again #3485

* chores: follow standard & remove old routes

* Update lib/routes/p-articles/contributors.ts

* Update lib/routes/p-articles/section.ts

* Update lib/routes/p-articles/section.ts

---------
This commit is contained in:
DW 2024-05-06 21:37:40 +09:00 committed by GitHub
parent f86c7377d2
commit 31ded7d292
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 147 additions and 128 deletions

View File

@ -1,45 +0,0 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const url = require('url');
const utils = require('./utils');
const host = 'https://p-articles.com/';
module.exports = async (ctx) => {
const author = ctx.params.author;
const link = `https://p-articles.com/contributors/${author}`;
const response = await got.get(link);
const $ = cheerio.load(response.data);
const list = $('div.contect_box_05in > a')
.map(function () {
const info = {
title: $(this).find('h3').text().trim(),
link: url.resolve(host, $(this).attr('href')),
};
return info;
})
.get();
const out = await Promise.all(
list.map(async (info) => {
const link = info.link;
const cache = await ctx.cache.get(link);
if (cache) {
return JSON.parse(cache);
}
const response = await got.get(link);
return utils.ProcessFeed(ctx, info, response.data);
})
);
ctx.state.data = {
title: `虛詞作者-${author}`,
link,
item: out,
};
};

View File

@ -1,53 +0,0 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const url = require('url');
const utils = require('./utils');
const host = 'https://p-articles.com/';
module.exports = async (ctx) => {
let section_name = ctx.params.section;
section_name = section_name.replace('-', '/');
section_name += '/';
const link = url.resolve(host, section_name);
const response = await got.get(link);
const $ = cheerio.load(response.data);
const top_info = {
title: $('div.inner_top_title_01 > h1 > a').text(),
link: url.resolve(host, $('div.inner_top_title_01 > h1 > a').attr('href')),
};
const list = $('div.contect_box_04 > a')
.map(function () {
const info = {
title: $(this).find('h1').text().trim(),
link: url.resolve(host, $(this).attr('href')),
};
return info;
})
.get();
list.unshift(top_info);
const out = await Promise.all(
list.map(async (info) => {
const link = info.link;
const cache = await ctx.cache.get(link);
if (cache) {
return JSON.parse(cache);
}
const response = await got.get(link);
return utils.ProcessFeed(ctx, info, response.data);
})
);
ctx.state.data = {
title: `虛詞版块-${section_name}`,
link,
item: out,
};
};

View File

@ -1,30 +0,0 @@
const cheerio = require('cheerio');
const { parseRelativeDate } = require('@/utils/parse-date');
const timezone = require('@/utils/timezone');
const ProcessFeed = (ctx, info, data) => {
const title = info.title;
const itemUrl = info.link;
const $ = cheerio.load(data);
const author = $('div.detail_title_02 > h4 > a:nth-child(2)').text().trim();
const date_value = $('div.detail_title_02 > h4 ').text().trim();
const description = $('div.detail_contect_01').html();
const single = {
title,
link: itemUrl,
description,
author,
pubDate: timezone(parseRelativeDate(date_value), 8),
};
ctx.cache.set(itemUrl, JSON.stringify(single));
return Promise.resolve(single);
};
module.exports = {
ProcessFeed,
};

View File

@ -0,0 +1,53 @@
import { Route } from '@/types';
import ofetch from '@/utils/ofetch';
import { load } from 'cheerio';
import cache from '@/utils/cache';
import { rootUrl, ProcessFeed } from './utils';
export const route: Route = {
path: '/contributors/:author',
categories: ['reading'],
example: '/p-articles/contributors/黃衍仁',
parameters: { author: '虛詞作者, 可在作者页面 URL 找到' },
name: '虛詞作者',
maintainers: ['Insomnia1437'],
handler,
radar: [
{
source: ['p-articles.com/contributors/:author'],
},
],
};
async function handler(ctx) {
const authorName: string = ctx.req.param('author');
const authorUrl = new URL(`/contributors/${authorName}`, rootUrl).href;
const response = await ofetch(authorUrl);
const $ = load(response);
const list = $('div.contect_box_05in > a')
.map(function () {
const info = {
title: $(this).find('h3').text().trim(),
link: new URL($(this).attr('href'), rootUrl).href,
};
return info;
})
.get();
const items = await Promise.all(
list.map((info) =>
cache.tryGet(info.link, async () => {
const response = await ofetch(info.link);
// const $ = load(response);
return ProcessFeed(info, response);
})
)
);
return {
title: '虚词 p-articles',
link: authorUrl,
item: items,
language: 'zh-cn',
};
}

View File

@ -0,0 +1,13 @@
import type { Namespace } from '@/types';
export const namespace: Namespace = {
name: '虚词',
url: 'p-articles.com',
description: `
:::tip
p-articles provides some official RSS feeds:
- section: \`https://p-articles.com/section/:section\`
- contributors: \`https://p-articles.com/contributors/:author\`
:::`,
};

View File

@ -0,0 +1,60 @@
import { Route } from '@/types';
import ofetch from '@/utils/ofetch';
import { load } from 'cheerio';
import cache from '@/utils/cache';
import { rootUrl, ProcessFeed } from './utils';
export const route: Route = {
path: '/section/:section',
categories: ['reading'],
example: '/p-articles/section/critics',
parameters: { section: '版块名称, 可在对应版块 URL 中找到, 子版块链接用`-`连接' },
name: '版块',
maintainers: ['Insomnia1437'],
handler,
radar: [
{
source: ['p-articles.com/:section/'],
},
],
};
async function handler(ctx) {
let sectionName: string = ctx.req.param('section');
sectionName = sectionName.replace('-', '/');
sectionName += '/';
const sectionUrl = new URL(sectionName, rootUrl).href;
const response = await ofetch(sectionUrl);
const $ = load(response);
const topInfo = {
title: $('div.inner_top_title_01 > h1 > a').text(),
link: new URL($('div.inner_top_title_01 > h1 > a').prop('href'), rootUrl).href,
};
const list = $('div.contect_box_04 > a')
.map(function () {
const info = {
title: $(this).find('h1').text().trim(),
link: new URL($(this).attr('href'), rootUrl).href,
};
return info;
})
.get();
list.unshift(topInfo);
const items = await Promise.all(
list.map((info) =>
cache.tryGet(info.link, async () => {
const response = await ofetch(info.link);
// const $ = load(response);
return ProcessFeed(info, response);
})
)
);
return {
title: '虚词 p-articles',
link: sectionUrl,
item: items,
language: 'zh-cn',
};
}

View File

@ -0,0 +1,21 @@
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import timezone from '@/utils/timezone';
const rootUrl: string = 'https://p-articles.com';
const ProcessFeed = (info, data) => {
// const $ = cheerio.load(data);
const $ = load(data);
const author = $('div.detail_title_02 > h4 > a:nth-child(2)').text().trim();
info.author = author;
const dateValue = $('div.detail_title_02 > h4 ').text().trim();
info.pubDate = timezone(parseDate(dateValue), +8);
const description = $('div.detail_contect_01').html();
info.description = description;
return info;
};
export { rootUrl, ProcessFeed };