Skip to content

Commit

Permalink
feat(route): add 中国五矿化工进出口商会 (#18171)
Browse files Browse the repository at this point in the history
  • Loading branch information
nczitzk authored Jan 21, 2025
1 parent f1e82d6 commit b76e67e
Show file tree
Hide file tree
Showing 2 changed files with 272 additions and 0 deletions.
263 changes: 263 additions & 0 deletions lib/routes/cccmc/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
import { type Data, type DataItem, type Route, ViewType } from '@/types';

import cache from '@/utils/cache';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';

import { type CheerioAPI, type Cheerio, type Element, load } from 'cheerio';
import { type Context } from 'hono';

export const handler = async (ctx: Context): Promise<Data> => {
const { category = 'ywgg/tzgg' } = ctx.req.param();
const limit: number = Number.parseInt(ctx.req.query('limit') ?? '15', 10);

const baseUrl: string = 'https://www.cccmc.org.cn';
const targetUrl: string = new URL(category.endsWith('/') ? category : `${category}/`, baseUrl).href;

const response = await ofetch(targetUrl);
const $: CheerioAPI = load(response);
const language = $('html').attr('lang') ?? 'zh-CN';

let items: DataItem[] = [];

const regex: RegExp = /\{url:'(.*)',title:'(.*)',time:'(.*)'\},/g;

items =
response
.match(regex)
?.slice(0, limit)
.map((item): DataItem => {
const matches = item.match(/'(.*?)'/);

const title: string = matches?.[2] ?? '';
const pubDateStr: string | undefined = matches?.[3];
const linkUrl: string | undefined = matches?.[1];
const upDatedStr: string | undefined = pubDateStr;

const processedItem: DataItem = {
title,
pubDate: pubDateStr ? parseDate(pubDateStr) : undefined,
link: linkUrl ? new URL(linkUrl, baseUrl).href : undefined,
updated: upDatedStr ? parseDate(upDatedStr) : undefined,
language,
};

return processedItem;
}) ?? [];

items = (
await Promise.all(
items.map((item) => {
if (!item.link) {
return item;
}

return cache.tryGet(item.link, async (): Promise<DataItem> => {
const detailResponse = await ofetch(item.link);
const $$: CheerioAPI = load(detailResponse);

const title: string = $$('div.title').text();
const description: string = $$('div#article-content').html() ?? '';
const pubDateStr: string | undefined = $$('span.time').text().split(//).pop();
const authorEls: Element[] = $$('span.form, span.from').toArray();
const authors: DataItem['author'] = authorEls.map((authorEl) => {
const $$authorEl: Cheerio<Element> = $$(authorEl);

return {
name: $$authorEl.text().split(//).pop() ?? $$authorEl.text(),
};
});
const upDatedStr: string | undefined = pubDateStr;

const processedItem: DataItem = {
title,
description,
pubDate: pubDateStr ? parseDate(pubDateStr) : item.pubDate,
author: authors,
content: {
html: description,
text: description,
},
updated: upDatedStr ? parseDate(upDatedStr) : item.updated,
language,
};

return {
...item,
...processedItem,
};
});
})
)
).filter((_): _ is DataItem => true);

const title: string = $('title').text();

return {
title,
description: title.split(/-/)[0].trim(),
link: targetUrl,
item: items,
allowEmpty: true,
image: $('img.logo').attr('src'),
author: title.split(/-/)?.pop()?.trim(),
language,
id: targetUrl,
};
};

export const route: Route = {
path: '/:category{.+}?',
name: '通用',
url: 'www.cccmc.org.cn',
maintainers: ['nczitzk'],
handler,
example: '/cccmc/ywgg/tzgg',
parameters: {
category: '分类,默认为 `ywgg/tzgg`,即通知公告,可在对应分类页 URL 中找到, Category, `ywgg/tzgg`,即通知公告 by default',
},
description: `:::tip
若订阅 [综合政策](https://www.cccmc.org.cn/zcfg/zhzc/),网址为 \`https://www.cccmc.org.cn/zcfg/zhzc/\`,请截取 \`https://www.cccmc.org.cn/\` 到末尾的部分 \`zcfg/zhzc\` 作为 \`category\` 参数填入,此时目标路由为 [\`/cccmc/zcfg/zhzc\`](https://rsshub.app/cccmc/zcfg/zhzc)。
:::
<details>
<summary>更多分类</summary>
#### [会员之家](https://www.cccmc.org.cn/hyzj)
| [会员之声](https://www.cccmc.org.cn/hyzj/hyzs/) | [会员动态](https://www.cccmc.org.cn/hyzj/hydt/) | [会员推介](https://www.cccmc.org.cn/hyzj/hytj/) |
| ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- |
| [hyzj/hyzs](https://rsshub.app/cccmc/hyzj/hyzs) | [hyzj/hydt](https://rsshub.app/cccmc/hyzj/hydt) | [hyzj/hytj](https://rsshub.app/cccmc/hyzj/hytj) |
#### [政策法规](https://www.cccmc.org.cn/zcfg)
| [综合政策](https://www.cccmc.org.cn/zcfg/zhzc/) | [国内贸易](https://www.cccmc.org.cn/zcfg/gnmy/) | [对外贸易](https://www.cccmc.org.cn/zcfg/dwmy/) | [投资合作](https://www.cccmc.org.cn/zcfg/tzhz/) |
| ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- |
| [zcfg/zhzc](https://rsshub.app/cccmc/zcfg/zhzc) | [zcfg/gnmy](https://rsshub.app/cccmc/zcfg/gnmy) | [zcfg/dwmy](https://rsshub.app/cccmc/zcfg/dwmy) | [zcfg/tzhz](https://rsshub.app/cccmc/zcfg/tzhz) |
#### [行业资讯](https://www.cccmc.org.cn/hyzx)
| [统计分析](https://www.cccmc.org.cn/hyzx/tjfx/) | [石油化工](https://www.cccmc.org.cn/hyzx/syhg/) | [金属矿产](https://www.cccmc.org.cn/hyzx/jskc/) | [五金建材](https://www.cccmc.org.cn/hyzx/wjjc/) |
| ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- |
| [hyzx/tjfx](https://rsshub.app/cccmc/hyzx/tjfx) | [hyzx/syhg](https://rsshub.app/cccmc/hyzx/syhg) | [hyzx/jskc](https://rsshub.app/cccmc/hyzx/jskc) | [hyzx/wjjc](https://rsshub.app/cccmc/hyzx/wjjc) |
#### [商业机会](https://www.cccmc.org.cn/syjh/)+
| [供应信息](https://www.cccmc.org.cn/syjh/gyxx/) | [需求信息](https://www.cccmc.org.cn/syjh/xqxx/) | [合作信息](https://www.cccmc.org.cn/syjh/hzxx/) |
| ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- |
| [syjh/gyxx](https://rsshub.app/cccmc/syjh/gyxx) | [syjh/xqxx](https://rsshub.app/cccmc/syjh/xqxx) | [syjh/hzxx](https://rsshub.app/cccmc/syjh/hzxx) |
#### [商会党建](https://www.cccmc.org.cn/shdj)
| [党群动态](https://www.cccmc.org.cn/shdj/dqdt/) | [党内法规](https://www.cccmc.org.cn/shdj/dnfg/) | [青年工作](https://www.cccmc.org.cn/shdj/qngz/) |
| ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- |
| [shdj/dqdt](https://rsshub.app/cccmc/shdj/dqdt) | [shdj/dnfg](https://rsshub.app/cccmc/shdj/dnfg) | [shdj/qngz](https://rsshub.app/cccmc/shdj/qngz) |
</details>
`,
categories: ['new-media'],
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportRadar: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['www.cccmc.org.cn/:category'],
target: (params) => {
const category: string = params.category;

return `/cccmc${category ? `/${category}` : ''}`;
},
},
{
title: '商业机会 - 供应信息',
source: ['www.cccmc.org.cn/syjh/gyxx/'],
target: '/syjh/gyxx',
},
{
title: '商业机会 - 需求信息',
source: ['www.cccmc.org.cn/syjh/xqxx/'],
target: '/syjh/xqxx',
},
{
title: '商业机会 - 合作信息',
source: ['www.cccmc.org.cn/syjh/hzxx/'],
target: '/syjh/hzxx',
},
{
title: '商会党建 - 党群动态',
source: ['www.cccmc.org.cn/shdj/dqdt/'],
target: '/shdj/dqdt',
},
{
title: '商会党建 - 党内法规',
source: ['www.cccmc.org.cn/shdj/dnfg/'],
target: '/shdj/dnfg',
},
{
title: '商会党建 - 青年工作',
source: ['www.cccmc.org.cn/shdj/qngz/'],
target: '/shdj/qngz',
},
{
title: '行业资讯 - 统计分析',
source: ['www.cccmc.org.cn/hyzx/tjfx/'],
target: '/hyzx/tjfx',
},
{
title: '行业资讯 - 石油化工',
source: ['www.cccmc.org.cn/hyzx/syhg/'],
target: '/hyzx/syhg',
},
{
title: '行业资讯 - 金属矿产',
source: ['www.cccmc.org.cn/hyzx/jskc/'],
target: '/hyzx/jskc',
},
{
title: '行业资讯 - 五金建材',
source: ['www.cccmc.org.cn/hyzx/wjjc/'],
target: '/hyzx/wjjc',
},
{
title: '会员之家 - 会员之声',
source: ['www.cccmc.org.cn/hyzj/hyzs/'],
target: '/hyzj/hyzs',
},
{
title: '会员之家 - 会员动态',
source: ['www.cccmc.org.cn/hyzj/hydt/'],
target: '/hyzj/hydt',
},
{
title: '会员之家 - 会员推介',
source: ['www.cccmc.org.cn/hyzj/hytj/'],
target: '/hyzj/hytj',
},
{
title: '政策法规 - 综合政策',
source: ['www.cccmc.org.cn/zcfg/zhzc/'],
target: '/zcfg/zhzc',
},
{
title: '政策法规 - 国内贸易',
source: ['www.cccmc.org.cn/zcfg/gnmy/'],
target: '/zcfg/gnmy',
},
{
title: '政策法规 - 对外贸易',
source: ['www.cccmc.org.cn/zcfg/dwmy/'],
target: '/zcfg/dwmy',
},
{
title: '政策法规 - 投资合作',
source: ['www.cccmc.org.cn/zcfg/tzhz/'],
target: '/zcfg/tzhz',
},
],
view: ViewType.Articles,
};
9 changes: 9 additions & 0 deletions lib/routes/cccmc/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { Namespace } from '@/types';

export const namespace: Namespace = {
name: '中国五矿化工进出口商会',
url: 'www.cccmc.org.cn',
categories: ['new-media'],
description: '',
lang: 'zh-CN',
};

0 comments on commit b76e67e

Please sign in to comment.