rsshub
Version:
Make RSS Great Again!
149 lines (146 loc) • 6.68 kB
JavaScript
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 };