UNPKG

rsshub

Version:
139 lines (133 loc) 5.5 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import { load } from "cheerio"; //#region lib/routes/now/news.ts const mainCategories = { local: 119, international: 120, entertainment: 500, life: 501, technology: 502, finance: 121 }; const categories = { tracker: 123, feature: 124, opinion: 125 }; const route = { path: "/news/:category?/:id?", categories: ["traditional-media"], example: "/now/news", parameters: { category: "分类,见下表,默认为首页", id: "编号,可在对应专题/节目页 URL 中找到 topicId" }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["news.now.com/home/:category?", "news.now.com/"], target: "/news/:category?" }], name: "新聞", maintainers: ["nczitzk"], handler, url: "news.now.com/", description: `::: tip **编号** 仅对事件追蹤、評論節目、新聞專題三个分类起作用,例子如下: 对于 [事件追蹤](https://news.now.com/home/tracker) 中的 [塔利班奪權](https://news.now.com/home/tracker/detail?catCode=123\&topicId=1056) 话题,其网址为 \`https://news.now.com/home/tracker/detail?catCode=123&topicId=1056\`,其中 \`topicId\` 为 1056,则对应路由为 [\`/now/news/tracker/1056\`](https://rsshub.app/now/news/tracker/1056) ::: | 首頁 | 港聞 | 兩岸國際 | 娛樂 | | ---- | ----- | ------------- | ------------- | | | local | international | entertainment | | 生活 | 科技 | 財經 | 體育 | | ---- | ---------- | ------- | ------ | | life | technology | finance | sports | | 事件追蹤 | 評論節目 | 新聞專題 | | -------- | -------- | -------- | | tracker | feature | opinion |` }; async function handler(ctx) { const { category = "", id = "" } = ctx.req.param(); const limit = Number.parseInt(ctx.req.query("limit") || "20", 10); const hasTopicId = id && Object.hasOwn(categories, category); const rootUrl = "https://news.now.com"; const pageUrl = hasTopicId ? `${rootUrl}/home/${category}/detail?catCode=${categories[category]}&topicId=${id}` : `${rootUrl}/home${category ? `/${category}` : ""}`; let apiUrl; if (hasTopicId) apiUrl = pageUrl; else if (category === "sports") apiUrl = `https://sportsapi.now.com/api/getNewsList?pageSize=${limit}&pageNo=1&searchTagsKey=allSportsSearchTags`; else if (category) apiUrl = `https://d3sli7vh0lsda4.cloudfront.net/api/getNewsList?category=${mainCategories[category]}&pageNo=1&pageSize=${limit}`; else apiUrl = pageUrl; const response = await ofetch_default(apiUrl); const isApi = typeof response === "object" && Array.isArray(response); const $ = load(response); let list; if (isApi) list = category === "sports" ? response.map((item) => { const image = item.newsPhotos?.filter((p) => p.sizeType === "3")?.map((p) => `<img src="${p.imageFileUrl}">`).join(""); return { title: item.headlineChi, description: image, link: `https://news.now.com/home/${category}/player?newsId=${item.newsId}`, pubDate: parseDate(item.publishDate, "x"), category: [ ...item.sportTypes.map((t) => t.sportTypeNameChi), ...item.players.map((p) => p.playerFullNameChi), ...item.teams.map((t) => t.teamCodeChi) ], image: item.newsPhotos?.find((p) => p.sizeType === "3")?.imageUrl, newsId: item.newsId }; }) : response.map((item) => { const image = item.image2Url ?? item.imageUrl ?? item.image3Url; return { title: item.title, description: (image ? `<img src="${image}">` : "") + item.leading + item.summary, link: `https://news.now.com/home/${category}/player?newsId=${item.newsId}`, pubDate: parseDate(item.publishDate, "x"), updated: parseDate(item.lastModifyDate, "x"), category: item.newsTags.map((t) => t.tag), image }; }); else list = $(`${category === "" ? ".homeFeaturedNews " : ".newsCategoryColLeft "}.newsTitle`).toArray().slice(0, limit).map((item) => { item = $(item); return { title: item.text(), link: `${rootUrl}${item.parent().parent().attr("href")}` }; }); const items = await Promise.all(list.map((item) => cache_default.tryGet(item.link, async () => { if (!item.pubDate || item.newsId) { const $$1 = load(await ofetch_default(item.link)); const newsData = JSON.parse($$1("script:contains(\"var newsData\")").text().match(/var newsData = (.*?);/)?.[1] || "{}"); const images = newsData.imageList ? newsData.imageList.map((img) => `<img src="${img.image2Url}">`).join("") : ""; item.description = item.description ? item.description + ($$1(".img_caption").prop("outerHTML") ?? "") + $$1(".newsLeading").html() : images + $$1(".newsLeading").html(); item.pubDate ||= parseDate(newsData.publishDate, "x"); item.updated ||= parseDate(newsData.lastModifyDate, "x"); item.category ||= [...new Set([ newsData.categoryName, ...newsData.newsTags.map((t) => t.tag), ...newsData.newsTopics.map((t) => t.topicName) ])]; } return item; }))); return { title: Object.hasOwn(categories, category) ? $("title").text() : ($(".smallSpace.active").text() || "首頁") + " | Now 新聞", link: pageUrl, item: items }; } //#endregion export { route };