rsshub
Version:
Make RSS Great Again!
91 lines (89 loc) • 4.2 kB
JavaScript
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 };