UNPKG

rsshub

Version:
140 lines (138 loc) 7.74 kB
import { t as config } from "./config-CCmw1BNE.mjs"; import { t as logger } from "./logger-BKy98Y8B.mjs"; import { t as got_default } from "./got-BTowW50G.mjs"; import { t as ConfigNotFoundError } from "./config-not-found-fQ5mxvDU.mjs"; import { n as queryToBoolean, t as fallback } from "./readable-social-DP5kGwF5.mjs"; import { r as utils_default } from "./utils-B3AeRQdV.mjs"; import { t as cache_default } from "./cache-BN4NpNc7.mjs"; import JSONbig from "json-bigint"; import querystring from "node:querystring"; //#region lib/routes/bilibili/followings-dynamic.ts const route = { path: "/followings/dynamic/:uid/:routeParams?", categories: ["social-media"], example: "/bilibili/followings/dynamic/109937383", parameters: { uid: "用户 id, 可在 UP 主主页中找到", routeParams: ` | 键 | 含义 | 接受的值 | 默认值 | | ---------- | --------------------------------- | -------------- | ------ | | showEmoji | 显示或隐藏表情图片 | 0/1/true/false | false | | embed | 默认开启内嵌视频 | 0/1/true/false | true | | useAvid | 视频链接使用 AV 号 (默认为 BV 号) | 0/1/true/false | false | | directLink | 使用内容直链 | 0/1/true/false | false | | hideGoods | 隐藏带货动态 | 0/1/true/false | false | 用例:\`/bilibili/followings/dynamic/2267573/showEmoji=1&embed=0&useAvid=1\`` }, features: { requireConfig: [{ name: "BILIBILI_COOKIE_*", description: `BILIBILI_COOKIE_{uid}: 用于用户关注动态系列路由,对应 uid 的 b 站用户登录后的 Cookie 值,\`{uid}\` 替换为 uid,如 \`BILIBILI_COOKIE_2267573\`,获取方式: 1. 打开 [https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=0&type=8](https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=0&type=8) 2. 打开控制台,切换到 Network 面板,刷新 3. 点击 dynamic_new 请求,找到 Cookie 4. 复制整段 Cookie,删掉其中的 \`bili_ticket\` 和 \`bili_ticket_expires\` 字段来延长有效期` }], requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, name: "用户关注动态", maintainers: ["TigerCubDen", "JimenezLi"], handler, description: `::: warning 用户动态需要 b 站登录后的 Cookie 值,所以只能自建,详情见部署页面的配置模块。 :::` }; async function handler(ctx) { const uid = String(ctx.req.param("uid")); const routeParams = querystring.parse(ctx.req.param("routeParams")); const showEmoji = fallback(void 0, queryToBoolean(routeParams.showEmoji), false); const embed = fallback(void 0, queryToBoolean(routeParams.embed), true); const displayArticle = fallback(void 0, queryToBoolean(routeParams.displayArticle), false); const name = await cache_default.getUsernameFromUID(uid); const cookie = config.bilibili.cookies[uid]; if (cookie === void 0) throw new ConfigNotFoundError("缺少对应 uid 的 Bilibili 用户登录后的 Cookie 值"); const response = await got_default({ method: "get", url: `https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${uid}&type_list=268435455`, headers: { Referer: `https://space.bilibili.com/${uid}/`, Cookie: cookie } }); if (response.data.code === -6) throw new ConfigNotFoundError("对应 uid 的 Bilibili 用户的 Cookie 已过期"); if (response.data.code === 41e5) throw new ConfigNotFoundError("对应 uid 的 Bilibili 用户 请求失败"); const data = JSONbig.parse(response.body).data.cards; const getTitle = (data) => data ? data.title || data.description || data.content || data.vest && data.vest.content || "" : ""; const getDes = (data) => data.dynamic || data.desc || data.description || data.content || data.summary || (data.vest && data.vest.content) + (data.sketch && `<br>${data.sketch.title}<br>${data.sketch.desc_text}`) || data.intro || ""; const getOriginDes = (data) => data && (data.apiSeasonInfo && data.apiSeasonInfo.title && `//转发自: ${data.apiSeasonInfo.title}`) + (data.index_title && `<br>${data.index_title}`) || ""; const getOriginName = (data) => data.uname || data.author && data.author.name || data.upper && data.upper.name || data.user && (data.user.uname || data.user.name) || data.owner && data.owner.name || ""; const getOriginTitle = (data) => data.title ? `${data.title}<br>` : ""; const getIframe = (data) => { if (!embed) return ""; const aid = data?.aid; const bvid = data?.bvid; if (aid === void 0 && bvid === void 0) return ""; return utils_default.renderUGCDescription(embed, "", "", aid, void 0, bvid); }; const getImgs = (data) => { let imgs = ""; if (data.pictures) for (const pic of data.pictures) imgs += `<img src="${pic.img_src}">`; if (data.image_urls) for (const url of data.image_urls) imgs += `<img src="${url}">`; if (data.pic) imgs += `<img src="${data.pic}">`; if (data.cover && data.cover.unclipped) imgs += `<img src="${data.cover.unclipped}">`; else if (data.cover) imgs += `<img src="${data.cover}">`; if (data.sketch && data.sketch.cover_url) imgs += `<img src="${data.sketch.cover_url}">`; return imgs; }; const items = await Promise.all(data.map(async (item) => { const parsed = JSONbig.parse(item.card); const data = parsed.apiSeasonInfo || (getTitle(parsed.item) ? parsed.item : parsed); let origin = parsed.origin; if (origin) try { origin = JSONbig.parse(origin); } catch { logger.warn(`card.origin '${origin}' is not falsy-valued or a JSON string, fall back to unparsed value`); } let imgHTML = ""; imgHTML += getImgs(data); if (origin) imgHTML += getImgs(origin.item || origin); let videoHTML = ""; if (data.video_playurl) videoHTML += `<video width="${data.width}" height="${data.height}" controls><source src="${unescape(data.video_playurl).replace(/^http:/, "https:")}"><source src="${unescape(data.video_playurl)}"></video>`; let link = ""; if (data.dynamic_id) link = `https://t.bilibili.com/${data.dynamic_id}`; else if (item.desc?.dynamic_id) link = `https://t.bilibili.com/${item.desc.dynamic_id}`; let data_content = getDes(data); if (item.display && item.display.emoji_info && showEmoji) { const emoji = item.display.emoji_info.emoji_details; for (const item of emoji) data_content = data_content.replaceAll(new RegExp(`\\${item.text}`, "g"), () => `<img alt="${item.text}" src="${item.url}"style="margin: -1px 1px 0px; display: inline-block; width: 20px; height: 20px; vertical-align: text-bottom;" title="">`); } let author = ""; if (item.desc?.user_profile) author = item.desc.user_profile.info.uname; if (data.image_urls && displayArticle) data_content = (await cache_default.getArticleDataFromCvid(data.id, uid)).description; return { title: getTitle(data), author, description: (() => { const description = parsed.new_desc || data_content || getDes(data); const originName = origin && getOriginName(origin) ? `<br><br>//转发自: @${getOriginName(origin)}: ${getOriginTitle(origin.item || origin)}${getDes(origin.item || origin)}` : getOriginDes(origin); const imgHTMLSource = imgHTML ? `<br>${imgHTML}` : ""; const videoHTMLSource = videoHTML ? `<br>${videoHTML}` : ""; return `${description}${originName}${getIframe(data)}${getIframe(origin)}${imgHTMLSource}${videoHTMLSource}`; })(), pubDate: (/* @__PURE__ */ new Date(item.desc?.timestamp * 1e3)).toUTCString(), link }; })); return { title: `${name} 关注的动态`, link: "https://t.bilibili.com", description: `${name} 关注的动态`, item: items }; } //#endregion export { route };