// ==UserScript==
// @name Remove ad posts @VK
// @version 0.5.20161206.2
// @description removes ad posts from feed and walls by keywords
// @match *://*.vk.com/*
// @copyright 2016, StSav012
// @author StSav012
// @namespace vkap
// @run-at document-idle
// ==/UserScript==
var actualCode = '(' + function() {
var keywords = [
"РЕПОСТ", "REPOST",
"делать репост", "делать \"репост\"", "дeлaйтe рeпoст", "делай репост", "делавшему репост",
"епост этой записи", "епост данной записи", "епост записи", "оделиться записью", "репостни этот пост",
"айк и репост", "айки и репосты", "айк, репост",
"Забирай на стену", "забирайте себе на стену", "Сохрани себе на стену", "сохранить на стену", "сохраните себе этот пост",
"закрепить у себя на стене",
"озыгрыш по репосту", "репоснет эту запись", "за репост даем", "бонус за репост",
"ВСТУПАЙТЕ", "ступите в группу", "ступите в нашу группу", "ступаем в группу", "ступайте в группу", "ступить в группу", "Вступай",
"ыть участником", "ыть подписчиком", "ыть нашим подписчиком",
"ДОБАВЬ", "ДОБАВЛЯЙТЕ", "обавляйся в друзья", "обавляйтесь в друзья", "добавляйся ко мне в друзья",
"Зайди поглазеть на эти посты", "Заходи на раздачу",
"ОСТАВЬ ЗАЯВКУ", "Оставь заявку", "оставь заявку", "Оставьте заявку",
"Регистрация всего за", "Регистрация пока бесплатна", "Успей зарегистрироваться",
"ЗАПИШИСЬ НА ",
"БЕСПЛАТН", "бесплатно дадим", "Получить бесплатн", "бесплатно откроем Вам",
"качать бесплатно",
"ПОДАРОК",
"СКИДКА", "СКИДКОЙ", "Выбирай со скидкой", "с нереальными скидками", "дарим скидку",
"Заказатъ со скидкой", "Заказывайте со скидкой",
"ВЫИГРАЙ", "получи шанс выиграть",
"КОНКУРС", "Внимание! Конкурс!",
"АКЦИЯ", "АКЦИИ", "АКЦИЮ", "Мега-Акция", "Акция до конца", "#акция",
"РОЗЫГРЫШ", "Ссылка на розыгрыш", "в сообществе проходит супер-розыгрыш", "участвуйте в розыгрыше",
"обедители будут выбраны случайным образом", "обедитель будет выбран случайным образом",
"РАСПРОДАЖА", "Последняя распродажа топовых", "Ликвидация склада",
"Успейте оставить заявку", "Спешите получить",
"СКОРО ОТКРЫТИЕ",
"Записывайтесь на бесплатное занятие",
"ПОДПИШИСЬ", "одпишись", "одпишитесь на", "одписывайтесь на ", "одписывайтесь - ", "одписывайся", "одписываемся!",
"ыть подписчиком", "ыть подписанным", "одписался на", "одписаться",
"одписаться на группу", "одписаться на канал можно здесь", "одписаться +", "+ Подписаться", "Приглашаем подписаться на",
"КУПИТЬ", "ЗАКАЖИТЕ", "Заказать можно тут",
"Подарок можно забрать", "Вы сможете забрать ваш подарок", "Быстрая доставка",
"бизнес-план", "бизнес-проект",
"Читать продолжение ", "Чит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",
"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"
];
var selectors = [
"div.reply",
"div._post, div.feed_row, div.wall_item"
];
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://gf.qytechs.cn/ru/scripts/1978-vk-com-no-politic-feed/code
{ // does it worth checking the post?
if(d.innerHTML.length>0)
{
for(j=0; j<keywords.length; ++j)
{
if(d.innerHTML.includes(keywords[j]))
{
// 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');
}
}
}
}
}
}
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, observer){
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);