diff --git a/lib/routes/apnic/index.ts b/lib/routes/apnic/index.ts new file mode 100644 index 00000000000000..6570faec284b98 --- /dev/null +++ b/lib/routes/apnic/index.ts @@ -0,0 +1,61 @@ +import { Route } from '@/types'; + +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { load } from 'cheerio'; +import { parseDate } from '@/utils/parse-date'; + +export const route: Route = { + path: '/blog', + categories: ['blog'], + example: '/apnic/blog', + url: 'blog.apnic.net', + name: 'Blog', + maintainers: ['p3psi-boo'], + handler, +}; + +async function handler() { + const baseUrl = 'https://blog.apnic.net'; + const feedUrl = `${baseUrl}/feed/`; + + const response = await got(feedUrl); + const $ = load(response.data, { xmlMode: true }); + + // 从 RSS XML 中直接提取文章信息 + const list = $('item') + .toArray() + .map((item) => { + const $item = $(item); + return { + title: $item.find('title').text(), + link: $item.find('link').text(), + author: $item.find(String.raw`dc\:creator`).text(), + category: + $item + .find('category') + .text() + .match(/>([^<]+) + cache.tryGet(item.link, async () => { + const { data: articleData } = await got(item.link); + const $article = load(articleData); + + // 获取文章正文内容 + item.description = $article('.entry-content').html(); + return item; + }) + ) + ); + + return { + title: 'APNIC Blog', + link: baseUrl, + item: items, + }; +} diff --git a/lib/routes/apnic/namespace.ts b/lib/routes/apnic/namespace.ts new file mode 100644 index 00000000000000..e3e9914088b2aa --- /dev/null +++ b/lib/routes/apnic/namespace.ts @@ -0,0 +1,8 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'APNIC', + url: 'blog.apnic.net', + description: 'Asia-Pacific Network Information Centre', + lang: 'en', +};