UNPKG

rsshub

Version:
143 lines (142 loc) 4.78 kB
import { t as rofetch } from "./ofetch-C3ts-Hud.mjs"; import { t as config } from "./config-CCmw1BNE.mjs"; import { t as logger } from "./logger-BKy98Y8B.mjs"; import { n as parseRelativeDate } from "./parse-date-Cr0wQjV_.mjs"; import { t as cache_default } from "./cache-BkqOokyU.mjs"; import { load } from "cheerio"; import CryptoJS from "crypto-js"; //#region lib/routes/zaker/utils.ts const hints = [ "globalThis", "headless", "languages", "permHook", "vendor", "webDriverValue", "webdriver" ]; const baseUrl = "https://www.myzaker.com"; const generateSalt = (input, targetZeros = 20) => { for (let nonce = 0; nonce < 1e8; nonce++) { const hash = CryptoJS.SHA256(input + nonce).toString(); let leadingZeros = 0; for (const char of hash) { if (char !== "0") { leadingZeros += 4 - Number.parseInt(char, 16).toString(2).length; break; } leadingZeros += 4; } if (leadingZeros >= targetZeros) return nonce; } return 0; }; const padSeed = (seed) => { const padding = "0".repeat(16); return CryptoJS.enc.Utf8.parse((seed + padding).slice(0, 16)); }; const encrypt = (data, seed) => { const iv = CryptoJS.enc.Utf8.parse("1234567890123456"); return CryptoJS.AES.encrypt(JSON.stringify(data), padSeed(seed), { iv, padding: CryptoJS.pad.Pkcs7 }); }; const encryptPayload = (data, seed) => encrypt(data, seed).ciphertext.toString(); const getSafeLineCookieWithData = async (link) => { const cacheKey = "zaker:cookie"; const cacheAge = 3600; const cacheIn = await cache_default.get(cacheKey, false); if (cacheIn) { const cookie = JSON.parse(cacheIn); return { cookie, data: await rofetch(link, { headers: { Cookie: cookie } }) }; } const apiBaseUrl = "https://challenge.rivers.chaitin.cn/captcha/api"; const headerResponse = await rofetch.raw(link); const session = headerResponse.headers.getSetCookie().find((e) => e.startsWith("sl-session"))?.split(";", 1)[0].split("sl-session=", 2)[1]; const onceId = headerResponse._data.match(/once_id:\s*"(.*?)",/)?.[1]; logger.debug(`getSafeLineCookie: sl-session=${session}, onceId=${onceId}`); if (!/window\.captcha/.test(headerResponse._data)) { logger.debug("getSafeLineCookie: Failed to get once_id"); return { cookie: headerResponse.headers.getSetCookie().map((c) => c.split(";", 1)[0]).join("; "), data: headerResponse._data }; } const seedResponse = await rofetch(`${apiBaseUrl}/seed`, { headers: { Referer: `${baseUrl}/` }, query: { once_id: onceId, v: "1.0.0", hints: hints.toSorted(() => Math.random() - .5).join(",") } }); const ua = config.ua; const seed = seedResponse.seed; const takeTime = Math.trunc(Math.random() * 2e3 + 1e3); logger.debug(`getSafeLineCookie: ua=${ua}, seed=${seed}, takeTime=${takeTime}`); const payload = encryptPayload({ resolution: "1920x1080", languages: ["en-US"], useragents: [ ua, ua, ua ], hint: 0, salt: String(generateSalt(seed, 16)), taketime: takeTime }, seed); const inspectResponse = await rofetch(`${apiBaseUrl}/inspect`, { method: "POST", headers: { Referer: `${baseUrl}/`, "Content-Type": "text/plain" }, query: { seed }, body: payload }); logger.debug(`getSafeLineCookie: inspectResponse=${JSON.stringify(inspectResponse)}`); if (inspectResponse.reason) { logger.error(`getSafeLineCookie: reason=${inspectResponse.reason}`); return { cookie: headerResponse.headers.getSetCookie().map((c) => c.split(";", 1)[0]).join("; "), data: headerResponse._data }; } const response = await rofetch.raw(link, { headers: { Cookie: `sl-session=${session}; sl_waf_recap=${inspectResponse.jwt}` } }); const cookie = response.headers.getSetCookie().map((c) => c.split(";", 1)[0]).join("; "); logger.debug(`getSafeLineCookie: ${cookie}`); cache_default.set(cacheKey, JSON.stringify(cookie), cacheAge); return { cookie, data: response._data }; }; const parseList = ($) => { return JSON.parse($("script:contains(\"window.WinPageData\")").text().match(/window\.WinPageData\s*=\s*(\{.*\})/)?.[1] ?? "{}").data.article.map((item) => ({ title: item.title, description: item.desc, link: "https:" + item.url, author: item.author_name, pubDate: parseRelativeDate(item.date, "MM月DD日"), category: item.tag.map((t) => t.tag), image: item.thumbnail_mpic })); }; const fetchItem = async (item, cookie) => { const $ = load(await rofetch(item.link, { headers: { Cookie: cookie } })); const content = $("div.article_content div"); content.find("img").each((_, img) => { const $img = $(img); $img.attr("src", $img.attr("data-original")); $img.removeAttr("data-original"); }); item.description = content.html(); return item; }; //#endregion export { parseList as i, fetchItem as n, getSafeLineCookieWithData as r, baseUrl as t };