UNPKG

rsshub

Version:
89 lines (87 loc) 2.85 kB
import { t as config } from "./config-MQ-7ebJ_.mjs"; import "./logger-C4avouvV.mjs"; import { t as parseDate } from "./parse-date-r5WDWHno.mjs"; import "./is-worker-DESPicPc.mjs"; import { t as cache_default } from "./cache-SV6W5EPy.mjs"; import "./proxy-CjvoY5ys.mjs"; import { n as puppeteer_default } from "./puppeteer-9J9JS5H4.mjs"; import { n as queryToBoolean } from "./readable-social-CExV9fL0.mjs"; import { t as renderUserEmbed } from "./user-DfAY9w9w.mjs"; import { load } from "cheerio"; //#region lib/routes/tiktok/user.ts const baseUrl = "https://www.tiktok.com"; const route = { path: "/user/:user/:iframe?", categories: ["social-media"], example: "/tiktok/user/@linustech/true", parameters: { user: "User ID, including @", iframe: "Use the official iframe to embed the video, which allows you to view the video if the default option does not work. Default to `false`" }, features: { requireConfig: false, requirePuppeteer: true, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["www.tiktok.com/:user"], target: "/user/:user" }], name: "User", maintainers: ["TonyRL"], handler }; async function handler(ctx) { const { user, iframe } = ctx.req.param(); const useIframe = queryToBoolean(iframe); const { itemList, userDetail } = await cache_default.tryGet(`tiktok:user:${user}`, async () => { const browser = await puppeteer_default(); const page = await browser.newPage(); await page.setRequestInterception(true); let itemList = { itemList: [] }; page.on("request", (request) => { [ "document", "script", "xhr", "fetch" ].includes(request.resourceType()) ? request.continue() : request.abort(); }); page.on("response", async (response) => { if (response.request().url().startsWith("https://www.tiktok.com/api/post/item_list/")) itemList = await response.json(); }); await page.goto(`${baseUrl}/${user}`, { waitUntil: "networkidle0" }); const pageHtml = await page.content(); await browser.close(); const $ = load(pageHtml); const userDetail = JSON.parse($("script#__UNIVERSAL_DATA_FOR_REHYDRATION__").text()).__DEFAULT_SCOPE__["webapp.user-detail"]; return { itemList, userDetail }; }, config.cache.routeExpire, false); const items = itemList.itemList.map((item) => ({ title: item.desc, description: renderUserEmbed({ poster: item.video.cover, source: item.video.playAddr, useIframe, id: item.id }), author: item.author.nickname, pubDate: parseDate(item.createTime, "X"), link: `${baseUrl}/@${item.author.uniqueId}/video/${item.id}` })); return { title: userDetail.shareMeta.title, description: userDetail.shareMeta.desc, image: userDetail.userInfo.user.avatarLarger, link: `${baseUrl}/${user}`, item: items }; } //#endregion export { route };