Check whether your browser is a bot

Pass: 1/10, Fail: 0

<script type="text/javascript">
	const iframe = document.createElement("iframe");
	iframe.setAttribute("sandbox", "allow-scripts");
	iframe.src = "https://d1exrvfwzmo830.cloudfront.net/checkbox-iframe.html";
	wrapper.querySelector(".tab-pane").appendChild(iframe);

	window.addEventListener('message', function (ev) {
		if (!ev.data || ev.data.type !== 'bot-check-click') return;
		if (ev.data.screenY > 100) {
			success("");
		} else {
			fail("");
		}
	});
</script>

<div class="iframe-contents">
	<input id="click-me-box" type="checkbox"/>
	<label for="click-me-box">Click Me</label>
	<script type="text/javascript">
		document.getElementById('click-me-box').addEventListener('click', (e) => {
			parent.postMessage({
				type: 'bot-check-click',
				screenX: e.screenX,
				screenY: e.screenY
			}, '*');
		});
	</script>
</div>
Your network connection does not support HTTP3. You are probably using a proxy. Detected HTTP version: 2.0
<script type="text/javascript">
	const brands = navigator.userAgentData?.brands || [];
	const brandNames = brands.map(b => b.brand.toLowerCase());

	let name = "unknown";
	if (brandNames.some(b => b.includes('edge'))) name = 'edge';
	else if (brandNames.some(b => b.includes('brave'))) name = 'brave';
	else if (brandNames.some(b => b.includes('opera') || b.includes('opr'))) name = 'opera';
	else if (brandNames.some(b => b.includes('chrome'))) name = 'chrome';
	else if (brandNames.some(b => b.includes('chromium'))) name = 'chromium';
	else if (brandNames.some(b => b.includes('safari'))) name = 'safari';

	if (name === "unknown") {
		if (/firefox/i.test(navigator.userAgent)) {
			name = 'firefox';
		}
	}

	if (name === "chrome" || name === "edge") {
		success(name);
	} else {
		fail(`Detected ${name} browser. Chrome and Edge cover 80% of desktop browser market share. Any other browser at large scale scraping will stand out as Bart Simpsons head. Also too much work to implement these tests for every browser.`);
	}
</script>
<script type="text/javascript">
	if (navigator.userAgentData) {
		const brands = navigator.userAgentData.brands;
		const chromeVersion = parseInt(brands.find(b => b.brand.includes('Chromium')).version, 10);

		const baseVersion = 142;
		const currentDate = new Date();
		const monthsPassed = (currentDate.getFullYear() - 2025) * 12 + (currentDate.getMonth() - 10);

		const currentChromeVersion = baseVersion + monthsPassed;

		if (chromeVersion >= currentChromeVersion - 1) {
			success("Chrome version " + chromeVersion);
		} else {
			fail("Chrome version too old. Yours: " + chromeVersion + " Expected: " + (currentChromeVersion - 1) + "+");
		}
	}
</script>
<script type="text/javascript">
	const platform = navigator.platform;

	if (platform === "Win32" || platform === "MacIntel") {
		success(platform);
	} else {
		fail(`Detected ${platform}. Windows and OSX cover 80% of desktop browser market share. Any other browser at large scale scraping will stand out as Bart Simpsons head.`);
	}
</script>
<script type="text/javascript">
	let result;
	try {
		result = Function.prototype.toString.call(Function.prototype.toString);
	} catch (e) {
		result = e.toString();
	}

	if (result === "function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	let result;
	try {
		result = Date.prototype.toString.call(Function.prototype.toString);
	} catch (e) {
		result = e.toString();
	}

	if (result === "TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	let result;
	try {
		result = Intl.Locale.prototype.toString.call(Function.prototype.toString);
	} catch (e) {
		result = e.toString();
	}

	if (result === "TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	const frame = document.createElement('iframe');
	document.body.appendChild(frame);

	let result;
	try {
		result = frame.contentWindow.Function.prototype.toString.call(Function.prototype.toString);

	} catch (e) {
		result = e.toString();
	}

	if (result === "function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	const frame = document.createElement('iframe');
	document.body.appendChild(frame);

	let result;
	try {
		result = frame.contentWindow.Date.prototype.toString.call(Function.prototype.toString);

	} catch (e) {
		result = e.toString();
	}

	if (result === "TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	const frame = document.createElement('iframe');
	document.body.appendChild(frame);

	let result;
	try {
		result = frame.contentWindow.Intl.Locale.prototype.toString.call(Function.prototype.toString);

	} catch (e) {
		result = e.toString();
	}

	if (result === "TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	const frame = document.createElement('iframe');
	document.body.appendChild(frame);

	let result;
	try {
		result = Function.prototype.toString.call(frame.contentWindow.Function.prototype.toString);

	} catch (e) {
		result = e.toString();
	}

	if (result === "function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	const frame = document.createElement('iframe');
	document.body.appendChild(frame);

	let result;
	try {
		result = Date.prototype.toString.call(frame.contentWindow.Function.prototype.toString);

	} catch (e) {
		result = e.toString();
	}

	if (result === "TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">
	const frame = document.createElement('iframe');
	document.body.appendChild(frame);

	let result;
	try {
		result = Intl.Locale.prototype.toString.call(frame.contentWindow.Function.prototype.toString);

	} catch (e) {
		result = e.toString();
	}

	if (result === "TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }") {
		success(result);
	} else {
		failExpected("TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
	}
</script>
<script type="text/javascript">

	const originalObjectApply = Object.apply;
	const originalReflectApply = Reflect.apply;

	let trapped = false;
	Object.apply = function () {
		trapped = true;
		return originalObjectApply.apply(this, arguments);
	};
	Reflect.apply = function () {
		trapped = true;
		return originalReflectApply.apply(this, arguments);
	};

	try {
		Function.prototype.toString.toString();
	} catch (e) {
		trapped = true;
	}


	if (!trapped) {
		success("OK");
	} else {
		fail("trapped apply call");
	}
</script>
<script type="text/javascript">
	const canvas = document.createElement("canvas");
	const gl = canvas.getContext("webgl");
	const debugExt = gl.getExtension('WEBGL_debug_renderer_info');
	const vendor = gl.getParameter(debugExt.UNMASKED_VENDOR_WEBGL);
	const vendorLower = vendor.toLowerCase();

	if (vendorLower.includes('amd') || vendorLower.includes('nvidia') || vendorLower.includes('intel')) {
		success(vendor);
	} else if (vendor === "Google Inc. (Google)") {
		fail(`Detected ${vendor}. You are running Chrome with --disable-gpu`);
	} else {
		fail(`Detected ${vendor}`);
	}
</script>
<script type="text/javascript">
	const canvas = document.createElement("canvas");
	const gl = canvas.getContext("webgl");
	const debugExt = gl.getExtension('WEBGL_debug_renderer_info');
	const renderer = gl.getParameter(debugExt.UNMASKED_RENDERER_WEBGL);
	const rendererLower = renderer.toLowerCase();

	if (rendererLower.includes('amd') || rendererLower.includes('nvidia') || rendererLower.includes('intel')) {
		success(renderer);
	} else if (rendererLower.includes('swiftshader')) {
		fail(`Detected ${renderer}. You are running Chrome with --disable-gpu`);
	} else {
		fail(`Detected ${renderer}`);
	}
</script>
<script type="text/javascript">
	const canvas = document.createElement("canvas");
	const gl = canvas.getContext("webgl", {failIfMajorPerformanceCaveat: true});

	if (gl) {
		success("failIfMajorPerformanceCaveat: true");
	} else {
		fail("failIfMajorPerformanceCaveat: false");
	}
</script>
<script type="text/javascript">

	const canvas = document.createElement("canvas");
	const gl = canvas.getContext("webgl");

	const result = Function.prototype.toString.apply(gl.getParameter);

	if (result === "function getParameter() { [native code] }") {
		success(result);
	} else {
		failExpected("function getParameter() { [native code] }", result);
	}
</script>
<script type="text/javascript">

	const canvas = document.createElement("canvas");
	const gl = canvas.getContext("webgl");
	const extensions = gl.getSupportedExtensions();
	const canvas2 = document.createElement("canvas");
	const gl2 = canvas2.getContext("webgl2");
	const extensions2 = gl2.getSupportedExtensions();

	const result = Function.prototype.toString.apply(gl.getParameter);

	if (JSON.stringify(extensions) !== JSON.stringify(extensions2)) {
		success("webgl and webgl2 extensions differ");
	} else {
		fail("webgl and webgl2 extensions are the same");
	}
</script>
<script type="text/javascript">
	if (navigator.gpu && await navigator.gpu.requestAdapter()) {
		success("WebGPU available");
	} else {
		fail("WebGPU unavailable");
	}
</script>
<script type="text/javascript">
	const vendor = (await navigator.gpu.requestAdapter()).info.vendor.toLowerCase();
	if (['intel', 'amd', 'nvidia', 'apple'].includes(vendor)) {
		success(vendor);
	} else {
		fail(vendor);
	}
</script>
<script type="text/javascript">

	if (navigator.platform === 'Linux x86_64') {
		success('Skipping');
		return;
	}

	const testString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

	function fontPresent(fontName) {
		const canvas = document.createElement('canvas');
		const ctx = canvas.getContext('2d');
		ctx.font = '72px monospace';
		const baseline = ctx.measureText(testString).width;
		ctx.font = `72px "${fontName}", monospace`;
		const width = ctx.measureText(testString).width;
		return width !== baseline;
	}

	const fonts = ["DejaVu Sans","DejaVu Serif","DejaVu Sans Mono","Bitstream Vera Sans","Bitstream Vera Serif","Bitstream Vera Sans Mono"];
	const foundAll = fonts.filter(fontPresent);

	if (foundAll.length) {
		fail('Found Linux fonts: ' + foundAll.join(', '));
	} else {
		success('No Linux fonts found');
	}
</script>
<script type="text/javascript">

	if (navigator.platform === 'Win32') {
		success('Skipping');
		return;
	}

	const testString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

	function fontPresent(fontName) {
		const canvas = document.createElement('canvas');
		const ctx = canvas.getContext('2d');
		ctx.font = '72px monospace';
		const baseline = ctx.measureText(testString).width;
		ctx.font = `72px "${fontName}", monospace`;
		const width = ctx.measureText(testString).width;
		return width !== baseline;
	}

	const fonts = ["Arial Narrow","Trebuchet MS","Microsoft Sans Serif","Comic Sans MS"];
	const foundAll = fonts.filter(fontPresent);

	if (foundAll.length) {
		fail('Found Windows fonts: ' + foundAll.join(', '));
	} else {
		success('No Windows fonts found');
	}
</script>
<script type="text/javascript">

	if (navigator.platform === 'MacIntel') {
		success('Skipping');
		return;
	}

	const testString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

	function fontPresent(fontName) {
		const canvas = document.createElement('canvas');
		const ctx = canvas.getContext('2d');
		ctx.font = '72px monospace';
		const baseline = ctx.measureText(testString).width;
		ctx.font = `72px "${fontName}", monospace`;
		const width = ctx.measureText(testString).width;
		return width !== baseline;
	}

	const fonts = ["Apple Chancery","San Francisco","American Typewriter","Apple Symbols","Apple SD Gothic Neo Bold","AppleGothic Regular"];
	const foundAll = fonts.filter(fontPresent);

	if (foundAll.length) {
		fail('Found MacOS fonts: ' + foundAll.join(', '));
	} else {
		success('No MacOS fonts found');
	}
</script>