detectVM: function () {
var userAgent = navigator.userAgent;
var hardwareConcurrency = navigator.hardwareConcurrency || 1;
var maxTouchPoints = navigator.maxTouchPoints || 0;
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (userAgent.includes('VirtualBox') || userAgent.includes('VMware')) {
return true;
};
if (hardwareConcurrency < 4 && maxTouchPoints < 5) {
return true;
};
if (gl && gl instanceof WebGLRenderingContext) {
var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
if (debugInfo) {
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
if (renderer.indexOf('llvmpipe') > -1 || renderer.indexOf('Mesa') > -1) {
return true;
};
};
};
if (/puppeteer|selenium/i.test(navigator.userAgent)) {
return true;
};
if (window._phantom || window.__nightmare || window.navigator.webdriver) {
return true;
};
if (navigator.platform.includes('Mac') && userAgent.includes('iPhone') ||
navigator.platform.includes('Android') && userAgent.includes('Linux')) {
return /(simulator|x86_64)/.test(userAgent);
};
return false;
},