Простой фильтр ленты VK по «плохим» словам и кем он может стать

в 18:16, , рубрики: javascript, Вконтакте, родительский контроль, социальные сети, Социальные сети и сообщества, метки: , , ,

Привет.

Отступление:

В этом посте вы не найдете той самой таблетки от всех болезней, но тут есть решение атомарной задачи, пускай и не совсем красивое. Цели этого поста получить больше фидбека, завязать обсуждение, заразить идеей, подтолкнуть. Хоть в данном случае речь идет о ВКонтакте, я бы попросил читателя абстрагироваться от этой соц. сети и посмотреть на это более глобально.

Проблема:

ВКонтакте есть возможность прятать единичные посты и блокировать показ постов от конкретных людей, групп и приложений. Но нельзя прятать посты с нежелательным содержимым.

Опишу на простом примере:

Я подписан на музыкальное сообщество и мне нравится периодически обновлять плейлисты, случайно узнавать новые группы и тд. Но мне не нравится видеть по несколько раз в день одни и те же рекламные посты. С репостами все просто: можно заблокировать источник. А как быть с рекламными постами от лица самого сообщества? Да, можно заблокировать посты сообщества в ленте и периодически заходить за новой музыкой, но тут теряется удобство пользования. Пример далеко не единственный. В ленте есть много сообществ и людей с интересными постами, но иногда, а временами частенько от них сыплется множество нежелательных постов.

От проблемы к решению:

Выбор пал на javascript. Немного экспериментов в консоли и код готов:

function setWords() {
    words = prompt('Enter bad words and phrases. Comma separated (,).',localStorage.getItem('bad_words'));
    if(typeof(words) == 'string') {
        localStorage.setItem('bad_words',words);
    }
}

function hunt() {
    if( ! localStorage.getItem('bad_words')) {
        setWords();
        return;
    }
    textArr = localStorage.getItem('shit_words').split(',');
    posts = document.getElementsByClassName('feed_row');
    for(ii =0; ii<posts.length; ii++) {
        for(ll = 0; ll<textArr.length; ll++) {
            if(posts[ii].innerText.search(textArr[ll].trim()) > 0) {
                thepost = document.getElementsByClassName('feed_row')[ii].children[0];
                idToDel = thepost.getAttribute('id').split('post')[1];
                delElement = document.getElementById('post_delete'+idToDel);
                if(delElement) {delElement.click();}
                break;
            }
        }
    }
    setTimeout('hunt()',5000);
};

hunt();
if( ! document.getElementById('vk_feed_cleaner')) {
    menuVK=document.getElementById('side_bar').children[0]; 
    a=document.createElement('a');   
    a.setAttribute('href','javascript:setWords();');
    a.innerText = 'Set Bad Words';
    li=document.createElement('li'); 
    li.setAttribute('id','vk_feed_cleaner');
    li.appendChild(a);
    menuVK.appendChild(li);
}
Принцип до безобразия прост:

Запускаем в консоли скрипт.
При первом запуске он попросит ввести «плохие» слова или фразы. (разделитель запятая)
Сохраняет слова в localStorage.
Каждые 5 секунд пробегаем по содержимому постов: HTML элементы с классом «feed_row»
Если в тексте элемента найдено хотя бы 1 плохое слово, то программно кликаем на HTML элементе удаления поста.
В боковое меню помещается ссылка: Set Bad Words, по клику на которую можно изменить список плохих слов.

jsfiddle.net/U2r9k/7/ — а тут есть ссылка, перетащив которую на панель закладок, можно активировать код по клику.

Не оптимизировано? Деревянно? Не сексуально? Главное, что заработало, и моя проблема была решена. Очень надеюсь, что многим людям он поможет так же как и мне.

Сразу же пошли в голове мысли об оптимизации процесса.

Минусы очевидны:

Скрипт требует запуска каждое открытие или перезагрузку страницы.
Большие словари будут нагружать браузер.

Возможные варианты решения этой проблемы:

Создать расширения для браузеров.
Создать офлайн приложение, которому дать доступ к своему аккаунту. Приложение будет 24 часа в сутки фильтровать ленту.

Безусловно второй вариант лучше, т.к. одно приложение решает проблему кроссплатформености. Но первый вариант тоже имеет право на существование — родительский контроль.

Если офлайн приложение может только фильтровать личную ленту пользователя, то расширение для браузера будет «ходить» вместе с пользователем. У меня есть дети, которые, пока еще не пользуются, но скоро будут пользоваться компьютером.

Представим, что приложение может развиться до такого простенького сервиса, где будет онлайн база словарей/масок по категориям (например: вконтакте 18+, одноклассники реклама)
И расширения для браузеров, поддерживающее несколько соц. сетей.
Устанавливаете расширение и выбираете словари. Ребенок ищет видео, просматривает свои новости, чужие страницы, сообщества, а контент прогоняется через фильтр и нежелательные элементы прячутся/удаляются.
Этакий аналог AdBlock.

Существует еще одна проблема — дубликаты. Я говорю не о репостах, а о случаях когда один и тот же контент постится от лица конкретного сообщества/человека. Ситуация довольно частая. Быть может это приложение, сохраняющее этакий фингерпринт поста в базу «я это уже видел, больше можно не отображать». Часто посты просто копируются друг у друга, и очень редко контент переписывается. Кстати, с таким приложением будет решена проблема с повторяющимися рекламными постами в ленте.

Интересны мнения на этот счет.

И напоследок опрос по теме.

P.S. Возможно такие приложения/сервисы уже существуют, но таких я не нашел, если кому известно, поделитесь.

Всем добра.

Автор: igentuman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js