From 7d7af8e4eafa28f2dcbeded500e4fb64fd7c68d8 Mon Sep 17 00:00:00 2001 From: Absolutex <88281489+lxl66566@users.noreply.github.com> Date: Sun, 16 Feb 2025 03:46:47 +0800 Subject: [PATCH] feat(route): add okx (#18355) * feat(route): add okx Signed-off-by: lxl66566 * fix(route, okx): use data from ssr Signed-off-by: lxl66566 * fix(route, okx): remove try-catch to avoid poisoning cache Signed-off-by: lxl66566 * fix(route, okx): handler typing Signed-off-by: lxl66566 * fix(route, okx): do not raise error when items' empty Signed-off-by: lxl66566 * fix(route, okx): fixup previous commit Signed-off-by: lxl66566 * fix(route, okx): another fixup: allowEmpty Signed-off-by: lxl66566 --------- Signed-off-by: lxl66566 --- lib/routes/okx/index.ts | 125 ++++++++++++++++++++++++++++++++++++ lib/routes/okx/namespace.ts | 7 ++ 2 files changed, 132 insertions(+) create mode 100644 lib/routes/okx/index.ts create mode 100644 lib/routes/okx/namespace.ts diff --git a/lib/routes/okx/index.ts b/lib/routes/okx/index.ts new file mode 100644 index 000000000..d04d5c6c7 --- /dev/null +++ b/lib/routes/okx/index.ts @@ -0,0 +1,125 @@ +import { DataItem, Route } from '@/types'; +import cache from '@/utils/cache'; +import { Context } from 'hono'; +import ofetch from '@/utils/ofetch'; +import { load } from 'cheerio'; +import got from '@/utils/got'; + +export const route: Route = { + path: '/:section?', + categories: ['finance'], + example: '/okx/new-listings', + parameters: { + section: { + description: '公告版块', + default: 'latest-announcements', + options: [ + { + value: 'latest-announcements', + label: '最新公告', + }, + { + value: 'new-listings', + label: '新币种上线', + }, + { + value: 'delistings', + label: '币对下线', + }, + { + value: 'trading-updates', + label: '交易规则更新', + }, + { + value: 'deposit-withdrawal-suspension-resumption', + label: '充提暂停/恢复公告', + }, + { + value: 'p2p-trading', + label: 'C2C 公告', + }, + { + value: 'web3', + label: 'Web3', + }, + { + value: 'earn', + label: '赚币', + }, + { + value: 'jumpstart', + label: 'Jumpstart', + }, + { + value: 'api', + label: 'API公告', + }, + { + value: 'okb-buy-back-burn', + label: 'OKB销毁', + }, + { + value: 'others', + label: '其他', + }, + ], + }, + }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['www.okx.com/zh-hans/help/section/:section'], + target: '/:section', + }, + ], + name: '公告', + maintainers: ['lxl66566'], + handler, +}; + +async function handler(ctx: Context) { + const baseUrl = 'https://www.okx.com'; + let { section = 'latest-announcements' } = ctx.req.param(); + section = section.replace(/^announcements-/, ''); + + const data = await ofetch(`${baseUrl}/zh-hans/help/section/announcements-${section}`); + const $ = load(data); + + const ssrData = JSON.parse($('script[data-id="__app_data_for_ssr__"]').text()); + const itemsTemp: { title: string; link: string; pubDate: Date }[] = + ssrData?.appContext?.initialProps?.sectionData?.articleList?.items?.map((item: { title: string; slug: string; publishTime: string }) => ({ + title: item.title, + link: `${baseUrl}/zh-hans/help/${item.slug}`, + pubDate: new Date(item.publishTime), + })) || []; + + const items = await Promise.all( + itemsTemp.map((item) => + cache.tryGet(item.link, async () => { + const content = await got(item.link).then((response) => { + const $ = load(response.data); + return $('div[class^="index_richTextContent"]').html(); + }); + + return { + ...item, + description: content || '内容获取失败', + }; + }) + ) + ); + + return { + title: ssrData?.appContext?.serverSideProps?.sectionOutline?.title || 'Unknown', + link: `${baseUrl}/zh-hans/help/section/announcements-${section}`, + item: items as DataItem[], + allowEmpty: true, + }; +} diff --git a/lib/routes/okx/namespace.ts b/lib/routes/okx/namespace.ts new file mode 100644 index 000000000..656a2a937 --- /dev/null +++ b/lib/routes/okx/namespace.ts @@ -0,0 +1,7 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '欧易 OKX', + url: 'www.okx.com/zh-hans', + lang: 'zh-CN', +};