IZONE- http://www.izcity.com/- бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

Баннерная система на CGI

Сергей Гуйдя brima@aiq.ru

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

Простейший случай применения баннеров -- это дружеский обмен ими: ты мне, я тебе. Этот случай настолько прост, что на нем не стоит особо заострять свое внимание. Если вам это потребуется, просто нарисуйте картинку и создайте вот такой код:

<A href="http://www.myserver.ru/">
<IMG src="http://myserver.ru/pics/mybanner001.gif" width=100 height=100
<$TSpBelow=83;>alt="Welcome to my site"></A>

Отошлите этот код тому, у кого вы собираетесь разместить свой баннер. Ну и, соответственно, получите от него HTML-код баннера и вставьте его в свою страничку. Вот и весь обмен баннерами.

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

  1. Нужно организовать базу данных баннеров и соответствующих им URL. Эта база данных должна предусматривать добавление, модификацию и удаление записей.
  2. Регистрация сайтов, на которых данные баннеры будут размещаться. В том случае, если вы организуете службу обмена баннерами, эта база будет совпадать с предыдущей.
  3. Выбор баннера из базы данных для демонстрации. Данная задача отнюдь не так тривиальна, как кажется. Вы можете использовать либо случайный принцип, либо циклический, однако лучше использовать принцип случайного выбора, при котором имеется система приоритетов. А если вы создаете профессиональную баннерную службу, следует предусмотреть такую ситуацию, когда покупаются показы баннера либо на определенных сайтах, либо определенным посетителям (во многих профессионально сделанных баннерных службах идут еще дальше, реализуя географический таргетинг).
  4. Регистрация показов баннеров и щелчков на них. К данному вопросу следует подойти очень серьезно, особенно в том случае, если вы работаете с платными баннерами, во избежание всяческих неправомерных "накруток". В случае платных баннеров помимо стандартных мер следует применять дополнительные меры для борьбы с "накручиванием" -- например, регулярные проходы по сайтам и автоматический их анализ на предмет нарушений (классическое нарушение -- размещение баннеров в скрытых автоматически обновляемых фреймах).
  5. Когда пользователь производит щелчок на баннере, необходимо произвести для него корректный редирект по соответствующему URL. Смотрите, не напутайте с этим делом, иначе, если пользователи, щелкая на баннерах, будут часто попадать не туда, куда хотели, от ваших баннерных услуг скоро все откажутся.
  6. Редирект позволяет запротоколировать щелчок на баннере. Ваша задача состоит в ведении таких протоколов и подсчете статистики по ним. Главной задачей подобного учета является фильтрация "левых" показов и щелчков. В случае профессиональной службы протоколы могут послужить основой для оплаты соответствующих показов и щелчков.
  7. Возможной следующей задачей является выдача накопленной статистической информации в удобном виде. Тут уж вы можете дать волю своей бурной фантазии (при профессиональном применении она будет иметь первоочередное значение).

Давайте решать данные задачи по порядку. Для начала наметим поля, необходимые для регистрации баннера. В простейшем случае это собственно имя файла с изображением баннера (добавление изображения баннера в баннерную службу можно решить с помощью метода, описанного в разделе "Загрузка документов" урока 4), соответствующий URL и какая-либо информация о владельце баннера (в нашем случае это будет e-mail владельца баннера, а вообще можно поместить в базу любую необходимую информацию). В большинстве баннерных служб баннеры индексируются в базе по номерам. Этого подхода будем придерживаться и мы.
Для хранения такой информации выделим директорию /banner_info, в каждом из файлов которой будет содержаться такая регистрационная информация. Названия файлов -- числа, являющиеся номерами зарегистрированных баннеров. Вполне подойдет формат следующего вида:

Имя файла изображения
Соответствующий URL
E-mail владельца

Затем нам потребуется информация о пользователях, размещающих у себя баннеры. Для них в простейшем случае подойдет запись, содержащая контактный E-mail и URL документа, на который помещается баннер. Индексируются они тоже по номерам, и под записи мы отведем директорию /banner_users. Итак, вот формат записи о месте размещения баннера:

E-mail
URL

и свалим в директорию /banner_gifs.
Теперь определим информацию, которую мы собираемся протоколировать. При показе мы фиксируем время показа, IP-адрес, с которого пользователь увидел баннер, а также сам номер показанного баннера. При щелчке регистрируемая информация будет такая же. Я предлагаю вести файлы следующей структуры:

Время IP-адрес Баннер

Разместим данные файлы соответственно в директориях /show_log и /click_log.

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

Задачу регистрации вы, надеюсь, сможете решить и без меня. Регистрация баннера сводится к регистрации URL и закачке самого баннера. А при регистрации страницы просто фиксируется URL страницы, на которую вешается баннер. Результатом такой регистрации будет выдача HTML-кода следующего содержания, который следует разместить на странице:

<A href="http://www.myserver.ru/banner/banner_click.cgi?номер">
<IMG src="http://www.myserver.ru/banner/banner_show.cgi?номер"
"Banner" width=100 height=100></A>

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

Следующей задачей в нашем списке значится выбор баннера для показа. Для начала рассмотрим самый простой вариант, когда баннер выбирается из базы по случайному принципу. Для получения списка файлов в директории применяем следующий код:

open(DIR, "имя_директории");
@FilesInDir=readdir(DIR);
closerdir(DIR);

Нам потребуется получить список файлов в директории /banner_info, при этом мы отфильтруем этот список, оставив только те имена файлов, которые представляют собой номера баннеров.

Скрипт, показывающий баннер, будет иметь следующий вид:

#!/usr/bin/perl
#banner_show.cgi
############
$basedir=".";
############
$LOCK_EX=2;
$LOCK_UN=8;
############
srand();
opendir(DIR, "$basedir/banner_info");
@Banners=readdir(DIR);
closedir(DIR);
@Banners=grep($_!~/\D/,@Banners);
$banner_num=$Banners[rand($#Banners)];
$acct_num=$ENV{'QUERY_STRING'};
$time=time();
#Регистрируем показ
open(F,">$basedir/show_log/$acct_num");
flock(F,$LOCK_EX);
print F "$time\t$ENV{'REMOTE_ADDR'}\t$banner_num\n";
flock(F,$LOCK_UN);
close(F);
print "Content-Type: image/gif\n\n";
open(REG,"$basedir/banner_info/$banner_num");
chop($giffile=);
close(REG);
open(GIF,"$basedir/banner_gifs/$giffile");
print ;
close(GIF);

Теперь, собственно, приступим к процедуре обработки щелчка на баннере. Существенным (в нашей упрощенной реализации) моментом можно считать то, что перед щелчком был показ. (Это может и не иметь значения, если у вас реализован временной принцип, гласящий, скажем, следующее: "с 23:00 до 23:05 на этой странице будет висеть баннер N, с 23:05 до 23:10 -- баннер M, и т. д.") При щелчке мы должны зарегистрировать это событие и произвести редирект:

#!/usr/bin/perl
#banner_click.cgi
############
$basedir=".";
############
$LOCK_EX=2;
$LOCK_UN=8;
############
$acct_num=$ENV{'QUERY_STRING'};
############
open(F,"$basedir/show_log/$acct_num");
while(){
s/[\r\n]//g;
($time,$host,$banner)=split(/\t/);
if($host eq $ENV{'REMOTE_ADDR'}){$click_banner=$banner;}
}
close(F);
open(LOG,"$basedir/click_log/$acct_num");
$time=time();
print LOG "$time\t$ENV{'REMOTE_ADDR'}\t$click_banner\n";
close(LOG);
open(REG,"$basedir/banner_info/$click_banner");
chop($giffile=);
chop($location=);
close(REG);
print "Location: $location\n\n";

В принципе, простейшая баннерная система реализована. Она, конечно, допускает разнообразные доработки. Так, можно модифицировать алгоритм показа. Скажем, алгоритм смены баннеров на аккаунте можно запускать отдельным процессом по crontab'у. Вы тогда сможете проанализировать, какие баннеры пользуются наибольшей популярностью (не по показам, а по щелчкам). При этом можно, например, с вероятностью 50% выбирать баннеры из числа наиболее популярных, а с оставшейся вероятностью 50% -- из всех остальных.

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

Домашняя страница автора: http://www.brima.aiq.ru/

 


Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com