rsshub
Version:
Make RSS Great Again!
63 lines (62 loc) • 2.49 kB
JavaScript
import { HeaderGenerator, PRESETS, PRESETS as PRESETS$1 } from "header-generator";
//#region lib/utils/header-generator.ts
/**
* Checks if the generated headers are valid (no unwanted UA strings, required headers present)
*
* @param {Record<string, string>} headers The generated headers to validate
* @param {string} browser The browser type (used to determine which filters to apply)
* @returns {boolean} True if the headers are valid
*/
const isValidHeader = (headers, browser) => {
browser = browser.toLowerCase();
const userAgent = headers["user-agent"];
if (browser === "chrome") {
if (userAgent.includes("Chrome-Lighthouse") || userAgent.includes("Gener8") || userAgent.includes("HeadlessChrome") || userAgent.includes("SMTBot") || userAgent.includes("Electron") || userAgent.includes("Code")) return false;
if (!(headers["sec-ch-ua"] && headers["sec-ch-ua-mobile"] && headers["sec-ch-ua-platform"])) return false;
}
return !(browser === "safari" && userAgent.includes("Applebot"));
};
/**
* @param {Partial<HeaderGeneratorOptions>} preset Preset from header-generator package (defaults to PRESETS.MODERN_MACOS_CHROME)
* @returns Headers object with user-agent and additional headers
*/
const generatorCache = /* @__PURE__ */ new Map();
const generateHeaders = (preset = PRESETS.MODERN_MACOS_CHROME) => {
const cacheKey = JSON.stringify(preset);
let generator = generatorCache.get(cacheKey);
if (!generator) {
generator = new HeaderGenerator(preset);
generatorCache.set(cacheKey, generator);
}
let headers = generator.getHeaders();
const userAgent = headers["user-agent"];
let detectedBrowser;
if (userAgent.includes("Firefox")) detectedBrowser = "firefox";
else if (userAgent.includes("Safari") && !userAgent.includes("Chrome")) detectedBrowser = "safari";
else detectedBrowser = "chrome";
let attempts = 0;
while (!isValidHeader(headers, detectedBrowser) && attempts < 10) {
headers = generator.getHeaders();
attempts++;
}
return headers;
};
/** List of headers to include from header-generator output
* excluding headers that are typically set manually or by the environment
*/
const generatedHeaders = /* @__PURE__ */ new Set([
"sec-ch-ua",
"sec-ch-ua-mobile",
"sec-ch-ua-platform",
"upgrade-insecure-requests",
"accept",
"sec-fetch-site",
"sec-fetch-mode",
"sec-fetch-user",
"sec-fetch-dest",
"accept-encoding",
"accept-language",
"priority"
]);
//#endregion
export { generateHeaders as n, generatedHeaders as r, PRESETS$1 as t };