Python - Scraping Distil Protected Sites?

Status
Not open for further replies.

maxutil

Newbie
Joined
Nov 18, 2017
Messages
15
Reaction score
3
Hello all,

I'm wondering if someone can help me circumvent Distil protection on a website I'm trying to scrape. I've done researching over a month now, and haven't been able to find an answer. Researching the answer to this is what actually brought me to BHW :)

I've successfully built one scraper before but it's for a site that doesn't have Distil tracking.

Distil is able to detect that I'm a bot from just opening the webpage a few times (no crazy fast clicking or anything). I'm using selenium and Chrome webdriver, and from the research I've done, Distil is able to determine that the webdriver from selenium is operating the site, and not a normal user.

Any help would be appreciated.
 
This may or may not work. I made a web based anonimizer script / bot. That redirects through kproxy . I'm tired of trying to paste it here. I can't post links yet so.

you can go here and see the script and tutorial:

mipython.com

Please like or comment if it's useful.

Let me know if that works.
 
Hello all,

I'm wondering if someone can help me circumvent Distil protection on a website I'm trying to scrape. I've done researching over a month now, and haven't been able to find an answer. Researching the answer to this is what actually brought me to BHW :)

I've successfully built one scraper before but it's for a site that doesn't have Distil tracking.

Distil is able to detect that I'm a bot from just opening the webpage a few times (no crazy fast clicking or anything). I'm using selenium and Chrome webdriver, and from the research I've done, Distil is able to determine that the webdriver from selenium is operating the site, and not a normal user.

Any help would be appreciated.

Unfortunately for you, Distil Networks have created anti-bot protection system that will repel approximately 95-99% of users that attempt to scrape their clients site.

The mechanism is extremely simple on the client side, they deploy a simple javascript script that hashes your browser with your cpu class, operating system, browser plugins, the build number of the browser, screen width and height, and even color depth amongst other things.

They also check if cookies are enabled or not. You are using Selenium which is extremely easy to detect with javascript.

Which brings me back to my first sentence, the 95-99% of users attempting to get through Distil Networks will only know how to use Selenium or a headless browser, then the other 1-5% will know how to send requests. However, after sending requests you still need to simulate the Distil Networks javascript code , else your IP will get marked as a bot due to the fact that you never executed their javascript client script.

If you can block the majority of users that use Selenium or a Headless browser, and the small amount of other users that will hit the site directly without executing the javascript script, then you can effectively remove 99% of threat actors.
 
You are going to need a developer to do some black magic with the headers while also maintaining cookies session. It's not impossible, but the expertise would cost ya.
 
You are going to need a developer to do some black magic with the headers while also maintaining cookies session. It's not impossible, but the expertise would cost ya.

Have you actually looked at the Distil Network javascript file that is served from within the website?

Code:
! function e(t, n, r) {
    function a(o, s) {
        if (!n[o]) {
            if (!t[o]) {
                var c = "function" == typeof require && require;
                if (!s && c) return c(o, !0);
                if (i) return i(o, !0);
                var u = new Error("Cannot find module '" + o + "'");
                throw u.code = "MODULE_NOT_FOUND", u
            }
            var d = n[o] = {
                exports: {}
            };
            t[o][0].call(d.exports, function(e) {
                var n = t[o][1][e];
                return a(n ? n : e)
            }, d, d.exports, e, t, n, r)
        }
        return n[o].exports
    }
    for (var i = "function" == typeof require && require, o = 0; o < r.length; o++) a(r[o]);
    return a
}({
    1: [function(e, t, n) {
        var r = e("./sha1"),
            a = function(e) {
                var t = {
                    hashImages: !0
                };
                this.options = this.extend(e, t), this.nativeForEach = Array.prototype.forEach, this.nativeMap = Array.prototype.map
            };
        a.prototype = {
            extend: function(e, t) {
                if (null == e) return t;
                for (var n in e) null != e[n] && t[n] !== e[n] && (t[n] = e[n]);
                return t
            },
            interrogate: function(e) {
                var t = {};
                t = this.userAgentKey(t), t = this.languageKey(t), t = this.screenKey(t), t = this.timezoneKey(t), t = this.indexedDbKey(t), t = this.addBehaviorKey(t), t = this.openDatabaseKey(t), t = this.cpuClassKey(t), t = this.platformKey(t), t = this.doNotTrackKey(t), t = this.pluginsKey(t), t = this.canvasKey(t), t = this.webglKey(t), t = this.touchSupportKey(t), t = this.videoKey(t), t = this.audioKey(t), this.keys = t, this.parallel([this.fontsKey], e)
            },
            userAgentKey: function(e) {
                return this.options.excludeUserAgent ? e : (e.userAgent = this.getUserAgent(), e)
            },
            getUserAgent: function() {
                return window.navigator.userAgent
            },
            languageKey: function(e) {
                return this.options.excludeLanguage ? e : (e.language = navigator.language, e)
            },
            screenKey: function(e) {
                return this.options.excludeScreen ? e : (e.screen = this.getScreen(e), e)
            },
            getScreen: function() {
                var e = {};
                return e.width = screen.width, e.height = screen.height, screen.availWidth && screen.availHeight && (e.availHeight = screen.availHeight, e.availWidth = screen.availWidth), e
            },
            timezoneKey: function(e) {
                return this.options.excludeTimezone ? e : (e.timezone = (new Date).getTimezoneOffset() / -60, e)
            },
            indexedDbKey: function(e) {
                return this.options.excludeIndexedDB || this.options.excludeIndexedDb ? e : (e.indexedDb = this.hasIndexedDb(), e)
            },
            hasIndexedDb: function() {
                return !!window.indexedDB
            },
            addBehaviorKey: function(e) {
                return this.options.excludeAddBehavior ? e : (e.addBehavior = this.hasAddBehavior(), e)
            },
            hasAddBehavior: function() {
                return !!document.body.addBehavior
            },
            openDatabaseKey: function(e) {
                return this.options.excludeOpenDatabase ? e : (e.openDatabase = this.hasOpenDatabase(), e)
            },
            hasOpenDatabase: function() {
                return !!window.openDatabase
            },
            cpuClassKey: function(e) {
                return this.options.excludeCpuClass ? e : (e.cpuClass = this.getNavigatorCpuClass(), e)
            },
            getNavigatorCpuClass: function() {
                return navigator.cpuClass ? navigator.cpuClass : "unknown"
            },
            platformKey: function(e) {
                return this.options.excludePlatform ? e : (e.platform = this.getNavigatorPlatform(), e)
            },
            getNavigatorPlatform: function() {
                return navigator.platform ? navigator.platform : "unknown"
            },
            doNotTrackKey: function(e) {
                return this.options.excludeDoNotTrack ? e : (e.doNotTrack = this.getDoNotTrack(), e)
            },
            getDoNotTrack: function() {
                return navigator.doNotTrack ? navigator.doNotTrack : "unknown"
            },
            pluginsKey: function(e) {
                return this.options.excludePlugins ? e : (e.plugins = this.isIE() ? this.getIEPlugins() : this.getPlugins(), e)
            },
            getPlugins: function() {
                for (var e = [], t = 0, n = navigator.plugins.length; n > t; ++t) e.push(navigator.plugins[t]);
                return e = e.sort(function(e, t) {
                    return e.name > t.name ? 1 : e.name < t.name ? -1 : 0
                }), this.map(e, function(e) {
                    var t = this.map(e, function(e) {
                        return [e.type, e.suffixes].join("~")
                    }).join(",");
                    return [e.name, e.description, t].join("::")
                }, this).join(";")
            },
            getIEPlugins: function() {
                if (window.ActiveXObject) {
                    var e = ["AcroPDF.PDF", "Adodb.Stream", "AgControl.AgControl", "DevalVRXCtrl.DevalVRXCtrl.1", "MacromediaFlashPaper.MacromediaFlashPaper", "Msxml2.DOMDocument", "Msxml2.XMLHTTP", "PDF.PdfCtrl", "QuickTime.QuickTime", "QuickTimeCheckObject.QuickTimeCheck.1", "RealPlayer", "RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)", "RealVideo.RealVideo(tm) ActiveX Control (32-bit)", "Scripting.Dictionary", "SWCtl.SWCtl", "Shell.UIHelper", "ShockwaveFlash.ShockwaveFlash", "Skype.Detection", "TDCCtl.TDCCtl", "WMPlayer.OCX", "rmocx.RealPlayer G2 Control", "rmocx.RealPlayer G2 Control.1"];
                    return this.map(e, function(e) {
                        try {
                            return new ActiveXObject(e), e
                        } catch (t) {
                            return null
                        }
                    }).join(";")
                }
                return ""
            },
            canvasKey: function(e) {
                return this.options.excludeCanvas ? void 0 : (e.canvas = this.isCanvasSupported() ? this.getCanvasFp() : "unsupported", e)
            },
            isCanvasSupported: function() {
                var e = document.createElement("canvas");
                return !(!e.getContext || !e.getContext("2d"))
            },
            getCanvasFp: function() {
                var e = {},
                    t = document.createElement("canvas");
                t.width = 600, t.height = 160, t.style.display = "inline";
                var n = t.getContext("2d");
                n.rect(1, 1, 11, 11), n.rect(3, 3, 7, 7), e.winding = n.isPointInPath(6, 6, "evenodd") === !1 ? "yes" : "no", e.towebp = !1;
                try {
                    var a = document.createElement("canvas");
                    a.width = 1, a.height = 1, e.towebp = 0 === a.toDataURL("image/webp").indexOf("data:image/webp")
                } catch (i) {
                    e.towebp = "error"
                }
                e.blending = function() {
                    var e = document.createElement("canvas").getContext("2d");
                    try {
                        return e.globalCompositeOperation = "screen", "screen" === e.globalCompositeOperation
                    } catch (t) {
                        return !1
                    }
                }(), n.textBaseline = "alphabetic", n.fillStyle = "#f60", n.fillRect(125, 1, 62, 20), n.fillStyle = "#069", n.font = "11pt Arial", n.fillText("Cwm fjordbank glyphs vext quiz, ", 2, 15), n.fillStyle = "rgba(102, 204, 0, 0.7)", n.font = "18pt Arial", n.fillText("Cwm fjordbank glyphs vext quiz, ", 4, 45);
                try {
                    n.globalCompositeOperation = "multiply"
                } catch (i) {}
                return n.fillStyle = "rgb(255,0,255)", n.beginPath(), n.arc(50, 50, 50, 0, 2 * Math.PI, !0), n.closePath(), n.fill(), n.fillStyle = "rgb(0,255,255)", n.beginPath(), n.arc(100, 50, 50, 0, 2 * Math.PI, !0), n.closePath(), n.fill(), n.fillStyle = "rgb(255,255,0)", n.beginPath(), n.arc(75, 100, 50, 0, 2 * Math.PI, !0), n.closePath(), n.fill(), n.fillStyle = "rgb(255,0,255)", n.arc(75, 75, 75, 0, 2 * Math.PI, !0), n.arc(75, 75, 25, 0, 2 * Math.PI, !0), n.fill("evenodd"), this.options.hashImages ? e.img = r(t.toDataURL()) : e.img = t.toDataURL(), e
            },
            fontsKey: function(e, t, n) {
                return n.options.excludeFonts ? void t() : void n.getFonts(e, t, n)
            },
            getFonts: function(e, t) {
                setTimeout(function() {
                    var n = ["monospace", "sans-serif", "serif"],
                        r = "mmmmmmmmlli",
                        a = "72px";
                    try {
                        if (!document.getElementById("d__fFH")) {
                            var i = document.createElement("div");
                            i.id = "d__fFH", i.style.position = "absolute", i.style.top = "-5000px", i.style.left = "-5000px", i.innerHTML = '<object id="d_dlg" classid="clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b" width="0px" height="0px"></object><span id="d__fF" style="font-family:serif;font-size:200px;visibility:hidden"></span>', document.body.appendChild(i)
                        }
                    } catch (o) {}
                    try {
                        var s = document.getElementById("d__fF");
                        s.style.fontSize = a, s.innerHTML = r;
                        var c = {},
                            u = {};
                        for (var d in n) s.style.fontFamily = n[d], c[n[d]] = s.offsetWidth, u[n[d]] = s.offsetHeight;
                        for (var l = function(e) {
                                for (var t in n)
                                    if (s.style.fontFamily = e + "," + n[t], s.offsetWidth !== c[n[t]] || s.offsetHeight !== u[n[t]]) return !0;
                                return !1
                            }, g = ["ARNOPRO", "AgencyFB", "ArabicTypesetting", "ArialUnicodeMS", "AvantGardeBkBT", "BankGothicMdBT", "Batang", "BitstreamVeraSansMono", "Calibri", "Century", "CenturyGothic", "Clarendon", "EUROSTILE", "FranklinGothic", "FuturaBkBT", "FuturaMdBT", "GOTHAM", "GillSans", "HELV", "Haettenschweiler", "HelveticaNeue", "Humanst521BT", "Leelawadee", "LetterGothic", "LevenimMT", "LucidaBright", "LucidaSans", "MSMincho", "MSOutlook", "MSReferenceSpecialty", "MSUIGothic", "MTExtra", "MYRIADPRO", "Marlett", "MeiryoUI", "MicrosoftUighur", "MinionPro", "MonotypeCorsiva", "PMingLiU", "Pristina", "SCRIPTINA", "SegoeUILight", "Serifa", "SimHei", "SmallFonts", "Staccato222BT", "TRAJANPRO", "UniversCE55Medium", "Vrinda", "ZWAdobeF"], h = [], p = 0, f = g.length; f > p; ++p) l(g[p]) && h.push(g[p]);
                        e.fonts = h.join(";")
                    } catch (o) {
                        e.fonts = ";"
                    }
                    t()
                }, 1)
            },
            videoKey: function(e) {
                return this.options.excludeVideo ? e : (e.video = this.getVideo(), e)
            },
            getVideo: function() {
                var e = document.createElement("video"),
                    t = !1;
                try {
                    (t = !!e.canPlayType) && (t = new Boolean(t), t.ogg = e.canPlayType('video/ogg; codecs="theora"'), t.h264 = e.canPlayType('video/mp4; codecs="avc1.42E01E"'), t.webm = e.canPlayType('video/webm; codecs="vp8, vorbis"'))
                } catch (n) {
                    return "errored"
                }
                return t ? {
                    ogg: t.ogg,
                    h264: t.h264,
                    webm: t.webm
                } : !1
            },
            audioKey: function(e) {
                return this.options.excludeAudio ? e : (e.audio = this.getAudio(), e)
            },
            getAudio: function() {
                var e = document.createElement("audio"),
                    t = !1;
                return (t = !!e.canPlayType) && (t = new Boolean(t), t.ogg = e.canPlayType('audio/ogg; codecs="vorbis"') || "nope", t.mp3 = e.canPlayType("audio/mpeg;") || "nope", t.wav = e.canPlayType('audio/wav; codecs="1"') || "nope", t.m4a = e.canPlayType("audio/x-m4a;") || e.canPlayType("audio/aac;") || "nope"), t ? {
                    ogg: t.ogg,
                    mp3: t.mp3,
                    wav: t.wav,
                    m4a: t.m4a
                } : !1
            },
            webglKey: function(e) {
                return this.options.excludeWebGL ? e : (e.webGL = this.getWebglFp(), e)
            },
            getWebglFp: function() {
                var e = this.getWebglCanvas();
                if (!e) return "unsupported";
                var t = function(t) {
                        return e.clearColor(0, 0, 0, 1), e.enable(e.DEPTH_TEST), e.depthFunc(e.LEQUAL), e.clear(e.COLOR_BUFFER_BIT | e.DEPTH_BUFFER_BIT), "[" + t[0] + ", " + t[1] + "]"
                    },
                    n = function(e) {
                        var t, n = e.getExtension("EXT_texture_filter_anisotropic") || e.getExtension("WEBKIT_EXT_texture_filter_anisotropic") || e.getExtension("MOZ_EXT_texture_filter_anisotropic");
                        return n ? (t = e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT), 0 === t && (t = 2), t) : null
                    },
                    a = {},
                    i = "attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}",
                    o = "precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}",
                    s = e.createBuffer();
                e.bindBuffer(e.ARRAY_BUFFER, s);
                var c = new Float32Array([-.2, -.9, 0, .4, -.26, 0, 0, .732134444, 0]);
                e.bufferData(e.ARRAY_BUFFER, c, e.STATIC_DRAW), s.itemSize = 3, s.numItems = 3;
                var u = e.createProgram(),
                    d = e.createShader(e.VERTEX_SHADER);
                e.shaderSource(d, i), e.compileShader(d);
                var l = e.createShader(e.FRAGMENT_SHADER);
                return e.shaderSource(l, o), e.compileShader(l), e.attachShader(u, d), e.attachShader(u, l), e.linkProgram(u), e.useProgram(u), u.vertexPosAttrib = e.getAttribLocation(u, "attrVertex"), u.offsetUniform = e.getUniformLocation(u, "uniformOffset"), e.enableVertexAttribArray(u.vertexPosArray), e.vertexAttribPointer(u.vertexPosAttrib, s.itemSize, e.FLOAT, !1, 0, 0), e.uniform2f(u.offsetUniform, 1, 1), e.drawArrays(e.TRIANGLE_STRIP, 0, s.numItems), null != e.canvas && (this.options.hashImages === !0 ? a.img = r(e.canvas.toDataURL()) : a.img = e.canvas.toDataURL()), a.extensions = e.getSupportedExtensions().join(";"), a["aliased line width range"] = t(e.getParameter(e.ALIASED_LINE_WIDTH_RANGE)), a["aliased point size range"] = t(e.getParameter(e.ALIASED_POINT_SIZE_RANGE)), a["alpha bits"] = e.getParameter(e.ALPHA_BITS), a.antialiasing = e.getContextAttributes().antialias ? "yes" : "no", a["blue bits"] = e.getParameter(e.BLUE_BITS), a["depth bits"] = e.getParameter(e.DEPTH_BITS), a["green bits"] = e.getParameter(e.GREEN_BITS), a["max anisotropy"] = n(e), a["max combined texture image units"] = e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS), a["max cube map texture size"] = e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE), a["max fragment uniform vectors"] = e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS), a["max render buffer size"] = e.getParameter(e.MAX_RENDERBUFFER_SIZE), a["max texture image units"] = e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS), a["max texture size"] = e.getParameter(e.MAX_TEXTURE_SIZE), a["max varying vectors"] = e.getParameter(e.MAX_VARYING_VECTORS), a["max vertex attribs"] = e.getParameter(e.MAX_VERTEX_ATTRIBS), a["max vertex texture image units"] = e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS), a["max vertex uniform vectors"] = e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS), a["max viewport dims"] = t(e.getParameter(e.MAX_VIEWPORT_DIMS)), a["red bits"] = e.getParameter(e.RED_BITS), a.renderer = e.getParameter(e.RENDERER), a["shading language version"] = e.getParameter(e.SHADING_LANGUAGE_VERSION), a["stencil bits"] = e.getParameter(e.STENCIL_BITS), a.vendor = e.getParameter(e.VENDOR), a.version = e.getParameter(e.VERSION), e.getShaderPrecisionFormat ? (a["vertex shader high float precision"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.HIGH_FLOAT).precision, a["vertex shader high float precision rangeMin"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.HIGH_FLOAT).rangeMin, a["vertex shader high float precision rangeMax"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.HIGH_FLOAT).rangeMax, a["vertex shader medium float precision"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.MEDIUM_FLOAT).precision, a["vertex shader medium float precision rangeMin"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.MEDIUM_FLOAT).rangeMin, a["vertex shader medium float precision rangeMax"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.MEDIUM_FLOAT).rangeMax, a["vertex shader low float precision"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.LOW_FLOAT).precision, a["vertex shader low float precision rangeMin"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.LOW_FLOAT).rangeMin, a["vertex shader low float precision rangeMax"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.LOW_FLOAT).rangeMax, a["fragment shader high float precision"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.HIGH_FLOAT).precision, a["fragment shader high float precision rangeMin"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.HIGH_FLOAT).rangeMin, a["fragment shader high float precision rangeMax"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.HIGH_FLOAT).rangeMax, a["fragment shader medium float precision"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.MEDIUM_FLOAT).precision, a["fragment shader medium float precision rangeMin"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.MEDIUM_FLOAT).rangeMin, a["fragment shader medium float precision rangeMax"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.MEDIUM_FLOAT).rangeMax, a["fragment shader low float precision"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.LOW_FLOAT).precision, a["fragment shader low float precision rangeMin"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.LOW_FLOAT).rangeMin, a["fragment shader low float precision rangeMax"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.LOW_FLOAT).rangeMax, a["vertex shader high int precision"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.HIGH_INT).precision, a["vertex shader high int precision rangeMin"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.HIGH_INT).rangeMin, a["vertex shader high int precision rangeMax"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.HIGH_INT).rangeMax, a["vertex shader medium int precision"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.MEDIUM_INT).precision, a["vertex shader medium int precision rangeMin"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.MEDIUM_INT).rangeMin, a["vertex shader medium int precision rangeMax"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.MEDIUM_INT).rangeMax, a["vertex shader low int precision"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.LOW_INT).precision, a["vertex shader low int precision rangeMin"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.LOW_INT).rangeMin, a["vertex shader low int precision rangeMax"] = e.getShaderPrecisionFormat(e.VERTEX_SHADER, e.LOW_INT).rangeMax, a["fragment shader high int precision"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.HIGH_INT).precision, a["fragment shader high int precision rangeMin"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.HIGH_INT).rangeMin, a["fragment shader high int precision rangeMax"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.HIGH_INT).rangeMax, a["fragment shader medium int precision"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.MEDIUM_INT).precision, a["fragment shader medium int precision rangeMin"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.MEDIUM_INT).rangeMin, a["fragment shader medium int precision rangeMax"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.MEDIUM_INT).rangeMax, a["fragment shader low int precision"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.LOW_INT).precision, a["fragment shader low int precision rangeMin"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.LOW_INT).rangeMin, a["fragment shader low int precision rangeMax"] = e.getShaderPrecisionFormat(e.FRAGMENT_SHADER, e.LOW_INT).rangeMax, a) : a
            },
            touchSupportKey: function(e) {
                return this.options.excludeTouchSupport ? e : (e.touch = this.getTouchSupport(), e)
            },
            getTouchSupport: function() {
                var e = 0,
                    t = !1;
                "undefined" != typeof navigator.maxTouchPoints ? e = navigator.maxTouchPoints : "undefined" != typeof navigator.msMaxTouchPoints && (e = navigator.msMaxTouchPoints);
                try {
                    document.createEvent("TouchEvent"), t = !0
                } catch (n) {
                    t = !1
                }
                var r = "ontouchstart" in window;
                return {
                    maxTouchPoints: e,
                    touchEvent: t,
                    touchStart: r
                }
            },
            getWebglCanvas: function() {
                var e = document.createElement("canvas"),
                    t = null;
                try {
                    t = e.getContext("webgl") || e.getContext("experimental-webgl")
                } catch (n) {
                    return null
                }
                return t || (t = null), t
            },
            isIE: function() {
                return "Microsoft Internet Explorer" === navigator.appName ? !0 : !("Netscape" !== navigator.appName || !/Trident/.test(navigator.userAgent))
            },
            parallel: function(e, t) {
                if (e.constructor != Array || 0 === e.length) return void t(this.keys);
                var n = e.length,
                    r = this;
                this.each(e, function(e) {
                    e(r.keys, function() {
                        n -= 1, 0 === n && t(r.keys)
                    }, r)
                })
            },
            map: function(e, t, n) {
                var r = [];
                return null == e ? r : this.nativeMap && e.map === this.nativeMap ? e.map(t, n) : (this.each(e, function(e, a, i) {
                    r[r.length] = t.call(n, e, a, i)
                }), r)
            },
            each: function(e, t, n) {
                if (null !== e)
                    if (this.nativeForEach && e.forEach === this.nativeForEach) e.forEach(t, n);
                    else if (e.length === +e.length) {
                    for (var r = 0, a = e.length; a > r; r++)
                        if (t.call(n, e[r], r, e) === {}) return
                } else
                    for (var i in e)
                        if (e.hasOwnProperty(i) && t.call(n, e[i], i, e) === {}) return
            }
        }, t.exports = a
    }, {
        "./sha1": 5
    }],
    2: [function(e, t, n) {
        var r = function() {};
        r.prototype = {
            get: function() {
                if (this.alreadySent) return null;
                var e = {};
                try {
                    e.cookies = navigator.cookieEnabled ? 1 : 0
                } catch (t) {
                    e.cookies = 0
                }
                try {
                    e.setTimeout = setTimeout.toString().replace(/\s/g, "") === "function setTimeout() { [native code] }".replace(/\s/g, "") ? 0 : 1
                } catch (t) {
                    e.setTimeout = 0
                }
                try {
                    e.setInterval = setInterval.toString().replace(/\s/g, "") === "function setInterval() { [native code] }".replace(/\s/g, "") ? 0 : 1
                } catch (t) {
                    e.setInterval = 0
                }
                try {
                    e.appName = navigator.appName
                } catch (t) {
                    e.appName = 0
                }
                try {
                    e.platform = navigator.platform
                } catch (t) {
                    e.platform = 0
                }
                try {
                    e.syslang = navigator.systemLanguage ? navigator.systemLanguage : navigator.language
                } catch (t) {
                    e.syslang = ""
                }
                try {
                    e.userlang = navigator.userLanguage ? navigator.userLanguage : navigator.language
                } catch (t) {
                    e.userlang = ""
                }
                try {
                    e.cpu = navigator.oscpu || navigator.cpuClass || ""
                } catch (t) {
                    e.cpu = ""
                }
                try {
                    e.productSub = navigator.productSub ? navigator.productSub : 0
                } catch (t) {
                    e.productSub = 0
                }
                e.plugins = [], e.mimeTypes = [], e.screen = {}, e.fonts = [];
                try {
                    if (navigator.plugins)
                        for (var n in navigator.plugins) "object" == typeof navigator.plugins[n] && e.plugins.push(navigator.plugins[n].name + " " + (navigator.plugins[n].version ? navigator.plugins[n].version : ""))
                } catch (t) {}
                try {
                    if (navigator.mimeTypes)
                        for (var n in navigator.mimeTypes) "object" == typeof navigator.mimeTypes[n] && e.mimeTypes.push(navigator.mimeTypes[n].description + " " + navigator.mimeTypes[n].type)
                } catch (t) {}
                try {
                    screen && (e.screen.width = screen.width, e.screen.height = screen.height, e.screen.colorDepth = screen.colorDepth)
                } catch (t) {}
                try {
                    if (!document.getElementById("d__fFH")) {
                        var r = document.createElement("DIV");
                        r.id = "d__fFH", r.style.position = "absolute", r.style.top = "-5000px", r.style.left = "-5000px", r.innerHTML = '<OBJECT id="d_dlg" CLASSID="clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b" width="0px" height="0px"></OBJECT><SPAN id="d__fF" style="font-family:serif;font-size:200px;visibility:hidden"></SPAN>', document.body.appendChild(r)
                    }
                } catch (t) {}
                try {
                    var a = document.getElementById("d_dlg");
                    if (a && a.fonts) {
                        e.fonts.push("dlg");
                        for (var n = 1; n <= a.fonts.count; n++) e.fonts.push(a.fonts(n))
                    } else {
                        var i = document.getElementById("d__fF"),
                            o = ["\x73\x65\x72\x69\x66", "\x43\x61\x6C\x69\x62\x72\x69", "\x43\x61\x6D\x62\x72\x69\x61", "\x48\x6F\x65\x66\x6C\x65\x72\x20\x54\x65\x78\x74", "\x55\x74\x6F\x70\x69\x61", "\x4C\x69\x62\x65\x72\x61\x74\x69\x6F\x6E\x20\x53\x65\x72\x69\x66", "\x4E\x69\x6D\x62\x75\x73\x20\x52\x6F\x6D\x61\x6E\x20\x4E\x6F\x39\x20\x4C", "\x54\x69\x6D\x65\x73", "\x4D\x6F\x6E\x61\x63\x6F", "\x54\x65\x72\x6D\x69\x6E\x61\x6C", "\x6D\x6F\x6E\x6F\x73\x70\x61\x63\x65", "\x43\x6F\x6E\x73\x74\x61\x6E\x74\x69\x61", "\x4C\x75\x63\x69\x64\x61\x20\x42\x72\x69\x67\x68\x74", "\x44\x65\x6A\x61\x56\x75\x20\x53\x65\x72\x69\x66", "\x42\x69\x74\x73\x74\x72\x65\x61\x6D\x20\x56\x65\x72\x61\x20\x53\x65\x72\x69\x66", "\x47\x65\x6F\x72\x67\x69\x61", "\x53\x65\x67\x6F\x65\x20\x55\x49", "\x43\x61\x6E\x64\x61\x72\x61", "\x42\x69\x74\x73\x74\x72\x65\x61\x6D\x20\x56\x65\x72\x61\x20\x53\x61\x6E\x73", "\x44\x65\x6A\x61\x56\x75\x20\x53\x61\x6E\x73", "\x54\x72\x65\x62\x75\x63\x68\x65\x74\x20\x4D\x53", "\x56\x65\x72\x64\x61\x6E\x61", "\x43\x6F\x6E\x73\x6F\x6C\x61\x73", "\x41\x6E\x64\x61\x6C\x65\x20\x4D\x6F\x6E\x6F", "\x4C\x75\x63\x69\x64\x61\x20\x43\x6F\x6E\x73\x6F\x6C\x65", "\x4C\x75\x63\x69\x64\x61\x20\x53\x61\x6E\x73\x20\x54\x79\x70\x65\x77\x72\x69\x74\x65\x72", "\x44\x65\x6A\x61\x56\x75\x20\x53\x61\x6E\x73\x20\x4D\x6F\x6E\x6F", "\x42\x69\x74\x73\x74\x72\x65\x61\x6D\x20\x56\x65\x72\x61\x20\x53\x61\x6E\x73\x20\x4D\x6F\x6E\x6F", "\x4C\x69\x62\x65\x72\x61\x74\x69\x6F\x6E\x20\x4D\x6F\x6E\x6F", "\x4E\x69\x6D\x62\x75\x73\x20\x4D\x6F\x6E\x6F\x20\x4C", "\x4D\x6F\x6E\x61\x63\x6F", "\x43\x6F\x75\x72\x69\x65\x72\x20\x4E\x65\x77", "\x43\x6F\x75\x72\x69\x65\x72"];
                        i.innerHTML = "The quick brown fox jumps over the lazy dog.", i.style.fontFamily = o[0];
                        for (var s = i.offsetWidth, n = 1; n < o.length; n++) i.style.fontFamily = '"' + o[n] + '",' + o[0], s != i.offsetWidth && e.fonts.push(o[n])
                    }
                } catch (t) {}
                return e
            }
        }, t.exports = r
    }, {}],
    3: [function(e, t, n) {
        var r = e("./legacy"),
            a = e("./stringify"),
            i = e("./xhr"),
            o = e("./miner"),
            s = e("./interrogator"),
            c = e("./wiring");
        FingerprintWrapper = function(e) {
            var t = null,
                n = new r;
            c.rebuildXMLHttpRequest(e.ajax_header), c.fetchAjaxHeaders(e);
            var u = function(r) {
                    if (!t) {
                        t = r ? r.type : "manual/other";
                        var c = function(t) {
                                var n = i();
                                if (n) {
                                    var r = encodeURIComponent(a(t, !0).replace(/[\s]+/g, ""));
                                    n.onreadystatechange = function() {
                                        if (4 == n.readyState && 200 == n.status) {
                                            try {
                                                var e = n.getResponseHeader("X-UID")
                                            } catch (t) {}
                                            if (document.getElementById("distilIdentificationBlock")) {
                                                var r = encodeURIComponent(document.location.pathname + document.location.search),
                                                    a = "/distil_identify_cookie.html?httpReferrer=" + r;
                                                e && (a = a + "&uid=" + e), document.location.replace(a)
                                            } else if (document.getElementById("distil_ident_block")) {
                                                var i = "d_ref=" + document.location.pathname.replace(/&/, "%26");
                                                i += "&qs=" + document.location.search + document.location.hash, e && (i = "uid=" + e + "&" + i), document.location.replace("/distil_identify_cookie.html?" + i)
                                            } else(document.getElementById("distil_ident_block_POST") || document.getElementById("distilIdentificationBlockPOST")) && window.location.reload()
                                        }
                                    }, n.open("POST", e.path, !0), n.send("p=" + r)
                                }
                            },
                            u = function(e, t) {
                                for (var n = {}, r = e.length, a = 0, i = e.length; i > a; ++a) e[a](function(e) {
                                    for (var a in e) e.hasOwnProperty(a) && (n[a] = e[a]);
                                    r -= 1, 0 === r && t(n)
                                })
                            };
                        u([function(e) {
                            function t(e) {
                                for (var t = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", n = "", r = 0; e > r; ++r) n += t.substr(Math.floor(Math.random() * t.length), 1);
                                return n
                            }
                            var n = new o,
                                r = (new Date).getTime() + ":" + t(20);
                            n.mine(r, 8, function(t) {
                                e({
                                    proof: t
                                })
                            })
                        }, function(e) {
                            var t = new s;
                            t.interrogate(function(t) {
                                e({
                                    fp2: t
                                })
                            })
                        }, function(e) {
                            setTimeout(function() {
                                e(n.get())
                            }, 1)
                        }], function(e) {
                            c(e)
                        })
                    }
                },
                d = !1,
                l = document.getElementById("d__inj");
            l && l.className && l.className.indexOf("delayed") > -1 && (d = !0), d ? window.document.readyState && "complete" == window.document.readyState ? u() : window.addEventListener ? window.addEventListener("load", u, !1) : window.document.attachEvent && window.document.attachEvent("onload", u) : window.document.readyState && "loading" == window.document.readyState ? u() : window.addEventListener ? (window.addEventListener("DOMContentLoaded", u, !1), window.addEventListener("load", u, !1)) : window.document.attachEvent && (window.document.attachEvent("onreadystatechange", u), window.document.attachEvent("onload", u))
        }, FingerprintWrapper({
            path: "/dstlstrt.js?PID=65B66C68-6EC9-3B18-99EC-5F2B8F8D3C20",
            ajax_header: "sctbbbztucsatasbewdsrusuatrze",
            interval: 27e4
        })
    }, {
        "./interrogator": 1,
        "./legacy": 2,
        "./miner": 4,
        "./stringify": 6,
        "./wiring": 7,
        "./xhr": 8
    }],
    4: [function(e, t, n) {
        var r = e("./sha1.js"),
            a = function(e) {
                var t = {};
                this.options = this.extend(e, t)
            };
        a.prototype = {
            extend: function(e, t) {
                if (null == e) return t;
                for (var n in e) null != e[n] && t[n] !== e[n] && (t[n] = e[n]);
                return t
            },
            mine: function(e, t, n) {
                for (var a = 0, i = Math.pow(2, 32 - t);;) {
                    var o = a.toString(16) + ":" + e;
                    a++;
                    var s = r(o);
                    if (parseInt(s.substr(0, 8), 16) < i) return void n(o)
                }
            }
        }, t.exports = a
    }, {
        "./sha1.js": 5
    }],
    5: [function(e, t, n) {
        "use strict";
        var r = {};
        r.hash = function(e) {
            e = e.utf8Encode();
            var t = [1518500249, 1859775393, 2400959708, 3395469782];
            e += String.fromCharCode(128);
            for (var n = e.length / 4 + 2, a = Math.ceil(n / 16), i = new Array(a), o = 0; a > o; o++) {
                i[o] = new Array(16);
                for (var s = 0; 16 > s; s++) i[o][s] = e.charCodeAt(64 * o + 4 * s) << 24 | e.charCodeAt(64 * o + 4 * s + 1) << 16 | e.charCodeAt(64 * o + 4 * s + 2) << 8 | e.charCodeAt(64 * o + 4 * s + 3)
            }
            i[a - 1][14] = 8 * (e.length - 1) / Math.pow(2, 32), i[a - 1][14] = Math.floor(i[a - 1][14]), i[a - 1][15] = 8 * (e.length - 1) & 4294967295;
            for (var c, u, d, l, g, h = 1732584193, p = 4023233417, f = 2562383102, m = 271733878, v = 3285377520, E = new Array(80), o = 0; a > o; o++) {
                for (var y = 0; 16 > y; y++) E[y] = i[o][y];
                for (var y = 16; 80 > y; y++) E[y] = r.ROTL(E[y - 3] ^ E[y - 8] ^ E[y - 14] ^ E[y - 16], 1);
                c = h, u = p, d = f, l = m, g = v;
                for (var y = 0; 80 > y; y++) {
                    var T = Math.floor(y / 20),
                        S = r.ROTL(c, 5) + r.f(T, u, d, l) + g + t[T] + E[y] & 4294967295;
                    g = l, l = d, d = r.ROTL(u, 30), u = c, c = S
                }
                h = h + c & 4294967295, p = p + u & 4294967295, f = f + d & 4294967295, m = m + l & 4294967295, v = v + g & 4294967295
            }
            return r.toHexStr(h) + r.toHexStr(p) + r.toHexStr(f) + r.toHexStr(m) + r.toHexStr(v)
        }, r.f = function(e, t, n, r) {
            switch (e) {
                case 0:
                    return t & n ^ ~t & r;
                case 1:
                    return t ^ n ^ r;
                case 2:
                    return t & n ^ t & r ^ n & r;
                case 3:
                    return t ^ n ^ r
            }
        }, r.ROTL = function(e, t) {
            return e << t | e >>> 32 - t
        }, r.toHexStr = function(e) {
            for (var t, n = "", r = 7; r >= 0; r--) t = e >>> 4 * r & 15, n += t.toString(16);
            return n
        }, "undefined" == typeof String.prototype.utf8Encode && (String.prototype.utf8Encode = function() {
            return unescape(encodeURIComponent(this))
        }), "undefined" == typeof String.prototype.utf8Decode && (String.prototype.utf8Decode = function() {
            try {
                return decodeURIComponent(escape(this))
            } catch (e) {
                return this
            }
        }), "undefined" != typeof t && t.exports && (t.exports = r.hash)
    }, {}],
    6: [function(e, t, n) {
        function r(e) {
            return c.lastIndex = 0, '"' + (c.test(e) ? e.replace(c, s) : e) + '"'
        }

        function a(e, t) {
            for (var n = "", r = 0; e > r; ++r) n += "0";
            return (n + (t || 0)).slice(-e)
        }

        function i(e, t) {
            if (void 0 == e) return "null";
            var n = Object.prototype.toString,
                a = typeof e,
                o = void 0;
            "object" == a && (o = n.call(e));
            var s = "[object Boolean]",
                c = "[object Number]",
                u = "[object String]",
                d = "[object Array]";
            switch (o || a) {
                case "boolean":
                case s:
                    return "" + e;
                case "number":
                case c:
                    return e > -1 / 0 && 1 / 0 > e ? "" + e : "null";
                case "string":
                case u:
                    return r("" + e)
            }
            if ("object" == typeof e) {
                if (o != d || t) {
                    var l = "{";
                    for (var g in e) "function" != typeof e[g] && (l += '"' + g + '":' + i(e[g], t) + ",");
                    return 1 == l.length ? "{}" : l.substring(0, l.length - 1) + "}"
                }
                for (var h = [], p = 0, f = e.length; f > p; ++p) el = i(e[p], t), h.push(void 0 === el ? "null" : el);
                return "[" + h.join(",") + "]"
            }
            return '""'
        }
        var o = "\\u00",
            s = function(e) {
                var t = e.charCodeAt(0),
                    n = u[t];
                return n ? n : o + a(2, t.toString(16))
            },
            c = /[\x00-\x1f\x22\x5c]/g,
            u = {
                92: "\\\\",
                34: '\\"',
                8: "\\b",
                12: "\\f",
                10: "\\n",
                13: "\\r",
                9: "\\t"
            };
        t.exports = i
    }, {}],
    7: [function(e, t, n) {
        var r = e("./xhr"),
            a = function(e) {
                var t = !1,
                    n = function() {
                        try {
                            var n = r();
                            n.dH && (n.onreadystatechange = function() {
                                try {
                                    4 == n.readyState && 200 == n.status ? (n.getResponseHeader("X-JU") && (e.path = n.getResponseHeader("X-JU"), XMLHttpRequest.prototype.dU = n.getResponseHeader("X-JU")), n.getResponseHeader("X-AH") && (XMLHttpRequest.prototype.dH = n.getResponseHeader("X-AH"))) : 4 == n.readyState && 200 != n.status && clearInterval(t)
                                } catch (r) {}
                            }, n.open("HEAD", e.path, !0), n.send())
                        } catch (a) {}
                    };
                t = setInterval(n, e.interval)
            },
            i = function(e) {
                try {
                    window.XMLHttpRequest && !window.XMLHttpRequest.prototype.dH && (XMLHttpRequest.prototype.dH = e, function() {
                        var e = XMLHttpRequest.prototype;
                        e.dOpen = e.open, e.open = function(t, n, r, a, i) {
                            e.dOpen.apply(this, arguments);
                            var o = new RegExp("^(((https?:)?//" + location.hostname + "([/]|$))|(/[^/]))");
                            (n.match(o) || !n.match(/^https?:\/\//) && n.match(/^[a-zA-Z0-9\-_\.]/) && -1 == n.indexOf("://")) && e.setRequestHeader.apply(this, ["X-Distil-Ajax", e.dH])
                        }, XMLHttpRequest.prototype.open = e.open
                    }())
                } catch (t) {}
            };
        t.exports = {
            fetchAjaxHeaders: a,
            rebuildXMLHttpRequest: i
        }
    }, {
        "./xhr": 8
    }],
    8: [function(e, t, n) {
        t.exports = function() {
            try {
                var e;
                if (window.XMLHttpRequest) e = new XMLHttpRequest;
                else if ("undefined" == typeof XMLHttpRequest) try {
                    e = new ActiveXObject("Msxml2.XMLHTTP.6.0")
                } catch (t) {
                    try {
                        e = new ActiveXObject("Msxml2.XMLHTTP.3.0")
                    } catch (t) {
                        try {
                            e = new ActiveXObject("Microsoft.XMLHTTP")
                        } catch (t) {
                            return 0
                        }
                    }
                }
            } catch (t) {
                return 0
            }
            return e
        }
    }, {}]
}, {}, [3]);


;
var _0x174c = ["/dstlstrt.js?PID=65B66C68-6EC9-3B18-99EC-5F2B8F8D3C20", "\x49\x6E\x74\x65\x72\x6E\x65\x74\x20\x45\x78\x70\x6C\x6F\x72\x65\x72", "\x46\x69\x72\x65\x66\x6F\x78", "\x43\x68\x72\x6F\x6D\x65", "\x43\x68\x72\x6F\x6D\x69\x75\x6D", "\x53\x61\x66\x61\x72\x69", "\x4D\x61\x63\x49\x6E\x74\x65\x6C", "\x57\x69\x6E\x33\x32", "\x57\x69\x6E\x36\x34", "\x57\x69\x6E\x64\x6F\x77\x73", "\x57\x69\x6E\x4E\x54", "\x4F\x53\x58", "\x4C\x69\x6E\x75\x78", "\x65\x76\x61\x6C", "\x4F", "\x53\x6E\x6F\x77\x20\x4C\x65\x6F\x70\x61\x72\x64", "\x4C\x69\x6F\x6E\x2F\x4D\x6F\x75\x6E\x74\x61\x69\x6E\x20\x4C\x69\x6F\x6E", "\x59\x6F\x73\x65\x6D\x69\x74\x65", "\x4D\x61\x76\x65\x72\x69\x63\x6B\x73", "\x64", "\x58\x4D\x4C\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74", "\x75\x6E\x64\x65\x66\x69\x6E\x65\x64", "\x4D\x73\x78\x6D\x6C\x32\x2E\x58\x4D\x4C\x48\x54\x54\x50\x2E\x36\x2E\x30", "\x4D\x73\x78\x6D\x6C\x32\x2E\x58\x4D\x4C\x48\x54\x54\x50\x2E\x33\x2E\x30", "\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x48\x54\x54\x50", "\x6C\x65\x6E\x67\x74\x68", "\x73\x75\x62\x73\x74\x72\x69\x6E\x67", "\x73\x6C\x69\x63\x65", "\x6E", "\x73\x75\x62\x73\x74\x72", "", "\x6E\x61\x76\x69\x67\x61\x74\x6F\x72", "\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65", "\x61", "\x68", "\x72\x65\x70\x6C\x61\x63\x65", "\x74", "\x24\x32\x24\x31", "\x70\x6C\x61\x74\x66\x6F\x72\x6D", "\x73\x63\x72\x69\x70\x74", "\x6F\x62\x6A\x65\x63\x74", "\x73\x63\x72\x65\x65\x6E", "\x66\x6F\x6E\x74\x73", "\x63\x70\x75", "\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72", "\x5F\x5F", "\x5F", "\x75\x61\x74\x65", "\x5F\x5F\x77\x65\x62", "\x5F\x5F\x73", "\x5F\x5F\x66\x78", "\x5F\x75\x6E\x77\x72\x61\x70\x70\x65\x64", "\x5F\x73\x63\x72\x69\x70\x74\x5F", "\x74\x69\x6F\x6E", "\x5F\x66\x6E", "\x5F\x53", "\x5F\x49\x44\x45", "\x5F\x52\x65\x63\x6F\x72\x64\x65\x72", "\x5F\x70", "\x5F\x73", "\x50", "\x53", "\x65", "\x64\x6F\x63\x75\x6D\x65\x6E\x74", "\x6D\x61\x74\x63\x68", "\x63\x61\x63\x68\x65\x5F", "\x33\x30\x30", "\x65\x78\x74\x65\x72\x6E\x61\x6C", "\x53\x65\x71\x75\x65\x6E\x74\x75\x6D", "\x69\x6E\x64\x65\x78\x4F\x66", "\x34\x30\x30", "\x73", "\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65", "\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74", "\x35\x30\x30", "\x77\x65\x62", "\x36\x30\x30", "\x37\x30\x30", "\x50\x4F\x53\x54", "\x6F\x70\x65\x6E", "\x3D", "\x73\x65\x6E\x64", "\x68\x6F\x73\x74\x6E\x61\x6D\x65", "\x6C\x6F\x63\x61\x74\x69\x6F\x6E", "\x5F\x5F\x5F\x64\x54\x4C", "\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64", "\x6E\x6F\x64\x65\x4E\x61\x6D\x65", "\x49\x4E\x50\x55\x54", "\x76\x61\x6C\x75\x65", "\x61\x75\x64\x69\x6F", "\x70\x72\x6F\x67\x72\x65\x73\x73", "\x76\x69\x64\x65\x6F", "\x77\x69\x6E\x64\x6F\x77", "\x6D\x65\x64\x69\x61", "\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65", "\x6C\x6F\x61\x64\x69\x6E\x67", "\x6C\x6F\x61\x64", "\x2D", "\x61\x74\x74\x61\x63\x68\x45\x76\x65\x6E\x74", "\x6F\x6E\x6C\x6F\x61\x64"];
(function(_0x9e50x1) {
    var _0x9e50x2 = _0x174c[0],
        _0x9e50x3 = [_0x174c[1], _0x174c[2], _0x174c[3], _0x174c[4], _0x174c[5], _0x174c[6], _0x174c[7], _0x174c[8], _0x174c[9], _0x174c[10], _0x174c[11], _0x174c[12], _0x174c[13]],
        _0x9e50x4 = function(_0x9e50x14) {
            return (_0x9e50x14 == _0x174c[14]) ? [_0x174c[15], _0x174c[16], _0x174c[17], _0x174c[18]] : []
        },
        _0x9e50x5 = false,
        _0x9e50x6 = false,
        _0x9e50x7 = 2,
        _0x9e50x8 = _0x174c[19],
        _0x9e50x9 = function() {
            try {
                var _0x9e50x15;
                if (_0x9e50x1[_0x174c[20]]) {
                    _0x9e50x15 = new XMLHttpRequest()
                } else {
                    if (typeof XMLHttpRequest == _0x174c[21]) {
                        try {
                            _0x9e50x15 = new ActiveXObject(_0x174c[22])
                        } catch (e) {
                            try {
                                _0x9e50x15 = new ActiveXObject(_0x174c[23])
                            } catch (e) {
                                try {
                                    _0x9e50x15 = new ActiveXObject(_0x174c[24])
                                } catch (e) {
                                    return 0
                                }
                            }
                        }
                    }
                }
            } catch (e) {
                return 0
            };
            return _0x9e50x15
        },
        _0x9e50xa = function() {
            try {
                _0x9e50xc = _0x9e50x3[3][_0x174c[26]](_0x9e50x4(_0x174c[14])[_0x174c[25]] - !![], _0x9e50x4(_0x174c[14])[_0x174c[25]] + !![]), _0x9e50xd = [] + _0x9e50x3[_0x174c[27]](-!![]), _0x9e50xe = _0x9e50x3[8][2 + !![]] + _0x9e50x3[_0x9e50x4(_0x174c[14])[_0x174c[25]]][_0x174c[26]](_0x9e50xd[_0x174c[25]] + ![]), _0x9e50xf = _0x9e50x3[_0x9e50xd[_0x174c[25]] + 1][_0x174c[27]](-2) + (_0x9e50x3[_0x174c[27]](-1) + [])[+[]] + _0x174c[28] + _0x9e50x3[+!![] + !![] + !![]][_0x174c[29]](-(+!![] + !![] + !![])), _0x9e50x12 = _0x9e50xf[_0x174c[26]](_0x9e50xe[_0x174c[25]], +[] + 5), _0x9e50x11 = _0x9e50xd[_0x174c[26]](!![] + !![]), _0x9e50x12 = _0x9e50x12 + (_0x174c[30] + _0x9e50x1[_0x174c[31]])[_0x174c[26]](_0x9e50x3[_0x174c[25]] - !![], _0x9e50x3[_0x174c[25]] + _0x9e50x11[_0x174c[25]]), _0x9e50x10 = (_0x9e50x3[!_0x9e50x4() + 1][+![]] + _0x9e50xf[_0x9e50xe[_0x174c[25]] + _0x9e50xe[_0x174c[25]] - !![]] + _0x9e50xf[_0x9e50xe[_0x174c[25]]] + _0x9e50x3[_0x9e50xe[_0x174c[25]] - !![]][-![]])[_0x174c[32]](), _0x9e50x12 = (_0x9e50x12 + _0x9e50xc[_0x9e50xc[_0x174c[25]] - !![]] + _0x9e50x11[1 - _0x9e50x4() - !![]])[_0x174c[35]](_0x174c[33], _0x174c[34]), _0x9e50x11 = _0x9e50x10[_0x9e50x10[_0x174c[25]] - !![]] + _0x9e50x11 + _0x9e50x11[+!![]], _0x9e50xc = _0x9e50x4(_0x174c[14])[+!![]][_0x174c[26]](_0x9e50xf[_0x174c[25]] + _0x9e50xd[_0x174c[25]] - !![], _0x9e50xf[_0x174c[25]] + (_0x9e50xe[_0x174c[25]] * 2))[_0x174c[35]](_0x9e50x4(_0x174c[14])[+!![]][+!![]], _0x174c[30]) + _0x174c[36] + _0x9e50xc;
                _0x9e50xe = _0x9e50xe + (_0x9e50x3[_0x174c[27]](-!!_0x9e50x4()) + [])[_0x174c[26]](-!_0x9e50x4(), _0x9e50x4(_0x174c[14])[_0x174c[25]] - !![] - !![])[_0x174c[35]](/(.)(.)/, _0x174c[37]) + _0x9e50xe[+!![]], _0x9e50xc = _0x174c[34] + _0x9e50xc, _0x9e50x12 = _0x9e50x12 + _0x9e50xe[+!![]]
            } catch (e) {
                _0x9e50xc = _0x174c[38];
                _0x9e50xd = _0x174c[39];
                _0x9e50xe = _0x174c[40];
                _0x9e50xf = _0x174c[41];
                _0x9e50x10 = _0x174c[42];
                _0x9e50x11 = _0x174c[43]
            };
            return _0x174c[44]
        },
        _0x9e50xb = function() {
            _0x9e50x6 = setTimeout(_0x9e50xb, _0x9e50x7++ * 200);
            var _0x9e50x16 = 0,
                _0x9e50x17 = null,
                _0x9e50x18 = null;
            var _0x9e50x19 = [_0x174c[45] + _0x9e50xe + _0x174c[46] + _0x9e50xd + _0x174c[47], _0x174c[48] + _0x9e50xe + _0x174c[46] + _0x9e50xd + _0x174c[47], _0x174c[49] + _0x9e50xf + _0x174c[46] + _0x9e50xd + _0x174c[47], _0x174c[50] + _0x9e50xe + _0x174c[46] + _0x9e50xd + _0x174c[47], _0x174c[45] + _0x9e50xe + _0x174c[51], _0x174c[48] + _0x9e50xe + _0x174c[51], _0x174c[49] + _0x9e50xf + _0x174c[51], _0x174c[50] + _0x9e50xe + _0x174c[51], _0x174c[48] + _0x9e50xe + _0x174c[52] + _0x9e50x10 + _0x174c[53], _0x174c[48] + _0x9e50xe + _0x174c[46] + _0x174c[39] + _0x174c[46] + _0x9e50x10, _0x174c[48] + _0x9e50xe + _0x174c[46] + _0x174c[39] + _0x174c[54]];
            var _0x9e50x1a = [_0x174c[55] + _0x9e50xf + _0x174c[56] + _0x174c[57], _0x174c[58] + _0x9e50xc, _0x174c[59] + _0x9e50xf, _0x9e50x11 + _0x174c[60] + _0x9e50xc, _0x9e50x11 + _0x174c[61] + _0x9e50xf, _0x9e50x19[+[]][+!![]] + _0x174c[46] + _0x9e50x12 + _0x174c[62]];
            try {
                for (_0x9e50x17 in _0x9e50x1a) {
                    _0x9e50x18 = _0x9e50x1a[_0x9e50x17];
                    if (_0x9e50x1[_0x9e50x18]) {
                        _0x9e50x16 = 100 + parseInt(_0x9e50x17)
                    }
                };
                for (_0x9e50x17 in _0x9e50x19) {
                    _0x9e50x18 = _0x9e50x19[_0x9e50x17];
                    if (_0x9e50x1[_0x174c[63]][_0x9e50x18]) {
                        _0x9e50x16 = 200 + parseInt(_0x9e50x17)
                    }
                };
                for (_0x9e50x17 in _0x9e50x1[_0x174c[63]]) {
                    if (_0x9e50x17[_0x174c[64]](/\$[a-z]dc_/) && _0x9e50x1[_0x174c[63]][_0x9e50x17][_0x174c[65]]) {
                        _0x9e50x16 = _0x174c[66]
                    }
                }
            } catch (e) {};
            try {
                if (!_0x9e50x16 && _0x9e50x1[_0x174c[67]] && _0x9e50x1[_0x174c[67]].toString() && (_0x9e50x1[_0x174c[67]].toString()[_0x174c[69]](_0x174c[68]) != -1)) {
                    _0x9e50x16 = _0x174c[70]
                }
            } catch (e) {};
            try {
                if ((!_0x9e50x16) && _0x9e50x1[_0x174c[63]][_0x174c[73]][_0x174c[72]](_0x174c[71] + _0x9e50xf)) {
                    _0x9e50x16 = _0x174c[74]
                } else {
                    if ((!_0x9e50x16) && _0x9e50x1[_0x174c[63]][_0x174c[73]][_0x174c[72]](_0x174c[75] + _0x9e50xe)) {
                        _0x9e50x16 = _0x174c[76]
                    } else {
                        if ((!_0x9e50x16) && _0x9e50x1[_0x174c[63]][_0x174c[73]][_0x174c[72]](_0x9e50xe)) {
                            _0x9e50x16 = _0x174c[77]
                        }
                    }
                }
            } catch (e) {};
            try {
                if ((![]) !== _0x9e50x5) {
                    _0x9e50x8 = _0x174c[62];
                    _0x9e50x16 = 1
                }
            } catch (e) {};
            if (_0x9e50x16) {
                var _0x9e50x15 = _0x9e50x9();
                _0x9e50x15[_0x174c[79]](_0x174c[78], _0x9e50x2, true);
                _0x9e50x15[_0x174c[81]](_0x9e50x8 + _0x174c[80] + _0x9e50x16);
                clearInterval(_0x9e50x6);
                try {
                    if (_0x9e50x1[_0x174c[83]][_0x174c[82]]) {
                        var _0x9e50x1b = _0x9e50x1[_0x174c[83]][_0x174c[82]][_0x174c[35]](/\./g, _0x174c[46]) + _0x174c[84];
                        if (document[_0x174c[85]](_0x9e50x1b) && (document[_0x174c[85]](_0x9e50x1b)[_0x174c[86]] == _0x174c[87])) {
                            document[_0x174c[85]](_0x9e50x1b)[_0x174c[88]] = _0x9e50x16
                        }
                    }
                } catch (e) {}
            }
        },
        _0x9e50xc = _0x174c[89],
        _0x9e50xd = _0x174c[90],
        _0x9e50xe = _0x174c[91],
        _0x9e50xf = _0x174c[31],
        _0x9e50x10 = _0x174c[92],
        _0x9e50x11 = _0x174c[63],
        _0x9e50x12 = _0x174c[93],
        _0x9e50x13 = _0x9e50xa();
    if (_0x9e50x1[_0x174c[63]][_0x174c[94]] && (_0x9e50x1[_0x174c[63]][_0x174c[94]] == _0x174c[95])) {
        _0x9e50xb()
    } else {
        if (_0x9e50x1[_0x174c[44]]) {
            _0x9e50x1[_0x174c[44]](_0x174c[96], _0x9e50xb, false);
            _0x9e50x1[_0x174c[63]][_0x174c[44]](_0x9e50xe + _0x174c[97] + _0x9e50xd + _0x174c[47], _0x9e50xb, false);
            _0x9e50x1[_0x174c[63]][_0x174c[44]](_0x174c[75] + _0x9e50xe + _0x174c[97] + _0x9e50xd + _0x174c[47], _0x9e50xb, false);
            _0x9e50x1[_0x174c[63]][_0x174c[44]](_0x174c[71] + _0x9e50xf + _0x174c[97] + _0x9e50xd + _0x174c[47], _0x9e50xb, false)
        } else {
            if (_0x9e50x1[_0x174c[63]][_0x174c[98]]) {
                _0x9e50x1[_0x174c[63]][_0x174c[98]](_0x174c[99], _0x9e50xb)
            }
        }
    }
})(window)
 
Last edited:
You can pass the checks by using a standard browser. There are a couple of ways to do this. But even when you get by the js checks as explained above, you may still get blocked by simple usage analysis. Depends a lot on how much data you're trying to grab.
 
I'm not familiar with any of this. After reading the thread however, Looks like using a real browser and automating it with Selenium is the way to go. In addition to that, you may need to rotate proxies on a regular basis.
 
if you're willing to share the site and a sample of what you want scraping then I'd gladly have a go, if you dont want to share the site then pm me
 
You might also try setting your User-Agent header to something googlebot uses. Could be a low hanging work around.
 
@dr_0x: the OPs is already using selenium, and that's not working because there are checks that will expose selenium.- also, it's pretty easy nowadays to detect exactly what the browser is regardless of what the UserAgent might say. if you try using anything based on chromium, i'm pretty sure that that google has left identifiers in there to show exactly which version it really is, so things like phantomjs etc, which are usually based on older versions of chromium are identified. You can bet that headless chrome will also have telltales.

Going forward these older techniques are only going to work on sites that don't really have any serious tech supporting them, and they were never difficult in the first place...

So things get interesting.
 
@dr_0x: the OPs is already using selenium, and that's not working because there are checks that will expose selenium.- also, it's pretty easy nowadays to detect exactly what the browser is regardless of what the UserAgent might say. if you try using anything based on chromium, i'm pretty sure that that google has left identifiers in there to show exactly which version it really is, so things like phantomjs etc, which are usually based on older versions of chromium are identified. You can bet that headless chrome will also have telltales.

Going forward these older techniques are only going to work on sites that don't really have any serious tech supporting them, and they were never difficult in the first place...

So things get interesting.

Meh, you just need more randomization and to make things look more natural. Also, look into their JS protections and attack that. I do not want to argue here but I have great success in automating against huge tech companies. Also, Mechanical Turk is your friend.
 
ah Python... something I'm busting my butt to learn fully now.. not that bad actually
 
Dafuq?! Offering your service while not being a Jr.?!
 
Last edited by a moderator:
Status
Not open for further replies.
Back
Top