...

воскресенье, 9 марта 2014 г.

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

Привет, Хабр.
Отступление:



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


Проблема:



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



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



Выбор пал на 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, по клику на которую можно изменить список плохих слов.

http://ift.tt/1i1yxaD — а тут есть ссылка, перетащив которую на панель закладок, можно активировать код по клику.


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


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


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



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

Большие словари будут нагружать браузер.
Возможные варианты решения этой проблемы:



Создать расширения для браузеров.

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

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


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


Представим, что приложение может развиться до такого простенького сервиса, где будет онлайн база словарей/масок по категориям (например: вконтакте 18+, одноклассники реклама)

И расширения для браузеров, поддерживающее несколько соц. сетей.

Устанавливаете расширение и выбираете словари. Ребенок ищет видео, просматривает свои новости, чужие страницы, сообщества, а контент прогоняется через фильтр и нежелательные элементы прячутся/удаляются.

Этакий аналог AdBlock.


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


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


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


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


Всем добра.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий