fxtwitter-docker/src/helpers/useragent.ts
2023-10-17 04:30:35 -04:00

47 lines
2.2 KiB
TypeScript

/* We keep this value up-to-date for making our requests to Twitter as
indistinguishable from normal user traffic as possible. */
const fakeChromeVersion = 118;
const platformWindows = 'Windows NT 10.0; Win64; x64';
const platformMac = 'Macintosh; Intel Mac OS X 10_15_7';
const platformLinux = 'X11; Linux x86_64';
const platformAndroid = 'Linux; Android 10; K';
const chromeUA = `Mozilla/5.0 ({platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{version}.0.0.0 Safari/537.36`;
const edgeUA = `Mozilla/5.0 ({platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{version}.0.0.0 Safari/537.36 Edg/{version}.0.0.0`;
const chromeMobileUA = `Mozilla/5.0 ({platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{version}.0.0.0 Mobile Safari/537.36`;
const edgeMobileUA = `Mozilla/5.0 ({platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{version}.0.0.0 Mobile Safari/537.36 Edg/{version}.0.0.0`;
enum Platforms {
Windows,
Mac,
Linux,
Android
}
/* Return a random version of Chrome between current and 2 previous versions (i.e. For 109, also return 108 or 107) */
const getRandomVersion = (): number => fakeChromeVersion - Math.floor(Math.random() * 3);
export const generateUserAgent = (): [string, string] => {
const platform = Math.floor(Math.random() * 4);
const isEdge = Math.random() > 0.5;
const version = getRandomVersion();
let userAgent = isEdge ? edgeUA : chromeUA;
userAgent = userAgent.format({ version: String(version) });
const secChUaChrome = `".Not/A)Brand";v="99", "Google Chrome";v="{version}", "Chromium";v="{version}"`;
const secChUaEdge = `".Not/A)Brand";v="99", "Microsoft Edge";v="{version}", "Chromium";v="{version}"`;
const secChUa = (isEdge ? secChUaEdge : secChUaChrome).format({
version: String(version)
});
switch (platform) {
case Platforms.Mac:
return [userAgent.format({ platform: platformMac }), secChUa];
case Platforms.Linux:
return [userAgent.format({ platform: platformLinux }), secChUa];
case Platforms.Android:
userAgent = isEdge ? edgeMobileUA : chromeMobileUA;
return [userAgent.format({ platform: platformAndroid, version: String(version) }), secChUa];
default:
return [userAgent.format({ platform: platformWindows }), secChUa];
}
};