Skip to content

Commit

Permalink
feat: add routes (DIYgod#17792)
Browse files Browse the repository at this point in the history
* feat: add routes

Signed-off-by: 天火流光 <[email protected]>

* feat: add routes

* revert: "feat: add routes"

This reverts commit 0bdbc3b.

* fix: revert

* feat: add routes

Signed-off-by: 天火流光 <[email protected]>

* 🐞 fix: Wait  page to load

Signed-off-by: 天火流光 <[email protected]>

* fix: improve video description

---------

Signed-off-by: 天火流光 <[email protected]>
  • Loading branch information
GuoChen-thlg authored Dec 11, 2024
1 parent 936045a commit 7a36be7
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/routes/kuaishou/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { Namespace } from '@/types';

export const namespace: Namespace = {
name: '快手',
url: 'kuaishou.com',
categories: ['social-media'],
lang: 'zh-CN',
};
92 changes: 92 additions & 0 deletions lib/routes/kuaishou/profile.ts
Original file line number Diff line number Diff line change
@@ -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<any>;

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: `<video controls preload="metadata" poster="${item.poster}">
<source src="${item.playUrl}" type="video/mp4">
</video>`,
// link: '',
id: item.id,
guid: item.id,
banner: item.poster,
media: {
content: { url: item.playUrl },
},
})) || [],
};
return data;
}

0 comments on commit 7a36be7

Please sign in to comment.