您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Анкапчует врагов Абу(либералов, русофобов, антикоммунистов и котлетки).
// ==UserScript== // @name ancapchan for 2ch // @name:ru Анкапователь // @namespace po // @version 2020.10.23.1 // @author Атлант Рыночекпорешаев // @description Анкапчует врагов Абу(либералов, русофобов, антикоммунистов и котлетки). // @homepageURL https://pastebin.com/raw/LZ6FzmY0 // @include https://2ch.hk/po/* // @include https://2ch.pm/po/* // @run-at document-end // ==/UserScript== // Инструкция: качаем firefox и расширение https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/ // Для хрома https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo // Для оперы https://addons.opera.com/ru/extensions/details/tampermonkey-beta/ // Жмем New user script и кидаем туда всю эту пасту, может работать в паре с куклоскриптом. Не забываем нажать на вкл. // клики по двачую ставятся в случайном интервале между этими двумя значениями var minClickDelay = 19000; // минимальная задержка между кликами, мс var maxClickDelay = 30000; // максимальная задержка между кликами, мс var iconsArray = [ "Либерализм", "Либертарианство", "Анкап", ]; // слова для лайков var likeRegexArray = [ /пидора(шк|х)/im, /ватник/im, /пыня/im, /хуйло/im, /ботокс/im, /залуп/im, /подзалупн/im, /плешивы/im, /грязноштан/im, /пынеход/im, /госкап/im, /этатист/im, /гомосолдат/im, /вытиран/im, /членин/im, /сралин/im, /комибляд/im, /комипидор/im, /комигниль/im, /колумнист/im, /красножоп/im, /комуняк/im, /гулаг/im, /расклева/im, /комиглист/im, /котлетк(и|ок)/im, /стилан[\-\s]+3000/im, /стирай штаны/im, /рашка/im, /п(о|а)рашка/im, /вестник (дури|фури)/im, /совок/im, /туалетн.{2,3} бумаг/im, /анкапователь/im, ]; function noNull(val, nullValue) { if (val == null || val == undefined) { return nullValue; } else { return val; } } function filterBySage(post) { return noNull(post.querySelector('.post__anon'), {innerText: ''}).innerText.indexOf('Heaven') != -1; } function filterByRegex(post) { var toCheck = [ post.querySelector('.post__title'), post.querySelector('.post__message'), post.querySelector('.post__message_op'), ] .filter(function(post) { return post }) .map(function(post) { return post.innerHTML }) .map(function(html) { return html .replace(/<su[bp]><su[bp]><su[bp]><su[bp]><su[bp]>.*?<\/su[bp]><\/su[bp]><\/su[bp]><\/su[bp]><\/su[bp]>(?!<\/su[bp]>)/g, "") .replace(/<(?:a href=(?!"(?:irc|mailto):).*?<\/a|span class="[suo](?:poiler)?"|\/?(?:em|strong|su[bp]))>/g, "") .replace(/<(?:a href=(?!"(?:irc|mailto):).*?<\/a|span class="[suo](?:poiler)?"|\/?(?:em|span|strong|su[bp]))>/g, ""); }) .filter(function(post) { return post.length > 0 }); for(var regex of likeRegexArray) { var check = toCheck.filter(function(item) { return regex.test(item); }).length > 0; if (check) { return true; } } return false; } function makeIterator(array) { var i = 0; if (array[i]) { return function() { return array[i++]; }; } else { return function() { return false }; } } function scheduleCall(nextElm, callback) { var elm = nextElm(); if (elm) { callback(elm); setTimeout(function() { scheduleCall(nextElm, callback); }, 1000 + minClickDelay + Math.random() * (maxClickDelay - minClickDelay)); } } function disableFullscreenClose(fn) { var me = this; return function() { if (MExpandMedia && MExpandMedia.close) { var fullScreenClose = MExpandMedia.close; MExpandMedia.close = function() {}; fn.apply(me, arguments); MExpandMedia.close = fullScreenClose; } else { fn.apply(me, arguments); } }; } var elmClick = disableFullscreenClose(function(elm) { elm.click(); }); function dislikePosts(posts) { scheduleCall( makeIterator(posts.map(function(item) { return item.querySelector('.post__rate_type_dislike'); }) .filter(function(item) { return !item.classList.contains('post__rate_disliked'); })), elmClick ); } function likePosts(posts) { scheduleCall( makeIterator(posts.map(function(item) { return item.querySelector('.post__rate_type_like'); }) .filter(function(item) { return !item.classList.contains('post__rate_liked'); })), elmClick ); } function watchOnNewPosts(newPostsCallback) { var targetNode = document.body; if (targetNode) { var config = { childList: true, subtree: true }; // Callback function to execute when mutations are observed var callback = function(mutationsList, observer) { for(var mutation of mutationsList) { if (mutation.type == 'childList') { var posts = Array.prototype.filter.call(mutation.addedNodes, function(node) { return node instanceof Element && node.classList.contains('thread__post') }); if (posts.length > 0) { newPostsCallback(posts); } } } }; // Create an observer instance linked to the callback function var observer = new MutationObserver(callback); // Start observing the target node for configured mutations observer.observe(targetNode, config); } } function makeFilterByIcons(icons) { return function (post) { var img = post.querySelector('.post__icon img'); return img && img.title && icons.indexOf(img.title) != -1; }; } function filterNotLikedOrDisliked(post) { return post.querySelector('.post__rate_liked') == null && post.querySelector('.post__rate_disliked') == null; } function fnOr() { var args = Array.from(arguments); return function(item) { return args.some(function(fn) { return fn(item); }); }; } var posts = document.querySelectorAll(".thread__post"); var opPosts = document.querySelectorAll(".thread__oppost"); var allPosts = Array.from(new Set([...posts, ...opPosts])); var likesFilter = fnOr(makeFilterByIcons(iconsArray), filterByRegex); var postsToLike = allPosts.filter(likesFilter).filter(filterNotLikedOrDisliked); likePosts(postsToLike); var dislickesFilter = fnOr(filterBySage, makeFilterByIcons(['Коммунизм', 'Социализм', 'Соцдем'])); dislikePosts(allPosts.filter(dislickesFilter).filter(filterNotLikedOrDisliked)); watchOnNewPosts(function(posts) { setTimeout(function() { likePosts(posts.filter(likesFilter)); dislikePosts(posts.filter(dislickesFilter)); }, 0); });