rsshub
Version:
Make RSS Great Again!
84 lines (80 loc) • 2.95 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import { t as ViewType } from "./types-D84BRIt4.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import "./helpers-DxBp0Pty.mjs";
import "./render-BQo6B4tL.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import { t as invalid_parameter_default } from "./invalid-parameter-rr4AgGpp.mjs";
import { t as isValidHost } from "./valid-host-C-u5eW3j.mjs";
import { n as extractWork, t as extractArticle } from "./utils-CLfIncli.mjs";
import { load } from "cheerio";
//#region lib/routes/zcool/user.ts
const route = {
path: "/user/:uid",
categories: ["design"],
view: ViewType.Pictures,
example: "/zcool/user/baiyong",
parameters: { uid: "个性域名前缀或者用户ID" },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{
source: ["www.zcool.com.cn/u/:id"],
target: "/user/:id"
}],
name: "用户作品",
description: ` 例如:
站酷的个人主页 \`https://baiyong.zcool.com.cn\` 对应 rss 路径 \`/zcool/user/baiyong\`
站酷的个人主页 \`https://www.zcool.com.cn/u/568339\` 对应 rss 路径 \`/zcool/user/568339\``,
maintainers: ["junbaor"],
handler
};
async function handler(ctx) {
const uid = ctx.req.param("uid");
let pageUrl = `https://www.zcool.com.cn/u/${uid}`;
if (Number.isNaN(uid)) {
if (!isValidHost(uid)) throw new invalid_parameter_default("Invalid uid");
pageUrl = `https://${uid}.zcool.com.cn`;
}
const { data: response } = await got_default(pageUrl);
const $ = load(response);
const data = JSON.parse($("script#__NEXT_DATA__").text());
const workList = data.props.pageProps.workList.map((item) => ({
title: item.title,
link: item.pageUrl,
pubDate: parseDate(item.publishTime, "x"),
category: [
item.objectTypeStr,
item.cateStr,
item.subCateStr,
...item.tags
]
}));
const items = await Promise.all(workList.map((item) => cache_default.tryGet(item.link, async () => {
const { data: response$1 } = await got_default(item.link);
const $$1 = load(response$1);
const data$1 = JSON.parse($$1("script#__NEXT_DATA__").text());
if (item.link.startsWith("https://www.zcool.com.cn/article/")) item.description = extractArticle(data$1);
else if (item.link.startsWith("https://www.zcool.com.cn/work/")) item.description = extractWork(data$1);
return item;
})));
return {
title: data.props.pageProps.seo.title,
description: data.props.pageProps.seo.description,
image: data.props.pageProps.userInfo.avatar.includes("?x-oss-process") ? data.props.pageProps.userInfo.avatar.split("?")[0] : data.props.pageProps.userInfo.avatar,
link: pageUrl,
item: items
};
}
//#endregion
export { route };