UNPKG

rsshub

Version:
149 lines (146 loc) 6.68 kB
import "./esm-shims-CzJ_djXG.mjs"; import { t as config } from "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import "./helpers-DxBp0Pty.mjs"; import "./proxy-Db7uGcYb.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import "./puppeteer-DGmvuGvT.mjs"; import { n as queryToBoolean, t as fallback } from "./readable-social-DoIL4WB3.mjs"; import "./puppeteer-utils-BK3JC9qW.mjs"; import { t as utils_default } from "./utils-D1eKDLN1.mjs"; import querystring from "node:querystring"; //#region lib/routes/weibo/timeline.ts const route = { path: "/timeline/:uid/:feature?/:routeParams?", categories: ["social-media"], example: "/weibo/timeline/3306934123", parameters: { uid: "用户的uid", feature: "过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐,默认为0。", routeParams: "额外参数;请参阅上面的说明和表格" }, features: { requireConfig: [{ name: "WEIBO_APP_KEY", description: "" }, { name: "WEIBO_REDIRECT_URL", description: "" }], requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, name: "个人时间线", maintainers: [ "zytomorrow", "DIYgod", "Rongronggg9" ], handler, description: `::: warning 需要对应用户打开页面进行授权生成 token 才能生成内容 自部署需要申请并配置微博 key,具体见部署文档 :::` }; async function handler(ctx) { const uid = ctx.req.param("uid"); const feature = ctx.req.param("feature") || 0; const routeParams = ctx.req.param("routeParams") || void 0; const token = await cache_default.get("weibotimelineuid" + uid, false); let displayVideo = "1"; let displayArticle = "0"; let displayComments = "0"; let showBloggerIcons = "0"; if (routeParams) if (routeParams === "1" || routeParams === "0") displayVideo = routeParams; else { const routeParams$1 = querystring.parse(ctx.req.param("routeParams")); displayVideo = fallback(void 0, queryToBoolean(routeParams$1.displayVideo), true) ? "1" : "0"; displayArticle = fallback(void 0, queryToBoolean(routeParams$1.displayArticle), false) ? "1" : "0"; displayComments = fallback(void 0, queryToBoolean(routeParams$1.displayComments), false) ? "1" : "0"; showBloggerIcons = fallback(void 0, queryToBoolean(routeParams$1.showBloggerIcons), false) ? "1" : "0"; } if (token) { const userInfo = await cache_default.tryGet(`weibo:timeline:userInfo:${uid}`, async () => { return (await got_default({ method: "get", url: `https://m.weibo.cn/api/container/getIndex?type=uid&value=${uid}`, headers: { Referer: "https://m.weibo.cn/" } })).data.data.userInfo; }, config.cache.routeExpire, false); const name = userInfo.screen_name; const description = userInfo.description; const profileImageUrl = userInfo.profile_image_url; const response = await cache_default.tryGet(`weibo:timeline:${uid}`, async () => { return (await got_default(`https://api.weibo.com/2/statuses/home_timeline.json?access_token=${token}&count=100&feature=${feature}`)).data; }, config.cache.routeExpire, false); if (response.error !== void 0) { const { app_key = "", redirect_url = ctx.req.origin + "/weibo/timeline/0" } = config.weibo; ctx.status = 302; ctx.set({ "Cache-Control": "no-cache" }); ctx.set("redirect", `https://api.weibo.com/oauth2/authorize?client_id=${app_key}&redirect_uri=${redirect_url}${routeParams ? `&state=${routeParams}` : ""}`); return; } const resultItem = await Promise.all(response.statuses.map(async (item) => { const key = `weibotimelineurl${item.user.id}${item.id}`; const data = await cache_default.tryGet(key, () => utils_default.getShowData(uid, item.id)); const isDataOK = data?.text; if (isDataOK) item = data; const retweet = item.retweeted_status; if (retweet?.isLongText) { const retweetData = await cache_default.tryGet(`weibo:retweeted:${retweet.user.id}:${retweet.id}`, () => utils_default.getShowData(retweet.user.id, retweet.id)); if (retweetData?.text) item.retweeted_status.text = retweetData.text; } const guid = `https://weibo.com/${uid}/${item.id}`; const formatExtended = utils_default.formatExtended(ctx, item, uid); let description$1 = formatExtended.description; const pubDate = isDataOK ? parseDate(data.created_at) : parseDate(item.created_at); if (displayVideo === "1") description$1 = item.retweeted_status ? utils_default.formatVideo(description$1, item.retweeted_status) : utils_default.formatVideo(description$1, item); if (displayComments === "1") description$1 = await utils_default.formatComments(ctx, description$1, item, showBloggerIcons); if (displayArticle === "1") description$1 = await (item.retweeted_status ? utils_default.formatArticle(ctx, description$1, item.retweeted_status) : utils_default.formatArticle(ctx, description$1, item)); return { ...formatExtended, guid, description: description$1, pubDate, author: item.user.screen_name }; })); return utils_default.sinaimgTvax({ title: `个人微博时间线--${name}`, link: `http://weibo.com/${uid}/`, description, image: profileImageUrl, item: resultItem }); } else if (uid === "0" || ctx.req.query()) { const { app_key = "", redirect_url = ctx.req.origin + "/weibo/timeline/0", app_secret = "" } = config.weibo; const code = ctx.req.query("code"); const routeParams$1 = ctx.req.query("state"); if (code) { const rep = await got_default.post(`https://api.weibo.com/oauth2/access_token?client_id=${app_key}&client_secret=${app_secret}&code=${code}&redirect_uri=${redirect_url}&grant_type=authorization_code`); const token$1 = rep.data.access_token; const uid$1 = rep.data.uid; const expires_in = rep.data.expires_in; await cache_default.set("weibotimelineuid" + uid$1, token$1, expires_in); ctx.set({ "Content-Type": "text/html; charset=UTF-8", "Cache-Control": "no-cache" }); ctx.html(`<script>window.location = '/weibo/timeline/${uid$1}${routeParams$1 ? `/${routeParams$1}` : ""}'<\/script>`); } } else { const { app_key = "", redirect_url = ctx.req.origin + "/weibo/timeline/0" } = config.weibo; ctx.status = 302; ctx.set({ "Cache-Control": "no-cache" }); ctx.set("redirect", `https://api.weibo.com/oauth2/authorize?client_id=${app_key}&redirect_uri=${redirect_url}${routeParams ? `&state=${feature}/${routeParams.replaceAll("&", "%26")}` : ""}`); } } //#endregion export { route };