rsshub
Version:
Make RSS Great Again!
156 lines (153 loc) • 4.59 kB
JavaScript
import "./types-DNj6Etbg.mjs";
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { t as cache_default } from "./cache-BkqOokyU.mjs";
import { t as got_default } from "./got-BTowW50G.mjs";
import { t as InvalidParameterError } from "./invalid-parameter-CGxhjomn.mjs";
import { load } from "cheerio";
//#region lib/routes/acfun/article.ts
const baseUrl = "https://www.acfun.cn";
const categoryMap = {
184: {
title: "二次元画师",
realmId: "realmId=18&realmId=14&realmId=51"
},
110: {
title: "综合",
realmId: "realmId=5&realmId=22&realmId=28&realmId=3&realmId=4"
},
73: {
title: "生活情感",
realmId: "realmId=50&realmId=25&realmId=34&realmId=7&realmId=6&realmId=17&realmId=1&realmId=2&realmId=49"
},
164: {
title: "游戏",
realmId: "realmId=8&realmId=53&realmId=52&realmId=11&realmId=43&realmId=44&realmId=45&realmId=46&realmId=47"
},
74: {
title: "动漫文化",
realmId: "realmId=13&realmId=31&realmId=48"
},
75: {
title: "漫画文学",
realmId: "realmId=15&realmId=23&realmId=16"
}
};
const sortTypeEnum = /* @__PURE__ */ new Set([
"createTime",
"lastCommentTime",
"hotScore"
]);
const timeRangeEnum = /* @__PURE__ */ new Set([
"all",
"oneDay",
"threeDay",
"oneWeek",
"oneMonth"
]);
const route = {
path: "/article/:categoryId/:sortType?/:timeRange?",
categories: ["anime"],
view: 0,
example: "/acfun/article/110",
parameters: {
categoryId: {
description: "分区 ID",
options: Object.entries(categoryMap).map(([id, value]) => ({
value: id,
label: value.title
}))
},
sortType: {
description: "排序",
options: [
{
value: "createTime",
label: "最新发表"
},
{
value: "lastCommentTime",
label: "最新动态"
},
{
value: "hotScore",
label: "最热文章"
}
],
default: "createTime"
},
timeRange: {
description: "时间范围,仅在排序是 `hotScore` 有效",
options: [
{
value: "all",
label: "时间不限"
},
{
value: "oneDay",
label: "24 小时"
},
{
value: "threeDay",
label: "三天"
},
{
value: "oneWeek",
label: "一周"
},
{
value: "oneMonth",
label: "一个月"
}
],
default: "all"
}
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
name: "文章",
maintainers: ["TonyRL"],
handler,
description: `| 二次元画师 | 综合 | 生活情感 | 游戏 | 动漫文化 | 漫画文学 |
| ---------- | ---- | -------- | ---- | -------- | -------- |
| 184 | 110 | 73 | 164 | 74 | 75 |
| 最新发表 | 最新动态 | 最热文章 |
| ---------- | --------------- | -------- |
| createTime | lastCommentTime | hotScore |
| 时间不限 | 24 小时 | 三天 | 一周 | 一个月 |
| -------- | ------- | -------- | ------- | -------- |
| all | oneDay | threeDay | oneWeek | oneMonth |`
};
async function handler(ctx) {
const { categoryId, sortType = "createTime", timeRange = "all" } = ctx.req.param();
if (!Object.hasOwn(categoryMap, categoryId)) throw new InvalidParameterError(`Invalid category Id: ${categoryId}`);
if (!sortTypeEnum.has(sortType)) throw new InvalidParameterError(`Invalid sort type: ${sortType}`);
if (!timeRangeEnum.has(timeRange)) throw new InvalidParameterError(`Invalid time range: ${timeRange}`);
const url = `${baseUrl}/v/list${categoryId}/index.htm`;
const list = (await got_default.post(`${baseUrl}/rest/pc-direct/article/feed?cursor=first_page&onlyOriginal=false&limit=10&sortType=${sortType}&timeRange=${sortType === "hotScore" ? timeRange : "all"}&${categoryMap[categoryId].realmId}`, { headers: { referer: url } })).data.data.map((item) => ({
title: item.title,
link: `${baseUrl}/a/ac${item.articleId}`,
author: item.userName,
pubDate: parseDate(item.createTime, "x"),
category: item.realmName
}));
const items = await Promise.all(list.map((item) => cache_default.tryGet(item.link, async () => {
const articleInfo = load((await got_default(item.link, { headers: { referer: url } })).data)(".main script").text().match(/window.articleInfo = (.*);\n\s*window.likeDomain/)[1];
const data = JSON.parse(articleInfo);
item.description = data.parts[0].content;
if (data.tagList) item.category = [item.category, ...data.tagList.map((tag) => tag.name)];
return item;
})));
return {
title: categoryMap[categoryId].title,
link: url,
item: items
};
}
//#endregion
export { route };