From 7a36be760e2239b1914a6cdf7ffb946c21bf6f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E7=81=AB=E6=B5=81=E5=85=89?= Date: Wed, 11 Dec 2024 23:18:37 +0800 Subject: [PATCH] feat: add routes (#17792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add routes Signed-off-by: 天火流光 * feat: add routes * revert: "feat: add routes" This reverts commit 0bdbc3b0ee3ce536e6a02d1e8608bc85a19b42c3. * fix: revert * feat: add routes Signed-off-by: 天火流光 * 🐞 fix: Wait page to load Signed-off-by: 天火流光 * fix: improve video description --------- Signed-off-by: 天火流光 --- lib/routes/kuaishou/namespace.ts | 8 +++ lib/routes/kuaishou/profile.ts | 92 ++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 lib/routes/kuaishou/namespace.ts create mode 100644 lib/routes/kuaishou/profile.ts diff --git a/lib/routes/kuaishou/namespace.ts b/lib/routes/kuaishou/namespace.ts new file mode 100644 index 00000000000000..2a784ede648c1e --- /dev/null +++ b/lib/routes/kuaishou/namespace.ts @@ -0,0 +1,8 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '快手', + url: 'kuaishou.com', + categories: ['social-media'], + lang: 'zh-CN', +}; diff --git a/lib/routes/kuaishou/profile.ts b/lib/routes/kuaishou/profile.ts new file mode 100644 index 00000000000000..0f45113f497b80 --- /dev/null +++ b/lib/routes/kuaishou/profile.ts @@ -0,0 +1,92 @@ +import { Route, Data } from '@/types'; +import puppeteer from '@/utils/puppeteer'; +import { config } from '@/config'; +export const route: 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(); + 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 = await res.json(); + if (resData.data.list.length > 0) { + resolve(resData.data); + } else { + if (retryCount > config.requestRetry) { + resolve({}); + } + setTimeout(() => { + page.reload().then(); + retryCount++; + }, 3000); + } + } else if (res.ok() && res.url().includes('/live_api/baseuser/userinfo/byid')) { + // principalId + const resData = await res.json(); + userInfo = resData.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)) as Array; + + await browser.close(); + const data: Data = { + title: userInfo?.name ?? `${principalId}的作品 - 快手`, + // description: JSON.stringify(resData), + item: + resData?.list?.map((item) => ({ + // title: '', + author: item.author.name, + description: ``, + // link: '', + id: item.id, + guid: item.id, + banner: item.poster, + media: { + content: { url: item.playUrl }, + }, + })) || [], + }; + return data; +}