diff --git a/lib/routes/c114/namespace.ts b/lib/routes/c114/namespace.ts index ef7f192c5..dd5c3be2a 100644 --- a/lib/routes/c114/namespace.ts +++ b/lib/routes/c114/namespace.ts @@ -3,5 +3,7 @@ import type { Namespace } from '@/types'; export const namespace: Namespace = { name: 'C114 通信网', url: 'c114.com.cn', + categories: ['new-media'], + description: '', lang: 'zh-CN', }; diff --git a/lib/routes/c114/roll.ts b/lib/routes/c114/roll.ts index ae22d3c79..2e4835cad 100644 --- a/lib/routes/c114/roll.ts +++ b/lib/routes/c114/roll.ts @@ -1,4 +1,5 @@ import { Route } from '@/types'; + import cache from '@/utils/cache'; import got from '@/utils/got'; import { load } from 'cheerio'; @@ -6,78 +7,106 @@ import timezone from '@/utils/timezone'; import { parseDate } from '@/utils/parse-date'; import iconv from 'iconv-lite'; -export const route: Route = { - path: '/roll', - categories: ['new-media'], - example: '/c114/roll', - parameters: {}, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, - radar: [ - { - source: ['c114.com.cn/news/roll.asp', 'c114.com.cn/'], - }, - ], - name: '滚动新闻', - maintainers: ['nczitzk'], - handler, - url: 'c114.com.cn/news/roll.asp', -}; +export const handler = async (ctx) => { + const { original = 'false' } = ctx.req.param(); + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 15; -async function handler(ctx) { const rootUrl = 'https://www.c114.com.cn'; - const currentUrl = `${rootUrl}/news/roll.asp`; + const currentUrl = new URL(`news/roll.asp${original === 'true' ? `?o=true` : ''}`, rootUrl).href; - const response = await got({ - method: 'get', - url: currentUrl, + const { data: response } = await got(currentUrl, { responseType: 'buffer', }); - const $ = load(iconv.decode(response.data, 'gbk')); + const $ = load(iconv.decode(response, 'gbk')); - let items = $('.new_list_c h6 a') - .slice(0, ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 50) + const language = $('html').prop('lang'); + + let items = $('div.new_list_c') + .slice(0, limit) .toArray() .map((item) => { item = $(item); return { - title: item.text(), - link: item.attr('href'), + title: item.find('h6 a').text(), + pubDate: timezone(parseDate(item.find('div.new_list_time').text(), ['HH:mm', 'M/D']), +8), + link: new URL(item.find('h6 a').prop('href'), rootUrl).href, + author: item.find('div.new_list_author').text().trim(), + language, }; }); items = await Promise.all( items.map((item) => cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, + const { data: detailResponse } = await got(item.link, { responseType: 'buffer', }); - const content = load(iconv.decode(detailResponse.data, 'gbk')); + const $$ = load(iconv.decode(detailResponse, 'gbk')); - item.description = content('.text').html(); - item.author = content('.author').first().text().replace('C114通信网  ', ''); - item.pubDate = timezone(parseDate(content('.r_time').text()), +8); - item.category = content('meta[name="keywords"]').attr('content').split(','); + const title = $$('h1').text(); + const description = $$('div.text').html(); + + item.title = title; + item.description = description; + item.pubDate = timezone(parseDate($$('div.r_time').text(), 'YYYY/M/D HH:mm'), +8); + item.author = $$('div.author').first().text().trim(); + item.content = { + html: description, + text: $$('.text').text(), + }; + item.language = language; return item; }) ) ); + const image = new URL($('div.top2-1 a img').prop('src'), rootUrl).href; + return { title: $('title').text(), + description: $('meta[name="description"]').prop('content'), link: currentUrl, item: items, + allowEmpty: true, + image, + author: $('p.top1-1-1 a').first().text(), + language, }; -} +}; + +export const route: Route = { + path: '/roll/:original?', + name: '滚动资讯', + url: 'c114.com.cn', + maintainers: ['nczitzk'], + handler, + example: '/c114/roll', + parameters: { original: '只看原创,可选 true 和 false,默认为 false' }, + description: '', + categories: ['new-media'], + + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportRadar: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['c114.com.cn/news/roll.asp'], + target: (_, url) => { + url = new URL(url); + const original = url.searchParams.get('o'); + + return `/roll${original ? `/${original}` : ''}`; + }, + }, + ], +};