UNPKG

rsshub

Version:
106 lines (96 loc) 3.47 kB
import { Route } from '@/types'; import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; import timezone from '@/utils/timezone'; export const route: Route = { path: '/ceic/:type?', categories: ['forecast'], example: '/earthquake/ceic/1', parameters: { type: '类型,见下表' }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false, }, radar: [ { source: ['www.cea.gov.cn/cea/xwzx/zqsd/index.html', 'www.cea.gov.cn/'], target: '', }, ], name: '中国地震台', maintainers: ['SettingDust'], handler, url: 'www.cea.gov.cn/cea/xwzx/zqsd/index.html', description: `| 参数 | 类型 | | ---- | --------------------------- | | 1 | 最近 24 小时地震信息 | | 2 | 最近 48 小时地震信息 | | 5 | 最近一年 3.0 级以上地震信息 | | 7 | 最近一年 3.0 级以下地震 | | 8 | 最近一年 4.0 级以上地震信息 | | 9 | 最近一年 5.0 级以上地震信息 | | 0 | 最近一年 6.0 级以上地震信息 | 可通过全局过滤参数订阅您感兴趣的地区.`, }; async function handler(ctx) { let type = Number(ctx.req.param('type')); type = type ?? 1; const baseUrl = 'http://www.ceic.ac.cn'; const api = `${baseUrl}/ajax/speedsearch?num=${type}`; const mappings = { O_TIME: '发震时刻(UTC+8)', LOCATION_C: '参考位置', M: '震级(M)', EPI_LAT: '纬度(°)', EPI_LON: '经度(°)', EPI_DEPTH: '深度(千米)', SAVE_TIME: '录入时间', }; const typeMappings = { 1: '最近24小时地震信息', 2: '最近48小时地震信息', 3: '最近7天地震信息', 4: '最近30天地震信息', 5: '最近一年3.0级以上地震信息', 6: '最近一年地震信息', 7: '最近一年3.0级以下地震', 8: '最近一年4.0级以上地震信息', 9: '最近一年5.0级以上地震信息', 0: '最近一年6.0级以上地震信息', }; // 因为item数量限制20,所以对于RSS来说为无用类型,防止浪费资源 const disabledType = [3, 4, 6]; if (disabledType.includes(type)) { type = 1; } const typeName = typeMappings[type]; const response = await got(api); const data = response.data.replace(/,"page":"(.*?)","num":/, ',"num":'); let json = JSON.parse(data.substring(1, data.length - 1)).shuju; if (json.length > 20) { json = json.slice(0, 20); } return { title: typeName, link: `${baseUrl}/speedsearch`, allowEmpty: true, item: json.map((entity) => { const contentBuilder = []; const { NEW_DID, LOCATION_C, M, O_TIME } = entity; for (const mappingsKey in mappings) { contentBuilder.push(`${mappings[mappingsKey]} ${entity[mappingsKey]}`); } return { title: `${LOCATION_C}发生${M}级地震`, link: `${baseUrl}/${NEW_DID}.html`, pubDate: timezone(parseDate(O_TIME, 'YYYY-MM-DD HH:mm:ss'), +8), description: contentBuilder.join('<br>'), guid: NEW_DID, }; }), }; }