UNPKG

rsshub

Version:
97 lines (96 loc) 3.77 kB
import { t as logger } from "./logger-BKy98Y8B.mjs"; import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs"; import { t as cache_default } from "./cache-BkqOokyU.mjs"; import { n as setCookies, t as getCookies } from "./playwright-utils-BWuSHbXD.mjs"; import { load } from "cheerio"; //#region lib/routes/cw/utils.ts let cookie; const baseUrl = "https://www.cw.com.tw"; const pathMap = { today: { pageUrl: () => "/today", limit: 30 }, master: { pageUrl: (channel) => `/masterChannel.action?idMasterChannel=${channel}`, limit: 12 }, sub: { pageUrl: (channel) => `/subchannel.action?idSubChannel=${channel}`, limit: 12 }, author: { pageUrl: (channel) => `/author/${channel}`, limit: 10 } }; const getCookie = async (context) => { if (!cookie) cookie = await cache_default.tryGet("cw:cookie", async () => { const page = await context.newPage(); await page.route("**/*", (route) => { const request = route.request(); request.resourceType() === "document" || request.resourceType() === "script" ? route.continue() : route.abort(); }); logger.http(`Requesting ${baseUrl}/user/get/cookie-bar`); await page.goto(`${baseUrl}/user/get/cookie-bar`, { waitUntil: "domcontentloaded" }); cookie = await getCookies(page); await page.close(); return cookie; }); return cookie; }; const parsePage = async (path, context, ctx) => { const pageUrl = `${baseUrl}${pathMap[path].pageUrl(ctx.req.param("channel"))}`; const cookie = await getCookie(context); const page = await context.newPage(); await page.route("**/*", (route) => { const request = route.request(); request.resourceType() === "document" || request.resourceType() === "script" ? route.continue() : route.abort(); }); await setCookies(page, cookie, "cw.com.tw"); logger.http(`Requesting ${pageUrl}`); await page.goto(pageUrl, { waitUntil: "domcontentloaded" }); await page.waitForSelector(".caption"); const response = await page.evaluate(() => document.documentElement.getHTML()); await page.close(); const $ = load(response); const list = parseList($, ctx.req.query("limit") ? Number(ctx.req.query("limit")) : pathMap[path].limit); return { $, items: await parseItems(list, context) }; }; const parseList = ($, limit) => $(".caption").toArray().map((item) => { const $item = $(item); return { title: $item.find("h3").text(), link: $item.find("h3 a").attr("href"), pubDate: parseDate($item.find("time").text()) }; }).slice(0, limit); const parseItems = (list, context) => Promise.all(list.map((item) => cache_default.tryGet(item.link, async () => { const page = await context.newPage(); await page.route("**/*", (route) => { const request = route.request(); request.resourceType() === "document" || request.resourceType() === "script" ? route.continue() : route.abort(); }); await page.goto(item.link, { waitUntil: "domcontentloaded" }); const response = await page.evaluate(() => document.documentElement.getHTML()); await page.close(); const $ = load(response); const meta = JSON.parse($("head script[type=\"application/ld+json\"]:contains(\"NewsArticle\")").first().text()); $(".article__head .breadcrumb, .article__head h1, .article__provideViews, .ad").remove(); $("img.lazyload").each((_, img) => { if (!img.attribs["data-src"]) return; img.attribs.src = img.attribs["data-src"]; delete img.attribs["data-src"]; }); item.title = $("head title").text(); item.category = $("meta[name=keywords]").attr("content").split(","); item.pubDate = parseDate(meta.datePublished); item.author = Array.isArray(meta.author) ? meta.author : meta.author.name; item.description = $(".article__head .container").html() + $(".article__content").html(); return item; }))); //#endregion export { parsePage as n, baseUrl as t };