UNPKG

rsshub

Version:
108 lines (95 loc) 3.36 kB
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, }; }