rsshub
Version:
Make RSS Great Again!
108 lines (95 loc) • 3.36 kB
text/typescript
import { Route } from '@/types';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';
export const route: Route = {
path: '/feeds/:category?',
categories: ['programming'],
example: '/bestblogs/feeds/featured',
parameters: { category: 'the category of articles. Can be `programming`, `ai`, `product`, `business` or `featured`. Default is `featured`' },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
name: '文章列表',
maintainers: ['zhenlohuang'],
handler,
};
class APIRequest {
keyword?: string;
qualifiedFilter: string;
sourceId?: string;
category?: string;
timeFilter: string;
language: string;
userLanguage: string;
sortType: string;
currentPage: number;
pageSize: number;
constructor({ keyword = '', qualifiedFilter = 'true', sourceId = '', category = '', timeFilter = '1w', language = 'all', userLanguage = 'zh', sortType = 'default', currentPage = 1, pageSize = 10 } = {}) {
this.keyword = keyword;
this.qualifiedFilter = qualifiedFilter;
this.sourceId = sourceId;
this.category = category;
this.timeFilter = timeFilter;
this.language = language;
this.userLanguage = userLanguage;
this.sortType = sortType;
this.currentPage = currentPage;
this.pageSize = pageSize;
}
toJson(): string {
const requestBody = {
keyword: this.keyword,
qualifiedFilter: this.qualifiedFilter,
sourceId: this.sourceId,
category: this.category,
timeFilter: this.timeFilter,
language: this.language,
userLanguage: this.userLanguage,
sortType: this.sortType,
currentPage: this.currentPage,
pageSize: this.pageSize,
};
return JSON.stringify(requestBody);
}
}
async function handler(ctx) {
const defaultPageSize = 100;
const defaultTimeFilter = '1w';
const { category = 'featured' } = ctx.req.param();
const apiRequest = new APIRequest({
category,
pageSize: defaultPageSize,
qualifiedFilter: category === 'featured' ? 'true' : 'false',
timeFilter: defaultTimeFilter,
});
const apiUrl = 'https://api.bestblogs.dev/api/resource/list';
const response = await ofetch(apiUrl, {
headers: {
'Content-Type': 'application/json',
},
method: 'POST',
body: apiRequest.toJson(),
});
if (!response || !response.data || !response.data.dataList) {
throw new Error('Invalid API response: ' + JSON.stringify(response));
}
const articles = response.data.dataList;
const items = articles.map((article) => ({
title: article.title,
link: article.url,
description: article.summary,
pubDate: parseDate(article.publishDateTimeStr),
author: Array.isArray(article.authors) ? article.authors.map((author) => ({ name: author })) : [{ name: article.authors }],
category: article.category,
}));
return {
title: `Bestblogs.dev`,
link: `https://www.bestblogs.dev/feeds`,
item: items,
};
}