Pull to refresh

Privoxy + opera избавляемся от рекламы

Reading time7 min
Views3.2K
После приобретения безлимитки и включения картинок (да-да, маленькие радости провинциального студента) ребром встал вопрос выбора рекламорезалки. Здесь небольшое лирическое отступление: я ненавижу рекламу. Нет, все в интернете ненавидят рекламу, но я имею как минимум 3 веских причины ее ненавидеть:
1) Ярко, пестро, часто мешает серфингу
2) Мой старичок-комп с трудом ворочает цветастыми флешами. Отцовский комп и подавно.
3) Больно неприятно, показывая матери книгу на варезнике, лицезреть прыгающую голую задницу и прочее.
И я, и отец использовали оперу и менять ее на что-либо не собирались, поэтому проблема выбора рекаморезчика стояла довольно остро. Юзать Block CSS в опере мне почему-то не хотелось, а сейчас и подавно не хочется. После непродолжительного гуглинга мой выбор пал на privoxy. Это мощный рекламорезчик, работающий на стороне роутера (в моем случае, т.к у меня домашняя локалка-роутер на слаке, мой комп и отца) в виде прокси сервера. Такой подход в фильтрации рекламы меня устраивал, т.к можно было легко прописать проксю, при желании отключить и тому подобное.
В этой заметке я опишу свои шаги по установке и настройке privoxy на мой домосервер под skackware 13.
Для начала пришлось создать юзера и группу privoxy. Оставляю способ создания на ваш выбор.
Я решил ставить программу с помощью src2pkg. И тут выяснилось, что без нескольких телодвижений не обойтись.
Пример установки выглядит примерно так:
mkdir /tmp/privoxy
cd /tmp/privoxy
wget 'http://heanet.dl.sourceforge.net/project/ijbswa/Sources/3.0.16%20(stable)/privoxy-3.0.16-stable-src.tar.gz'

Далее создаем в этой же папке два скрипта:
privoxy.src2pkg:
#!/bin/bash
## src2pkg script for: privoxy
## Auto-generated by src2pkg-2.2
## src2pkg - Copyright 2005-2009 Gilbert Ashley <amigo@ibilio.org>

SOURCE_NAME='privoxy-3.0.16-stable-src.tar.gz'
NAME='privoxy' # Use ALT_NAME to override guessed value
VERSION='3.0.16' # Use ALT_VERSION to override guessed value
# ARCH=''
# BUILD='1'
# PRE_FIX='usr'

# from the privoxy.SlackBuild:
PRIVOXY_USER=${PRIVOXY_USER:-privoxy}
PRIVOXY_GROUP=${PRIVOXY_GROUP:-privoxy}
if ! grep -q ^$PRIVOXY_GROUP: /etc/group 2>/dev/null ; then
echo " Error: PRIVOXY group ($PRIVOXY_GROUP) doesn't exist."
echo " Try creating one with: groupadd -g 206 $PRIVOXY_GROUP"
exit 1
fi
if ! grep -q ^$PRIVOXY_USER: /etc/passwd 2>/dev/null ; then
echo " Error: PRIVOXY user ($PRIVOXY_USER) doesn't exist."
echo " Try creating one with: useradd -u 206 -g $PRIVOXY_GROUP -d /dev/null -s /bin/false $PRIVOXY_USER"
exit 1
fi

# Any extra options go here:
EXTRA_CONFIGS="--sysconfdir=/etc/$NAME \
--localstatedir=/var \
--docdir=$docdir/$NAME-$VERSION \
--with-docbook=no \
--with-user=$PRIVOXY_USER \
--with-group=$PRIVOXY_GROUP"

# Optional function replaces configure_source, compile_source, fake_install
# To use, uncomment and write/paste CODE between the {} brackets.
# build() { CODE }

# Get the functions and configs
. /usr/libexec/src2pkg/FUNCTIONS ;

# Execute the named packaging steps:
pre_process
find_source
make_dirs
unpack_source
fix_source_perms

#cd $SRC_DIR
#autoheader
#autoconf

configure_source #
compile_source # If used, the 'build' function replaces these 3
fake_install #

mkdir -p $PKG_DIR/etc/$NAME/templates
cp $SRC_DIR/templates/* $PKG_DIR/etc/$NAME/templates

#Adapted from the privoxy.SlackBuild:
rm -rf $PKG_DIR/etc/rc.d
mkdir -p $PKG_DIR/etc/rc.d
cat $SRC_DIR/slackware/rc.privoxy.orig > $PKG/etc/rc.d/rc.$NAME.new
sed -i " s/%PROGRAM%/$NAME/
s,%SBIN_DEST%,/usr/bin,
s,%CONF_DEST%,/etc/$NAME,
s/%USER%/$NAME/
s/%GROUP%/$NAME/
" $PKG_DIR/etc/rc.d/rc.$NAME.new

# Fix Path within the configuration files (thanks to h4kteur)
sed -i "s#$PKG_DIR##g" $PKG_DIR/etc/$NAME/config
# Fix Path with the config file to point to right usermanual (thanks to BP{k})
sed -i \
"s#user-manual /usr/doc/$NAME#user-manual /$docdir/$NAME-$VERSION#" \
$PKG_DIR/etc/privoxy/config

# Make .new files so we dont clobber existing configuration
find $PKG_DIR/etc/privoxy -type f -exec mv {} {}.new \;
# Don't clobber the logfile either
mv $PKG_DIR/var/log/privoxy/logfile $PKG_DIR/var/log/privoxy/logfile.new
# Remove this directory since it's empty and part of Slackware base
rmdir $PKG_DIR/var/run &> /dev/null

fix_pkg_perms
strip_bins
create_docs
compress_man_pages
make_description
make_doinst
make_package
post_process


doinst.prepend:
# Keep same perms on rc.privoxy.new:
if [ -e etc/rc.d/rc.privoxy ]; then
cp -a etc/rc.d/rc.privoxy etc/rc.d/rc.privoxy.new.incoming
cat etc/rc.d/rc.privoxy.new > etc/rc.d/rc.privoxy.new.incoming
mv etc/rc.d/rc.privoxy.new.incoming etc/rc.d/rc.privoxy.new
fi

# If there's no existing log file, move this one over;
# otherwise, kill the new one
if [ ! -e var/log/privoxy/logfile ]; then
mv var/log/privoxy/logfile.new var/log/privoxy/logfile
else
rm -f var/log/privoxy/logfile.new
fi

if ! grep -q ^privoxy: /etc/group 2>/dev/null ; then
echo " Error: PRIVOXY group 'privoxy' doesn't exist."
echo " Creating one with: groupadd -g 206 privoxy"
groupadd -g 206 @PRIVOXY_GROU@
fi

if ! grep -q ^privoxy: /etc/passwd 2>/dev/null ; then
echo " Error: PRIVOXY user 'privoxy' doesn't exist."
echo " Try creating one with: useradd -u 206 -g privoxy -d /dev/null -s /bin/false privoxy"
exit 1
fi

if ! [ -x etc/rc.d/rc.privoxy ]; then
echo " etc/rc.d/rc.privoxy must be set executable to enable privoxy at boot-time:"
echo " chmod 755 /etc/rc.d/rc.privoxy"
fi

За скрипты говорим спасибо разработчику src2pkg Гильберту Эшли.
Ставим права на выполнение. После этого собираем пакет и ставим privoxy командой
src2pkg -X -C -I
Программа установилась успешно. Мне потребовалось минимальное изменение конфига:
1. закомментировал listen-address 127.0.0.1:8118
2. listen-address 192.168.0.1:8118
3. permit-access 192.168.0.0/24
Далее нужно изменить файл /etc/rc.d/rc.privoxy

PRIVOXY_USER="privoxy"
PRIVOXY_GROUP="privoxy"


Теперь можно впервые запускать privoxy:
root@ironnet:/tmp/privoxy# /etc/rc.d/rc.privoxy start
Starting privoxy: OK


Теперь все что мне осталось это прописать в браузере прокси 192.168.0.1:8118

К сожалению, по истечении некоторого времени, оказалось, что встроенный фильтр не справляется с фильтрацией. После непродолжительного гуглинга отсюда был позаимствован скрипт на питоне для автоматической генерации правил на основе блоклиста от морпеха.
Я чуть чуть его изменил, добавив еще один блоклист для парсинга. Итого вышло вот что:
#!/usr/bin/perl

# Updated: 2010/03/17 12:58:26

###############################################################################
# adblock2privoxy.pl
###############################################################################
# Copyright 2010 Arcady N. Shpak (Greignar) arsengine.org.ru
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
################################################################################

# codepage utf8

use strict;

# Каталог с конфигурацией Привокси (без завершающего слэша '/')
my $cfg = '/etc/privoxy';
# Временный каталог (без завершающего слэша '/')
my $tmp = '/tmp';

my $file = '/adblock.tmp';

&WriteFile(">$cfg/adblock.action", '');

# Грузим и парсим блоклисты Адблока
&process('http://ruadlist.googlecode.com/svn/trunk/adblock.txt', 'ru-adlist-list');
&process('http://ruadlist.googlecode.com/svn/trunk/antinuha.txt', 'ru-adult-list');
&process('http://ruadlist.googlecode.com/svn/trunk/adblockeh.txt', 'ru-adult-list');
# Если нужно распарсить еще, то запускаем функцию следующим образом:
# &process('адрес блоклиста', 'имя - какое пожелаете');

exit;

sub process
{
my ($url, $name) = @_;
my (@adblock, @white, @black);
&WriteFile(">$tmp$file", '');
system("wget $url -O $tmp$file");
return unless(-e "$tmp$file" );
@adblock = &ReadFile("<$tmp$file");
foreach(@adblock) {
# Предварительная очистка
$_ = &clean($_);
# Пропускаем пустые строчки
next if($_ =~ /^$/);
# Пропускаем комментарии
next if($_ =~ s/^[\[\!]+.*//);
# Пропускаем фильтры стилей
next if($_ =~ s/\#.*//);
# Пропускаем маски с дополнениями
next if($_ =~ s/\$.+//);
# Пропускаем регэкспы, в Привокси этих масок предостаточно
next if($_ =~ s/^.*[\[\(\\]+.*//);
# Добавляем строку в белый список
if($_ =~ /^\@.*/) { unshift(@white, &mask($_)); next; }
# Добавляем строку в черный список
if($_ =~ /^(\*|\||).*/) { unshift(@black, &mask($_)); next; }
}
@black = sort(@black);
@white = sort(@white);
# Сбрасываем списки в файл
&WriteFile(">>$cfg/adblock.action", "{+block{$name}}\n@black\n");
&WriteFile(">>$cfg/adblock.action", "{-block}\n@white\n");
# Меняем права доступа
system("chmod a+rw $cfg/adblock.action");
}

sub mask
{
my $url = shift;
my($host, $path);
# Подготавливаем URL для последующей обработки
$url =~ s/^[\@\|\.]+//g;
$url =~ s/^.*?:\/\/+//g;
$url =~ s/\$.*$//g;
$url =~ s/[|]+$//g;
$url =~ s/\*$//g;
$url =~ s/\^/\//g;
$url =~ s/^\*/\/*/;
$url =~ s/^([-_]+)/\/*$1/;
$url =~ s/\/+/\//;
# Разделяем домены и каталоги
$url =~ s/(\/.*)$//; $path = $1;
$url =~ s/^([^\/]*)//; $host = $1;
# Чистим домены от www
$host =~ s/^www\.//ig;
# Переводим каталоги в формат регэкспов (если надо)
if($path =~ /[\*\?]/) {
$path =~ s/([\\\?\&\.\,])/\\\1/g;
$path =~ s/\*/.*/g;
}
# Чтобы блокировались домены всех уровней
$host = '.' . $host if($host ne '');
return "$host$path\n";
}

sub clean()
{
my ($str) = @_;
chomp $str;
# Зачищаем строку от всего лишнего
$str =~ s/^\s+|\s+$//g;
$str =~ s/[\r\n]+//g;
return $str;
}

sub ReadFile
{
my($file, @body);
$file = $_[0];
open(local *F, $file) || die("Can't open data-file $file\n",$!);
binmode F;
@body = ;
close(F);
return @body;
}

sub WriteFile
{
my($file, $body, $mode, $access);
$file = $_[0];
$body = $_[1];
open(local *F, $file) || die("Can't create data-file $file\n",$!);
binmode F;
flock(F, 2);
print F $body;
close(F);
return 1;
}

1;


Сохраняем данное чудо под именем adblock2privoxy.pl в каталог /etc/privoxy, выдаем права на исполнение. Далее выдержка из ридми к данному скрипту:

Скрипт adblock2privoxy.pl написан на Perl и предназначен для добавления блоклистов AdBlock в Privoxy.

Установка (Linux):

1. Копируете скрипт в любую понравившуюся папку.
2. Изменяете необходимые параметры в скрипте ($cfg, $tmp)
3. Делаем скрипт исполняемым.
4. Делаете изменения в конфиге Privoxy в секции "actionsfile":
перед строкой: actionsfile user.action
ставите строку: actionsfile adblock.action
5. Запускаете его вручную (из под sudo) или с помощью cron'а
6. При необходимости производите рестарт Privoxy


Что мы и делаем.

Ну и для полного счастья добавляем в крон:

40 4 * * * /etc/privoxy/adblock2privoxy.pl
42 4 * * * /etc/rc.d/rc.privoxy restart


Итого: мы получаем очень шустрый, легко настраиваемый, регулярно обновляющийся и главное корректно и логично работающий рекламорезчик для оперы. Ну не красота ли?

Ну в качестве финального штриха я предоставлю вам на суд пару скриншотов.
До привокси:

После:
Tags:
Hubs:
Total votes 7: ↑4 and ↓3+1
Comments0

Articles