rsshub
Version:
Make RSS Great Again!
82 lines (80 loc) • 3.52 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as request_in_progress_default } from "./request-in-progress-Bdms9gGw.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import "./helpers-DxBp0Pty.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import { t as timezone } from "./timezone-D8cuwzTY.mjs";
import { t as wait_default } from "./wait-Dk55sosP.mjs";
import { n as finishArticleItem } from "./wechat-mp-Dq_pp853.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?",
radar: [{ source: ["mp.data258.com/", "mp.data258.com/article/category/:id"] }],
name: "Unknown",
maintainers: ["Rongronggg9"],
handler,
url: "mp.data258.com/"
};
async function handler(ctx) {
if (await cache_default.get("data258:lock", false) === "1") throw new request_in_progress_default("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 request_in_progress_default("Another request is in progress, please try again later.");
else 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_default(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 null;
}
const $$1 = load(response.data);
return $$1("script").filter((_, e) => $$1(e).html().includes("location.href")).html().match(/location\.href='([^']+)'/)[1];
} catch (error) {
err = error;
return null;
}
});
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 };