UNPKG

rsshub

Version:
72 lines (70 loc) 2.48 kB
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 };