From cb69f5032c97d5fae4697badddbdecec1aca1ce0 Mon Sep 17 00:00:00 2001 From: cnkmmk <22782790+cnkmmk@users.noreply.github.com> Date: Sun, 7 Apr 2024 06:23:13 +0800 Subject: [PATCH] feat(route): add 51cto (#14958) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route): add 51cto 增加了51cto的推荐列表 * Update rss.ts * Update rss.ts * fix(route): fix 51cto * Update recommend.ts 调整 51cto,使用API来生成RSS。 * Update recommend.ts * fix: request signing --------- Co-authored-by: pull[bot] <39814207+pull[bot]@users.noreply.github.com> --- lib/routes/51cto/namespace.ts | 6 ++++ lib/routes/51cto/recommend.ts | 52 +++++++++++++++++++++++++++++++++++ lib/routes/51cto/utils.ts | 21 ++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 lib/routes/51cto/namespace.ts create mode 100644 lib/routes/51cto/recommend.ts create mode 100644 lib/routes/51cto/utils.ts diff --git a/lib/routes/51cto/namespace.ts b/lib/routes/51cto/namespace.ts new file mode 100644 index 000000000..96d3ff4ed --- /dev/null +++ b/lib/routes/51cto/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '51CTO', + url: '51cto.com', +}; diff --git a/lib/routes/51cto/recommend.ts b/lib/routes/51cto/recommend.ts new file mode 100644 index 000000000..fa5d426fb --- /dev/null +++ b/lib/routes/51cto/recommend.ts @@ -0,0 +1,52 @@ +import { Route } from '@/types'; +import { parseDate } from '@/utils/parse-date'; +import got from '@/utils/got'; +import { getToken, sign } from './utils'; + +export const route: Route = { + path: '/index/recommend', + categories: ['programming'], + example: '/51cto/index/recommend', + radar: [ + { + source: ['51cto.com/'], + }, + ], + name: '推荐', + maintainers: ['cnkmmk'], + handler, + url: '51cto.com/', +}; + +async function handler(ctx) { + const url = 'https://api-media.51cto.com'; + const requestPath = 'index/index/recommend'; + const token = (await getToken()) as string; + const timestamp = Date.now(); + const params = { + page: 1, + page_size: ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 50, + limit_time: 0, + name_en: '', + }; + const response = await got(`${url}/${requestPath}`, { + searchParams: { + ...params, + timestamp, + token, + sign: sign(requestPath, params, timestamp, token), + }, + }); + const list = response.data.data.data.list; + return { + title: '51CTO', + link: 'https://www.51cto.com/', + description: '51cto - 推荐', + item: list.map((item) => ({ + title: item.title, + link: item.url, + pubDate: parseDate(item.pubdate, +8), + description: item.abstract, + })), + }; +} diff --git a/lib/routes/51cto/utils.ts b/lib/routes/51cto/utils.ts new file mode 100644 index 000000000..a1aba1222 --- /dev/null +++ b/lib/routes/51cto/utils.ts @@ -0,0 +1,21 @@ +import ofetch from '@/utils/ofetch'; +import cache from '@/utils/cache'; +import md5 from '@/utils/md5'; + +export const getToken = () => + cache.tryGet( + '51cto:token', + async () => { + const response = await ofetch('https://api-media.51cto.com/api/token-get'); + return response.data.data.token; + }, + 3600, + false + ); + +export const sign = (requestPath: string, payload: Record = {}, timestamp: number, token: string) => { + payload.timestamp = timestamp; + payload.token = token; + const sortedParams = Object.keys(payload).sort(); + return md5(md5(requestPath) + md5(sortedParams + md5(token) + timestamp)); +};