rsshub
Version:
Make RSS Great Again!
72 lines (70 loc) • 2.48 kB
JavaScript
import { t as config } from "./config-C37vj7VH.mjs";
import "./logger-Czu8UMNd.mjs";
import "./proxy-Db7uGcYb.mjs";
import { n as puppeteer_default } from "./puppeteer-DGmvuGvT.mjs";
//#region lib/routes/kuaishou/profile.ts
const route = {
name: "Profile",
path: "/profile/:principalId",
radar: [{
source: ["kuaishou.com/profile/:principalId"],
target: "/profile/:principalId"
}],
parameters: { principalId: "用户 id, 可在主页中找到" },
example: "/kuaishou/profile/3xk46q9cdnvgife",
maintainers: ["GuoChen-thlg"],
url: "kuaishou.com/profile/:principalId",
description: `::: tip
The profile page of the user, which contains the user's information, videos, and other information.
:::`,
handler
};
async function handler(ctx) {
const { principalId } = ctx.req.param();
const browser = await puppeteer_default();
const page = await browser.newPage();
let retryCount = 0;
let resolve;
let userInfo;
const promise = new Promise((res) => {
resolve = res;
});
await page.setRequestInterception(true);
page.on("request", (req) => {
const resourceType = req.resourceType();
if (resourceType === "image" || resourceType === "media" || resourceType === "font" || resourceType === "stylesheet" || resourceType === "ping") req.abort();
else req.continue();
});
page.on("response", async (res) => {
if (res.ok() && res.url().includes("/live_api/profile/public")) {
const resData$1 = await res.json();
if (resData$1.data.list.length > 0) resolve(resData$1.data);
else {
if (retryCount > config.requestRetry) resolve({});
setTimeout(() => {
page.reload().then();
retryCount++;
}, 3e3);
}
} else if (res.ok() && res.url().includes("/live_api/baseuser/userinfo/byid")) userInfo = (await res.json()).data.userInfo;
});
await page.goto("https://www.kuaishou.com", { waitUntil: "domcontentloaded" });
await page.goto(`https://live.kuaishou.com/profile/${principalId}`);
const resData = await promise.catch((error) => error);
await browser.close();
return {
title: userInfo?.name ?? `${principalId}的作品 - 快手`,
item: resData?.list?.map((item) => ({
author: item.author.name,
description: `<video controls preload="metadata" poster="${item.poster}">
<source src="${item.playUrl}" type="video/mp4">
</video>`,
id: item.id,
guid: item.id,
banner: item.poster,
media: { content: { url: item.playUrl } }
})) || []
};
}
//#endregion
export { route };