mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-09-21 04:38:15 +08:00
113 lines
4.4 KiB
TypeScript
113 lines
4.4 KiB
TypeScript
import { Route } from '@/types';
|
|
import cache from '@/utils/cache';
|
|
import querystring from 'querystring';
|
|
import got from '@/utils/got';
|
|
import { config } from '@/config';
|
|
import weiboUtils from './utils';
|
|
import { fallback, queryToBoolean } from '@/utils/readable-social';
|
|
|
|
export const route: Route = {
|
|
path: '/group/:gid/:gname?/:routeParams?',
|
|
categories: ['social-media'],
|
|
example: '/weibo/group/4541216424989965',
|
|
parameters: { gid: '分组id, 在网页版分组地址栏末尾`?gid=`处获取', gname: '分组显示名称; 默认为: `微博分组`', routeParams: '额外参数;请参阅上面的说明和表格' },
|
|
features: {
|
|
requireConfig: true,
|
|
requirePuppeteer: false,
|
|
antiCrawler: false,
|
|
supportBT: false,
|
|
supportPodcast: false,
|
|
supportScihub: false,
|
|
},
|
|
name: '自定义分组',
|
|
maintainers: ['monologconnor', 'Rongronggg9'],
|
|
handler,
|
|
description: `:::warning
|
|
由于微博官方未提供自定义分组相关 api, 此方案必须使用用户\`Cookie\`进行抓取
|
|
|
|
因微博 cookies 的过期与更新方案未经验证,部署一次 Cookie 的有效时长未知
|
|
|
|
微博用户 Cookie 的配置可参照部署文档
|
|
:::`,
|
|
};
|
|
|
|
async function handler(ctx) {
|
|
if (!config.weibo.cookies) {
|
|
throw new Error('Weibo Group Timeline is not available due to the absense of [Weibo Cookies]. Check <a href="https://docs.rsshub.app/install/#pei-zhi-bu-fen-rss-mo-kuai-pei-zhi">relevant config tutorial</a>');
|
|
}
|
|
|
|
const gid = ctx.req.param('gid');
|
|
const groupName = ctx.req.param('gname') || '微博分组';
|
|
let displayVideo = '1';
|
|
let displayArticle = '0';
|
|
let displayComments = '0';
|
|
if (ctx.req.param('routeParams')) {
|
|
if (ctx.req.param('routeParams') === '1' || ctx.req.param('routeParams') === '0') {
|
|
displayVideo = ctx.req.param('routeParams');
|
|
} else {
|
|
const routeParams = querystring.parse(ctx.req.param('routeParams'));
|
|
displayVideo = fallback(undefined, queryToBoolean(routeParams.displayVideo), true) ? '1' : '0';
|
|
displayArticle = fallback(undefined, queryToBoolean(routeParams.displayArticle), false) ? '1' : '0';
|
|
displayComments = fallback(undefined, queryToBoolean(routeParams.displayComments), false) ? '1' : '0';
|
|
}
|
|
}
|
|
|
|
const responseData = await cache.tryGet(
|
|
`weibo:group:index:${gid}`,
|
|
async () => {
|
|
const _r = await got({
|
|
method: 'get',
|
|
url: `https://m.weibo.cn/feed/group?gid=${gid}`,
|
|
headers: {
|
|
Referer: `https://m.weibo.cn/`,
|
|
'MWeibo-Pwa': 1,
|
|
'X-Requested-With': 'XMLHttpRequest',
|
|
Cookie: config.weibo.cookies,
|
|
},
|
|
});
|
|
return _r.data.data;
|
|
},
|
|
config.cache.routeExpire,
|
|
false
|
|
);
|
|
|
|
const resultItems = await Promise.all(
|
|
responseData.statuses.map(async (item) => {
|
|
const retweet = item.retweeted_status;
|
|
if (retweet && retweet.isLongText) {
|
|
const retweetData = await cache.tryGet(`weibo:retweeted:${retweet.user.id}:${retweet.bid}`, () => weiboUtils.getShowData(retweet.user.id, retweet.bid));
|
|
if (retweetData !== undefined && retweetData.text) {
|
|
item.retweeted_status.text = retweetData.text;
|
|
}
|
|
}
|
|
|
|
const formatExtended = weiboUtils.formatExtended(ctx, item);
|
|
let description = formatExtended.description;
|
|
|
|
if (displayVideo === '1') {
|
|
description = item.retweeted_status ? weiboUtils.formatVideo(description, item.retweeted_status) : weiboUtils.formatVideo(description, item);
|
|
}
|
|
|
|
if (displayComments === '1') {
|
|
description = await weiboUtils.formatComments(ctx, description, item);
|
|
}
|
|
|
|
if (displayArticle === '1') {
|
|
description = await (item.retweeted_status ? weiboUtils.formatArticle(ctx, description, item.retweeted_status) : weiboUtils.formatArticle(ctx, description, item));
|
|
}
|
|
|
|
return {
|
|
...formatExtended,
|
|
description,
|
|
};
|
|
})
|
|
);
|
|
|
|
return weiboUtils.sinaimgTvax({
|
|
title: groupName,
|
|
link: `https://weibo.com/mygroups?gid=${gid}`,
|
|
description: '微博自定义分组',
|
|
item: resultItems,
|
|
});
|
|
}
|