Cara Block AdBlock Plus Dan Brave Browser Dengan JavaScript Untuk Publisher

Diterbitkan pada

Assalamu'alaikum .

Pada kesempatan kali ini saya akan mencoba untuk membagikan cara bagainama block AdBlock untuk para Publisher Adsense / CPM / CPA Network .

Tidak mau kan penghasilan yang diperoleh berkurang akibat user yang menggunakan AdBlock .

Berikut adalah scriptnya . scriptnya masih di implementasi untuk development . untuk production silahkan ubah pada bagian adBlockDetected menggunakan alert ataupun custom html dialog show . insyaAllah akan saya update apabila banyak yg minat untuk script block adblock ini .

Jika sobat ingin menggunakan script ini dengan mode development demo . ikuti saja cara dibawah .

1. Buat Script Javascript Bernamakan blocker.js , kemudian pastekan full kode javascript dibawah .

var fuckAdBlock = undefined;

(function(window, instanceName, className) {
	var debug = false;
	var debugName = 'FuckAdBlock';
	
	var FabUtils = function() {
		var self = this;
		var options = {};
		
		this.errors = {
			throwError: function(name, method, type) {
				throw 'Argument "'+name+'" of method "'+method+'" is not an "'+type+'"';
			},
			isObject: function(value, name, method) {
				if(typeof value !== 'object' || Array.isArray(value) === true || value === null) {
					this.throwError(name, method, 'object');
				}
			},
			isArray: function(value, name, method) {
				if(Array.isArray(value) === false) {
					this.throwError(name, method, 'array');
				}
			},
			isFunction: function(value, name, method) {
				if(typeof value !== 'function') {
					this.throwError(name, method, 'function');
				}
			},
			isString: function(value, name, method) {
				if(typeof value !== 'string') {
					this.throwError(name, method, 'string');
				}
			},
			isBoolean: function(value, name, method) {
				if(typeof value !== 'boolean') {
					this.throwError(name, method, 'boolean');
				}
			},
		};
		
		this.options = {
			set: function(optionsList) {
				self.errors.isObject(optionsList, 'optionsList', 'options.set');
				
				for(var key in optionsList) {
					options[key] = optionsList[key];
					self.debug.log('options.set', 'Set "'+key+'" to "'+optionsList[key]+'"');
				}
				return self;
			},
			get: function(key) {
				return options[key];
			},
		};
		
		this.debug = {
			set: function(isEnable) {
				debug = isEnable;
				self.debug.log('debug.set', 'Set debug to "'+debug+'"');
				return self;
			},
			isEnable: function() {
				return debug;
			},
			log: function(method, message) {
				if(debug === true) {
					self.errors.isString(method, 'method', 'debug.log');
					self.errors.isString(message, 'message', 'debug.log');
					
					console.log('['+debugName+']['+method+'] '+message);
				}
			},
		};
		
		this.versionToInt = function(version) {
			var versionInt = '';
			for(var i=0; i<3; i++) {
				var block = version[i]||0;
				if((''+block).length === 1) {
					block = '0'+block;
				}
				versionInt += block;
			}
			return parseInt(versionInt);
		};
	};
	
	var FabPlugin = function() {
		FabUtils.apply(this);
		
		var data = {};
		var callbackDetected = null;
		var callbackUndetected = null;
		
		this.setDetected = function(callback) {
			callbackDetected = callback;
			return this;
		};
		this.callDetected = function() {
			if(callbackDetected === null) {
				return false;
			}
			callbackDetected();
			callbackDetected = null;
			return true;
		};
		
		this.setUndetected = function(callback) {
			callbackUndetected = callback;
			return this;
		};
		this.callUndetected = function() {
			if(callbackUndetected === null) {
				return false;
			}
			callbackUndetected();
			callbackUndetected = null;
			return true;
		};
	};
	
	var Fab = function() {
		FabUtils.apply(this);
		this.options.set({
			timeout: 200,
		});
		
		var self = this;
		var version = [4, 0, 0, 'beta', 3];
		var events = {};
		var pluginsClass = {};
		
		this.getVersion = function(toInt) {
			if(toInt !== true) {
				return version;
			} else {
				this.versionToInt(version);
			}
		};
		
		this.addEvent = function(name, callback) {
			this.errors.isString(name, 'name', 'addEvent');
			this.errors.isFunction(callback, 'callback', 'addEvent');
			
			if(events[name] === undefined) {
				events[name] = [];
			}
			events[name].push(callback);
			this.debug.log('set', 'Event "'+name+'" added');
			return this;
		};
		this.on = function(detected, callback) {
			this.errors.isBoolean(detected, 'detected', 'on');
			this.errors.isFunction(callback, 'callback', 'on');
			
			return this.addEvent(detected===true?'detected':'undetected', callback);
		};
		this.onDetected = function(callback) {
			this.errors.isFunction(callback, 'callback', 'onDetected');
			
			return this.addEvent('detected', callback);
		};
		this.onNotDetected = function(callback) {
			this.errors.isFunction(callback, 'callback', 'onNotDetected');
			
			return this.addEvent('undetected', callback);
		};
		var dispatchEvent = function(name) {
			var eventsList = events[name];
			if(self.debug.isEnable() === true) {
				var eventsNumber = (eventsList!==undefined?eventsList.length:0);
				self.debug.log('dispatchEvent', 'Starts dispatch of events "'+name+'" (0/'+eventsNumber+')');
			}
			if(eventsList !== undefined) {
				for(var i in eventsList) {
					if(self.debug.isEnable() === true) {
						self.debug.log('dispatchEvent', 'Dispatch event "'+name+'" ('+(parseInt(i)+1)+'/'+eventsNumber+')');
					}
					eventsList[i]();
				}
			}
			return this;
		};
		
		this.check = function(pluginsList, optionsList) {
			 if(pluginsList instanceof Array === false && optionsList === undefined) {
				optionsList = pluginsList;
				pluginsList = undefined;
			}
			if(pluginsList === undefined) {
				pluginsList = Object.keys(pluginsClass);
			}
			if(optionsList === undefined) {
				optionsList = {};
			}
			this.errors.isArray(pluginsList, 'pluginsList', 'check');
			this.errors.isObject(optionsList, 'optionsList', 'check');
			this.debug.log('check', 'Starting check');
			
			var plugins = {};
			var pluginsLength = pluginsList.length;
			var pluginsEndLength = 0;
			
			var end = function(pluginName, detected, force) {
				pluginsEndLength++;
				self.debug.log('check', (detected===true?'Positive':'Negative')+'" check of plugin "'+pluginName+'"');
				if(force === true || detected === true || pluginsEndLength === pluginsLength) {
					clearTimeout(timeout);
					for(var name in plugins) {
						plugins[name].instance.stop();
					}
					dispatchEvent(detected===true?'detected':'undetected');
				}
			};
			this.debug.log('check', 'Starting loading plugins (0/'+pluginsLength+') ('+pluginsList.join()+')');
			if(pluginsLength === 0) {
				end('#NoPlugin', false, true);
				return this;
			}
			for(var i in pluginsList) {
				var name = pluginsList[i];
				this.debug.log('check', 'Load plugin "'+name+'" ('+(parseInt(i)+1)+'/'+pluginsLength+')');
				var plugin = plugins[name] = {
					name:		name,
					instance:	new (pluginsClass[name]),
					detected:	null,
				};
				if(optionsList[name] !== undefined) {
					plugin.instance.options.set(optionsList[name]);
				}
				(function(end, plugin) {
					plugin.instance.setDetected(function() {
						plugin.detected = true;
						end(plugin.name, true);
					}).setUndetected(function() {
						plugin.detected = false;
						end(plugin.name, false);
					});
				})(end, plugin);
			}
			for(var name in plugins) {
				plugins[name].instance.start();
			}
			var timeout = setTimeout(function() {
				end('#Timeout', false, true);
			}, this.options.get('timeout'));
			return this;
		};
		
		this.registerPlugin = function(pluginClass) {
			this.errors.isFunction(pluginClass, 'pluginClass', 'registerPlugin');
			this.errors.isString(pluginClass.pluginName, 'pluginClass.pluginName', 'registerPlugin');
			this.errors.isArray(pluginClass.versionMin, 'pluginClass.versionMin', 'registerPlugin');
			if(pluginClass.versionMin.length !== 3) {
				this.errors.throwError('pluginClass.versionMin', 'registerPlugin', 'array with 3 values');
			}
			
			if(pluginsClass[pluginClass.pluginName] === undefined) {
				if(this.versionToInt(version) >= this.versionToInt(pluginClass.versionMin)) {
					pluginsClass[pluginClass.pluginName] = pluginClass;
					this.debug.log('registerPlugin', 'Plugin "'+pluginClass.pluginName+'" registered');
					return true;
				} else {
					throw 'The plugin "'+pluginClass.pluginName+'" ('+pluginClass.versionMin.join('.')+') is too recent for this version of '+debugName+' ('+version.join('.')+')';
				}
			} else {
				throw 'The plugin "'+pluginClass.pluginName+'" is already registered';
			}
			return false;
		};
		
		this.registerPlugin(FabPluginHtml);
		this.registerPlugin(FabPluginHttp);
	};
	Fab.getPluginClass = function() {
		return FabPlugin;
	};
	
	
	var FabPluginHtml = function() {
		Fab.getPluginClass().apply(this, arguments);
		this.options.set({
			loopTime:		50,
			baitElement:	null,
			baitClass:		'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links',
			baitStyle:		'width:1px!important;height:1px!important;position:absolute!important;left:-10000px!important;top:-1000px!important;',
			baitParent:		null,
		});
		
		var data = {};
		
		this.start = function() {
			var self = this;
			if(this.options.get('baitElement') === null) {
				data.bait = this.createBait({
					class: this.options.get('baitClass'),
					style: this.options.get('baitStyle'),
				});
				var baitParent = this.options.get('baitParent');
				if(baitParent === null) {
					window.document.body.appendChild(data.bait);
				} else {
					baitParent.appendChild(data.bait);
				}
			} else {
				data.bait = this.options.get('baitElement');
			}
			var check = function() {
				if(self.checkBait(data.bait, true) === true) {
					self.callDetected();
				}
			};
			data.loopTimeout = setTimeout(check, 1);
			data.loopInterval = setInterval(check, this.options.get('loopTime'));
			return this;
		};
		this.stop = function() {
			clearInterval(data.loopTimeout);
			clearInterval(data.loopInterval);
			var baitParent = this.options.get('baitParent');
			if(baitParent === null) {
				window.document.body.removeChild(data.bait);
			} else {
				baitParent.removeChild(data.bait);
			}
			return this;
		};
		
		this.createBait = function(options) {
			var bait = window.document.createElement('div');
			bait.setAttribute('class', options.class);
			bait.setAttribute('style', options.style);
			bait.offsetParent;
			bait.offsetHeight;
			bait.offsetLeft;
			bait.offsetTop;
			bait.offsetWidth;
			bait.clientHeight;
			bait.clientWidth;
			return bait;
		};
		this.checkBait = function(bait, checkBody) {
			var detected = false;
			if(checkBody === true && (window.document.body.getAttribute('abp') !== null)
			|| bait.offsetParent === null
			|| bait.offsetHeight == 0
			|| bait.offsetLeft == 0
			|| bait.offsetTop == 0
			|| bait.offsetWidth == 0
			|| bait.clientHeight == 0
			|| bait.clientWidth == 0) {
				detected = true;
			} else {
				var baitComputedStyle = window.getComputedStyle(bait);
				if(baitComputedStyle.getPropertyValue('display') == 'none'
				|| baitComputedStyle.getPropertyValue('visibility') == 'hidden') {
					detected = true;
				}
			}
			return detected;
		};
	};
	FabPluginHtml.pluginName = 'html';
	FabPluginHtml.version = [1, 0, 0];
	FabPluginHtml.versionMin = [4, 0, 0];
	
	
	var FabPluginHttp = function() {
		Fab.getPluginClass().apply(this, arguments);
		this.options.set({
			baitMode:	'ajax',
			baitUrl:	'/ad/banner/_adsense_/_adserver/_adview_.ad.json?adzone=top&adsize=300x250&advid={RANDOM}',
		});
		
		var data = {};
		
		this.start = function() {
			var self = this;
			data.end = false;
			var baitUrl = this.options.get('baitUrl').replace(/\{RANDOM\}/g, function() {
				return parseInt(Math.random()*100000000);
			});
			this._urlCheck(baitUrl, this.options.get('baitMode'), function() {
				if(data.end !== false) { return; }
				data.end = true;
				self.callDetected();
			}, function() {
				if(data.end !== false) { return; }
				data.end = true;
				self.callUndetected();
			});
			return this;
		};
		this.stop = function() {
			data.end = true;
			return this;
		};
		
		this._urlCheck = function(url, mode, cbDetected, cbUndetected) {
			var endSend = false;
			var end = function(detected) {
				if(endSend !== false) { return; };
				endSend = true;
				if(detected === true) {
					cbDetected();
				} else {
					cbUndetected();
				}
			};
			if(mode === 'ajax') {
				var readyStates = [false, false, false, false];
				var status = null;
				var respond = function(responseForce) {
					if(responseForce !== undefined) {
						end(responseForce);
					} else {
						if(status === 0) {
							end(true);
							return;
						}
						for(var i=0; i<4; i++) {
							if(readyStates[i] === false) {
								end(true);
								return;
							}
						}
						end(false);
					}
				};
				var xmlHttp = new XMLHttpRequest();
				xmlHttp.onreadystatechange = function() {
					readyStates[xmlHttp.readyState-1] = true;
					try {
						status = xmlHttp.status;
					} catch(e) {}
					if(xmlHttp.readyState === 4) {
						respond();
					}
				};
				try {
					xmlHttp.open('GET', url, true);
					xmlHttp.send();
				} catch(e) {
					if(e.result == '2153644038') {
						respond(true);
					}
				}
			} else if(mode === 'import') {
				var element = document.createElement('script');
				element.src = url;
				element.onerror = function() {
					end(true);
					window.document.body.removeChild(element);
				};
				element.onload = function() {
					end(false);
					window.document.body.removeChild(element);
				};
				window.document.body.appendChild(element);
			} else {
				end(false);
			}
		};
	};
	FabPluginHttp.pluginName = 'http';
	FabPluginHtml.version = [1, 0, 0];
	FabPluginHttp.versionMin = [4, 0, 0];
	
	
	window[className] = Fab;
	if(window[instanceName] === undefined) {
		var instance = window[instanceName] = new Fab;
		window.addEventListener('load', function() {
			setTimeout(function() {
				instance.check();
			}, 1);
		}, false);
	}
})(window, 'fuckAdBlock', 'FuckAdBlock');

var adBlockDetected = function() {
            $('h1 span').text('yes');
        }
        // We create the function that will be executed if AdBlock is NOT detected
        var adBlockUndetected = function() {
            $('h1 span').text('no');
        }
        // We observe if the variable "fuckAdBlock" exists
        if(typeof  FuckAdBlock === 'undefined') {
            // If it does not exist, it means that AdBlock blocking the script FuckAdBlock
            // Therefore the function "adBlockDetected" is executed
            // PS: The function is executed on the "document ready" in order to select the HTML with jQuery
            $(document).ready(adBlockDetected);
        } else {
            // Otherwise, our functions we add to FuckAdBlock for a classic detection
            fuckAdBlock.on(true, adBlockDetected).on(false, adBlockUndetected);
        }

setelah tercopy simpan .

Selanjutnya yaitu buat file index.html dan panggil script blocker.js , didalamnya

Untuk contoh dibawah saya menggunakan simple html .

<html>
    <head>
        <title> Simpel Diteksi Adblock</title>
    </head>
    <body>
        <h1>AdBlock status: <span>mohon tunggu...</span></h1>
    </body>
    
    <script type = "text/javascript" src="blocker.js"></script>  
    
</html>

Sesudah membuat index.html kita open with browser yg sudah dipasang adblock untuk mencobanya .

Adblock ini sudah saya test dan dapat diimplemantisakan dengan Adblock Plus atau adblock lainnya seperti Brave Browser .

Semoga Bermanfaat .

Selamat Mencoba .

Bismillah ..
More posts by Muhamad Ghufron.
Cara Block AdBlock Plus Dan Brave Browser Dengan JavaScript Untuk Publisher
Share
Twitter icon Facebook icon