Greasy Fork

Greasy Fork is available in English.

Remove ad posts from VK.com

removes ad posts from feed and walls by keywords

当前为 2017-12-23 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name            Remove ad posts from VK.com
// @version         0.6.20171223.1
// @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 http://greasyfork.icu/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);