Remove ad posts from VK.com

removes ad posts from feed and walls by keywords

À partir de 2017-12-09. Voir la dernière version.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name            Remove ad posts from VK.com
// @version         0.6.20171209.2
// @description	    removes ad posts from feed and walls by keywords
// @match           *://*.vk.com/*
// @grant           none
// @copyright       2016, StSav012
// @author          StSav012
// @namespace       vkap
// @run-at          document-idle
// ==/UserScript==

"use strict";

var actualCode = '(' + function() {
	"use strict";
	var keywords = [
		"РЕПОСТ", "REPOST",
		"д(е|e)л(а|a)ть (|\")(р|p)(е|e)п(о|o)(с|c)т(|\")", "д(е|e)л(а|a)й(т|)(е|e|) (|\")(р|p)(е|e)п(о|o)(с|c)т(|\")",
		"делавшему (|\")(р|p)(е|e)п(о|o)(с|c)т(|\")", "(Р|р|P|p)(е|e)п(о|o)(с|c)т( этой| данной|) записи",
		"(П|п)одели(ться|сь)(| этой|этим) (записью|сообщением)",
		"(р|p)(е|e)п(о|o)(с|c)тни этот пост",
		"(а|a)йк(и|)( и|,) (р|p)(е|e)п(о|o)(с|c)т(ы|)",
		"(З|з)абирай(|те)(| себе) на стену", "(С|с)охрани(|ть|те)(| себе) (на стену|этот пост)",
		"(З|з)акрепить( эту запись| ее| её)( у себя|) на стене",
		"озыгрыш по репосту", "репоснет эту запись", "за репост даем", "бонус за репост",
		"ВСТУПАЙ(ТЕ|)", "ВСТУПИТЕ", "(В|в)ступ(и|ить|аем|ите|айте|ай) в(| нашу| эту) (группу|сообщество)",
		"(В|в)ступай",
		"БЫТЬ ПОДПИСАННЫМ НА СООБЩЕСТВО", "(та|ы)ть( нашим|) (подписчиком|участником)",
		"ДОБАВЬ", "ДОБАВЛЯЙТЕ", "обавляйся в друзья", "обавляйтесь в друзья", "добавляйся ко мне в друзья",
		"Зайди поглазеть на эти посты", "Заходи на раздачу",
		"ОСТАВЬ ЗАЯВКУ", "(О|о)ставь(|те) заявку",
		"Регистрация всего за", "Регистрация пока бесплатна", "Успей зарегистрироваться",
		"ЗАПИШИСЬ НА ",
		"БЕСПЛАТН", "бесплатно дадим", "Получить бесплатн", "бесплатно откроем Вам",
		"качать бесплатно",
		"ПОДАРОК",
		"СКИДК(А|И|ОК|У|ОЙ|Е)", "Выбирай со скидкой", "с нереальными скидками", "дарим скидку", "Скидки на весь ассортимент",
		"(С|с)делать это со скидкой",
		"За репост скидка",
		"Заказ(атъ|ывайте|ывай) со скидкой",
		"ВЫИГРАЙ", "получи шанс выиграть", "Выигрaй",
		"КОНКУРС", "Внимание! Конкурс!",
		"АКЦИ(Я|И|Ю|ЕЙ)", "Мега-Акция", "Акция до конца", "#акция",
		"РОЗЫГРЫШ", "Ссылка на розыгрыш", "в сообществе проходит супер-розыгрыш", "(У|у)частвуй(те|) в (Р|р)озыгрыше",
		"(Р|р)озыгрыш только для подписчиков",
		"(Т|т)олько (для|среди) (подписч|участн)иков(| нашей| этой| нашего| этого) (группы|сообщества)",
		"обедител(и|ь) буд(у|е)т выбран(ы|) случайным образом",
		"РАСПРОДАЖА", "Последняя распродажа топовых", "Ликвидация склада",
		"Успейте оставить заявку", "Успейте забронировать", "Спешите получить",
		"СКОРО ОТКРЫТИЕ",
		"Записывайтесь на бесплатное занятие",
		"ПОДПИШИСЬ", "ПОДПИСЫВАЙСЯ", "одпишись", "одпишитесь (на|-|\\+) ", "одписывайтесь (на|-|\\+) ", "одписывайся", "одписываемся!",
		"ыть подписчиком", "ыть подписанным", "одписался на", "одписаться", "Подпишись и ты",
		"одписаться на группу", "одписаться на канал можно здесь", "одписаться \\+", "\\+ Подписаться", "Приглашаем подписаться на",
		"одписывай на ", "забывайте подписываться на", "\">Подписывайтесь<\\/",
		"КУПИТЬ", "ЗАКАЖИТЕ", "Заказать можно тут",
		"Подарок можно забрать", "Вы сможете забрать ваш подарок", "Быстрая доставка",
		"бизнес-(план|проект)",
		"Читать продолжение ", "Читaйтe пoлнocтью здecь", "Смотреть ответ в источнике",
		"Подробн(ее|ости)( акции|) (здесь|на странице)", "Ты должен видеть это", "Ты должен это видеть", "зна(ть|й|вайте) подробн(ее|ости)",
		"(мотрите|ереходите) по ссылке", "Условия акции можно найти здесь", "смотреть дальше", "больше подробностей внутри",
		"Узнай(|,)( как|)(|,) тут", // ← facepalm
		"Центр образовательных технологий Advance",
		"«Как развить свою память» или «Секреты эффективного обучения»",
		"Начни играть тут", "начни играть в", "Играй тут", "Качай игру",
		"NovaPizza.ru", "skypeteach.ru", "english4now.com", "advance-club.ru", "sdelano.ru", "edgarkulikov.ru", "citystarwear.com",
		"befree-school.ru", "bright-shopping.ru", ".sale-gooods.ru", "www.kopikot.ru", ".bebetter.guru", "www.in-build.ru",
		"1media-buyer.ru", "itunes.apple.com%2Fapp%2Fapple-store%2Fid695634432", "sale-stop.ru", "offersboard.ru", "artskills.ru",
		"elementaree.ru", "start-mobile.net", ".hitnsale.ru", "вконкурс.рф", "printbar.ru", "tracking.leaddealer.net", "envylab.ru",
		"job.beeline.ru",
		"newstockgeneration.space", "zarabotays.ru", "zarabotoki.ru", "zarabotokgames.ru", ".advertapp.ru",	// suspicious sites
		"class=\"wall_marked_as_ads\"",	// to avoid ads from groups
		//"ads_promoted_post",	// to avoid promoted posts; reused later
		"app_title_"	// that's to avoid ads from games
	];
	var urls = [
		"/domavern", "/businessstrategy", "/virashopru", "/tri10oe", "/kinona5", "/watson_club", "/brutal_kitchen",
		"/vkchydaku", "/brandclubkiiik", "/web_highlights_kurs", "/tatoo_sketch", "/artihard", "/kulinarka", "/skyeng",
		"/princapioff", "/illusthigh", "/chestnoeauto", "/otdamdarom"
	];
	var selectors = [
		"div.reply",
		"div.feed_row, div.wall_item, div.post_copy, div.post_fixed, div#page_wall_posts>div.page_block"
	];
	var dom_ad = [	// beware: these rules might break the site
		"div.ads_ad_box",
		"div[data-ad-block-uid]"
	];
	var divs;	// selected tags list
	var n;		// length of the list
	var d;		// a DOM item
	var h, i, j, k;	// just iterators
	function cleanAd() {
		for (h = 0; h < selectors.length; ++h) {
			divs = document.querySelectorAll(selectors[h]);
			n = divs.length;
			for (i = 0; i < n; ++i) {				// we check it from the very beginning and to the end
				d = divs[i];
				if (d.getAttribute('no_ad') != 'true') {	// from https://greatest.deepsurf.us/ru/scripts/1978-vk-com-no-politic-feed/code
					// does it worth checking the post?
					for (j = 0; j < keywords.length; ++j) {
						var pattern = new RegExp(keywords[j]);
						if (pattern.test(d.innerHTML)) {
							//	d.parentNode.style.backgroundColor = "red"; // ← for debugging purposes
							d.parentNode.removeChild(d);
							break;
						}
					}
					for (k = 0; (j >= keywords.length) && (k < urls.length); ++k) {
						if (!window.location.pathname.includes(urls[k]) && d.innerHTML.includes(urls[k])) {
							//	d.parentNode.style.backgroundColor = "red"; // ← for debugging purposes
							d.parentNode.removeChild(d);
							break;
						}
					}
					if ((j >= keywords.length) && (k >= urls.length)) {
						if(d.querySelector("span.wall_copy_more") === null) {
							d.setAttribute('no_ad', 'true');
						}
					}
				}
			}
		}
		for (h = 0; h < dom_ad.length; ++h) {
			divs = document.querySelectorAll(dom_ad[h]);
			n = divs.length;
			for (i = 0; i < n; ++i) {
				d = divs[i];
				d.parentNode.removeChild(d);
			}
		}
	}
	cleanAd();
	// see http://stackoverflow.com/a/14570614
	var observeDOM = (function() {
		var MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
			eventListenerSupported = window.addEventListener;

		return function(obj, callback) {
			if (MutationObserver) {
				// define a new observer
				var obs = new MutationObserver(function(mutations) {
					if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
						callback();
					}
				});
				// have the observer observe foo for changes in children
				obs.observe(obj, {childList: true, subtree: true});
			}
			else if (eventListenerSupported) {
				obj.addEventListener('DOMNodeInserted', callback, false);
				obj.addEventListener('DOMNodeRemoved', callback, false);
			}
		};
	})();
	var containers = document.querySelectorAll('body');
	n = containers.length;
	for (i = 0; i < n; ++i) {
		d = containers[i];
		observeDOM(d, cleanAd);
	}
} + ')();';
var script = document.createElement('script');
script.textContent = actualCode;
(document.body||document.documentElement).appendChild(script);