rsshub
Version:
Make RSS Great Again!
150 lines (147 loc) • 8.29 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import { t as config } from "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import { t as logger_default } from "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import "./md5-C8GRvctM.mjs";
import "./cache-Bo__VnGm.mjs";
import "./helpers-DxBp0Pty.mjs";
import "./render-BQo6B4tL.mjs";
import "./proxy-Db7uGcYb.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs";
import "./puppeteer-DGmvuGvT.mjs";
import { n as queryToBoolean, t as fallback } from "./readable-social-DoIL4WB3.mjs";
import { r as utils_default } from "./utils-XRYoJEu4.mjs";
import { t as cache_default } from "./cache-COvn8_4R.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. 视频和专栏,UP 主粉丝及关注只要求 \`SESSDATA\` 字段,动态需复制整段 Cookie`
}],
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 config_not_found_default("缺少对应 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 config_not_found_default("对应 uid 的 Bilibili 用户的 Cookie 已过期");
if (response.data.code === 41e5) throw new config_not_found_default("对应 uid 的 Bilibili 用户 请求失败");
const data = JSONbig.parse(response.body).data.cards;
const getTitle = (data$1) => data$1 ? data$1.title || data$1.description || data$1.content || data$1.vest && data$1.vest.content || "" : "";
const getDes = (data$1) => data$1.dynamic || data$1.desc || data$1.description || data$1.content || data$1.summary || (data$1.vest && data$1.vest.content) + (data$1.sketch && `<br>${data$1.sketch.title}<br>${data$1.sketch.desc_text}`) || data$1.intro || "";
const getOriginDes = (data$1) => data$1 && (data$1.apiSeasonInfo && data$1.apiSeasonInfo.title && `//转发自: ${data$1.apiSeasonInfo.title}`) + (data$1.index_title && `<br>${data$1.index_title}`) || "";
const getOriginName = (data$1) => data$1.uname || data$1.author && data$1.author.name || data$1.upper && data$1.upper.name || data$1.user && (data$1.user.uname || data$1.user.name) || data$1.owner && data$1.owner.name || "";
const getOriginTitle = (data$1) => data$1.title ? `${data$1.title}<br>` : "";
const getIframe = (data$1) => {
if (!embed) return "";
const aid = data$1?.aid;
const bvid = data$1?.bvid;
if (aid === void 0 && bvid === void 0) return "";
return utils_default.renderUGCDescription(embed, "", "", aid, void 0, bvid);
};
const getImgs = (data$1) => {
let imgs = "";
if (data$1.pictures) for (let i = 0; i < data$1.pictures.length; i++) imgs += `<img src="${data$1.pictures[i].img_src}">`;
if (data$1.image_urls) for (let i = 0; i < data$1.image_urls.length; i++) imgs += `<img src="${data$1.image_urls[i]}">`;
if (data$1.pic) imgs += `<img src="${data$1.pic}">`;
if (data$1.cover && data$1.cover.unclipped) imgs += `<img src="${data$1.cover.unclipped}">`;
else if (data$1.cover) imgs += `<img src="${data$1.cover}">`;
if (data$1.sketch && data$1.sketch.cover_url) imgs += `<img src="${data$1.sketch.cover_url}">`;
return imgs;
};
const items = await Promise.all(data.map(async (item) => {
const parsed = JSONbig.parse(item.card);
const data$1 = parsed.apiSeasonInfo || (getTitle(parsed.item) ? parsed.item : parsed);
let origin = parsed.origin;
if (origin) try {
origin = JSONbig.parse(origin);
} catch {
logger_default.warn(`card.origin '${origin}' is not falsy-valued or a JSON string, fall back to unparsed value`);
}
let imgHTML = "";
imgHTML += getImgs(data$1);
if (origin) imgHTML += getImgs(origin.item || origin);
let videoHTML = "";
if (data$1.video_playurl) videoHTML += `<video width="${data$1.width}" height="${data$1.height}" controls><source src="${unescape(data$1.video_playurl).replace(/^http:/, "https:")}"><source src="${unescape(data$1.video_playurl)}"></video>`;
let link = "";
if (data$1.dynamic_id) link = `https://t.bilibili.com/${data$1.dynamic_id}`;
else if (item.desc?.dynamic_id) link = `https://t.bilibili.com/${item.desc.dynamic_id}`;
let data_content = getDes(data$1);
if (item.display && item.display.emoji_info && showEmoji) {
const emoji = item.display.emoji_info.emoji_details;
for (const item$1 of emoji) data_content = data_content.replaceAll(new RegExp(`\\${item$1.text}`, "g"), `<img alt="${item$1.text}" src="${item$1.url}"style="margin: -1px 1px 0px; display: inline-block; width: 20px; height: 20px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`);
}
let author = "";
if (item.desc?.user_profile) author = item.desc.user_profile.info.uname;
if (data$1.image_urls && displayArticle) data_content = (await cache_default.getArticleDataFromCvid(data$1.id, uid)).description;
return {
title: getTitle(data$1),
author,
description: (() => {
const description = parsed.new_desc || data_content || getDes(data$1);
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$1)}${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 };