feat(route): add ally/rail (#9660)

Signed-off-by: Rongrong <i@rong.moe>
This commit is contained in:
Rongrong 2022-04-30 23:15:12 +08:00 committed by GitHub
parent d9dd7afbb0
commit c4ca3e4ee9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 142 additions and 0 deletions

View File

@ -1297,6 +1297,20 @@ Supported sub-sites:
<Route author="AlexdanerZe TonyRL" example="/zaker/focusread" path="/zaker/focusread" />
## 艾莱资讯
### 世界轨道交通资讯网
<Route author="Rongronggg9" example="/ally/rail/hyzix/chengguijiaotong/" path="/ally/rail/:category?/:topic?" :paramsDesc="['分类,可在 URL 中找到;略去则抓取首页', '话题,可在 URL 中找到;并非所有页面均有此字段']" radar="1" rssbud="1">
::: tip 提示
默认抓取前 20 条,可通过 `?limit=` 改变。
:::
</Route>
## 爱范儿 ifanr
### 爱范儿频道

View File

@ -0,0 +1,3 @@
module.exports = {
'/rail/:category?/:topic?': ['Rongronggg9'],
};

13
lib/v2/ally/radar.js Normal file
View File

@ -0,0 +1,13 @@
module.exports = {
'ally.net.cn': {
_name: '艾莱资讯',
rail: [
{
title: '世界轨道交通资讯网',
docs: 'https://docs.rsshub.app/new-media.html#ai-lai-zi-xun',
source: ['/', '/html/:category?/:topic?'],
target: '/ally/rail/:category?/:topic?',
},
],
},
};

109
lib/v2/ally/rail.js Normal file
View File

@ -0,0 +1,109 @@
const cheerio = require('cheerio');
const got = require('@/utils/got');
const { parseDate } = require('@/utils/parse-date');
const timezone = require('@/utils/timezone');
module.exports = async (ctx) => {
// http://rail.ally.net.cn/sitemap.html
const { category, topic } = ctx.params;
const rootUrl = 'http://rail.ally.net.cn';
const pageUrl = category ? (topic ? `${rootUrl}/html/${category}/${topic}/` : `${rootUrl}/html/${category}/`) : rootUrl;
const response = await got.get(pageUrl);
const $ = cheerio.load(response.data);
let title = $('.container .regsiter a') // what a typo...
.get()
.slice(1) // drop "首页"
.reduce((prev, curr) => (prev ? `${prev} - ${$(curr).text()}` : $(curr).text()), '');
title = title || (category && topic ? `${category} - ${topic}` : category) || '首页';
let links = [
// list page: http://rail.ally.net.cn/html/lujuzixun/
$('.left .hynewsO h2 a').get(),
// multi-sub-topic page: http://rail.ally.net.cn/html/hyzix/
$('.left .list_content_c').find('.new_hy_focus_con_tit a, .new_hy_list_name a').get(),
// multi-sub-topic page 2: http://rail.ally.net.cn/html/foster/
$('.left').find('.nnewslistpic a, .nnewslistinfo dd a').get(),
// data list page: http://rail.ally.net.cn/html/tongjigongbao/
$('.left .list_con .datacountTit a').get(),
// home page: http://rail.ally.net.cn
$('.container_left').find('dd a, h1 a, ul.slideshow li a').get(),
].reduce((a, b) => a.concat(b), []);
if (!links.length) {
// try aggressively sniffing links, e.g. http://rail.ally.net.cn/html/InviteTen/
links = $('.left a, .container_left a').get();
}
let items = links
.map((link) => {
link = $(link);
const url = link.attr('href');
const urlMatch = url && url.match(/\/html\/(\d{4})\/\w+_(\d{4})\/\d+\.html/);
if (!urlMatch) {
return null;
}
const title = link.text();
return {
title,
link: url.startsWith('/') ? `${rootUrl}${url}` : url,
pubDate: timezone(parseDate(`${urlMatch[1]}${urlMatch[2]}`), 8),
};
})
.filter(Boolean)
.reduce((prev, curr) => (prev.length && prev[prev.length - 1].link === curr.link ? prev : [...prev, curr]), [])
.sort((a, b) => b.pubDate - a.pubDate)
.slice(0, ctx.query.limit || 20);
items = await Promise.all(
items.map(
async (item) =>
await ctx.cache.tryGet(item.link, async () => {
const response = await got(item.link);
const $ = cheerio.load(response.data);
// fix weird format
let description = '';
const content = $('div.content_all');
if (content.length) {
content
.eq(content.length - 1) // some pages have "summary"
.contents()
.each((_, child) => {
const $child = $(child);
let innerHtml;
if (child.name === 'div') {
innerHtml = $child.html();
innerHtml = innerHtml && innerHtml.trim();
description += !innerHtml || innerHtml === '&nbsp;' ? (description ? '<br>' : '') : innerHtml;
} else {
// bare text node or something else
description += $child.toString().trim();
}
});
} else {
// http://rail.ally.net.cn/html/2022/InviteTen_0407/4686.html
description = $('div.content div').first().html();
}
description = description.replace(/\s*<br ?\/?>\s*$/, ''); // trim <br> at the end
const info = $('.content > em span');
return {
title: $('.content > h2').text() || item.title,
description,
// pubDate: timezone(parseDate(info.eq(0).text()), 8),
pubDate: item.pubDate,
author: info
.eq(1)
.text()
.replace(/^来源:/, ''),
link: item.link,
};
})
)
);
ctx.state.data = {
title: `世界轨道交通资讯网 - ${title}`,
link: pageUrl,
item: items,
description: $('head > meta[name="description"]').attr('content'),
};
};

3
lib/v2/ally/router.js Normal file
View File

@ -0,0 +1,3 @@
module.exports = function (router) {
router.get('/rail/:category?/:topic?', require('./rail'));
};