rsshub
Version:
Make RSS Great Again!
99 lines (98 loc) • 3.84 kB
JavaScript
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { t as cache_default } from "./cache-BkqOokyU.mjs";
import { t as got_default } from "./got-BTowW50G.mjs";
import { t as timezone } from "./timezone-BBvDwS_3.mjs";
import { load } from "cheerio";
//#region lib/routes/ally/rail.ts
const route = {
path: "/rail/:category?/:topic?",
categories: ["new-media"],
example: "/ally/rail/hyzix/chengguijiaotong",
parameters: {
category: "分类,可在 URL 中找到;略去则抓取首页",
topic: "话题,可在 URL 中找到;并非所有页面均有此字段"
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{ source: ["rail.ally.net.cn/", "rail.ally.net.cn/html/:category?/:topic?"] }],
name: "世界轨道交通资讯网",
maintainers: ["Rongronggg9"],
handler,
url: "rail.ally.net.cn/",
description: `::: tip
默认抓取前 20 条,可通过 \`?limit=\` 改变。
:::`
};
async function handler(ctx) {
const { category, topic } = ctx.req.param();
const rootUrl = "http://rail.ally.net.cn";
const pageUrl = category ? topic ? `${rootUrl}/html/${category}/${topic}/` : `${rootUrl}/html/${category}/` : rootUrl;
const $ = load((await got_default.get(pageUrl)).data);
let title = "";
const titleLinks = $(".container .regsiter a").toArray().slice(1);
for (const link of titleLinks) {
const linkText = $(link).text();
title = title ? `${title} - ${linkText}` : linkText;
}
title ||= (category && topic ? `${category} - ${topic}` : category) || "首页";
let links = [
$(".left .hynewsO h2 a").toArray(),
$(".left .list_content_c").find(".new_hy_focus_con_tit a, .new_hy_list_name a").toArray(),
$(".left").find(".nnewslistpic a, .nnewslistinfo dd a").toArray(),
$(".left .list_con .datacountTit a").toArray(),
$(".container_left").find("dd a, h1 a, ul.slideshow li a").toArray()
].flat();
if (!links.length) links = $(".left a, .container_left a").toArray();
let items = links.map((link) => {
const $link = $(link);
const url = $link.attr("href");
const urlMatch = url && url.match(/\/html\/(\d{4})\/\w+_(\d{4})\/\d+\.html/);
if (!urlMatch) return null;
return {
title: $link.text(),
link: url.startsWith("/") ? `${rootUrl}${url}` : url,
pubDate: timezone(parseDate(`${urlMatch[1]}${urlMatch[2]}`), 8)
};
}).filter(Boolean);
const uniqueItems = [];
for (const item of items) if (uniqueItems.every((uniqueItem) => uniqueItem.link !== item?.link)) uniqueItems.push(item);
items = uniqueItems.toSorted((a, b) => Number(b.pubDate) - Number(a.pubDate)).slice(0, ctx.req.query("limit") || 20);
items = await Promise.all(items.map((item) => cache_default.tryGet(item.link, async () => {
const $ = load((await got_default(item.link)).data);
let description = "";
const content = $("div.content_all");
if (content.length) content.eq(content.length - 1).contents().each((_, child) => {
const $child = $(child);
let innerHtml;
if (child.name === "div") {
innerHtml = $child.html();
innerHtml &&= innerHtml.trim();
description += !innerHtml || innerHtml === " " ? description ? "<br>" : "" : innerHtml;
} else description += $child.toString().trim();
});
else description = $("div.content div").first().html() ?? "";
description = description.replace(/\s*<br ?\/?>\s*$/, "");
const info = $(".content > em span");
return {
title: $(".content > h2").text() || item.title,
description,
pubDate: item.pubDate,
author: info.eq(1).text().replace(/^来源:/, ""),
link: item.link
};
})));
return {
title: `世界轨道交通资讯网 - ${title}`,
link: pageUrl,
item: items,
description: $("head > meta[name=\"description\"]").attr("content")
};
}
//#endregion
export { route };