UNPKG

rsshub

Version:
91 lines (89 loc) 4.2 kB
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs"; import { t as cache_default } from "./cache-BkqOokyU.mjs"; import { t as RequestInProgressError } from "./request-in-progress-BjSkP8tJ.mjs"; import { t as got_default } from "./got-BTowW50G.mjs"; import { t as timezone } from "./timezone-BBvDwS_3.mjs"; import { r as finishArticleItem } from "./wechat-mp-BPi_ETC7.mjs"; import { t as wait } from "./wait-Do273esS.mjs"; import { load } from "cheerio"; //#region lib/routes/wechat/data258.ts const parsePage = ($item, hyperlinkSelector, timeSelector) => { const hyperlink = $item.find(hyperlinkSelector); return { title: hyperlink.text(), link: hyperlink.attr("href"), pubDate: timezone(parseDate($item.find(timeSelector).text(), "YYYY-MM-DD HH:mm"), 8) }; }; const route = { path: "/data258/:id?", categories: ["new-media"], example: "/wechat/data258/gh_cbbad4c1d33c", parameters: { id: "公众号 id 或分类 id,可在公众号页或分类页 URL 中找到;若略去,则抓取首页" }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: true, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["mp.data258.com/", "mp.data258.com/article/category/:id"] }], name: "公众号(微阅读来源)", maintainers: ["Rongronggg9"], handler, url: "mp.data258.com/", description: `::: warning 由于使用了一些针对反爬的缓解措施,本路由响应较慢。默认只抓取前 5 条,可通过 \`?limit=\` 改变(不推荐,容易被反爬)。 该网站使用 IP 甄别访客,且应用严格的每日阅读量限额(约 15 次),请自建并确保正确配置缓存;如使用内存缓存而非 Redis 缓存,请增大缓存容量。该限额足够订阅至少 3 个公众号(假设公众号每日仅更新一次);首页 / 分类页更新相当频繁,不推荐订阅。 :::` }; async function handler(ctx) { if (await cache_default.get("data258:lock", false) === "1") throw new RequestInProgressError("Another request is in progress, please try again later."); const id = ctx.req.param("id"); const limit = ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) : 5; const rootUrl = "https://mp.data258.com"; const pageUrl = id ? `${rootUrl}/article/category/${id}` : rootUrl; const $ = load((await got_default(pageUrl)).data); const title = $("head title").text(); const description = $("meta[name=\"description\"]").attr("content"); const categoryPage = $("ul.fly-list"); let items = categoryPage && categoryPage.length ? $(categoryPage).find("li").toArray().map((item) => parsePage($(item), "h2 a", ".fly-list-info span")) : $("ul.jie-row li").toArray().map((item) => parsePage($(item), "a.jie-title", ".layui-hide-xs")); items = items.slice(0, limit); if (await cache_default.get("data258:lock", false) === "1") throw new RequestInProgressError("Another request is in progress, please try again later."); await cache_default.set("data258:lock", "1", 60); let err; for (const item of items) { const cacheId = item.link.match(/id=([\da-f]+)/)[1]; item.link = item.link.startsWith("http") ? item.link : `${rootUrl}${item.link}`; const realLink = await cache_default.tryGet(`data258:${cacheId}`, async () => { try { await wait(1e3); const response = await got_default.get(item.link, { headers: { Referer: pageUrl } }); if (response.data.includes("今日浏览次数已达上限")) { err = new got_default.RequestError(response.data, {}, response.request); return ""; } const $ = load(response.data); return $("script").filter((_, e) => $(e).html().includes("location.href")).html().match(/location\.href='([^']+)'/)[1]; } catch (error) { err = error; return ""; } }); if (realLink) item.link = realLink; else break; } await cache_default.set("data258:lock", "0", 1); items = items.filter((item) => item.link.match(/^https?:\/\/mp\.weixin\.qq\.com\/s/)); if (items.length === 0 && err) throw err; await Promise.all(items.map((item) => finishArticleItem(item, !!categoryPage))); return { title, link: pageUrl, description, item: items }; } //#endregion export { route };