The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Каталог документации / Раздел "Perl" / Оглавление документа

Сокеты


Примеры

Подгружение файлов на несколько серверов через веб-страничку

Предположим Вы работаете менеджером по рекламе и вам необходимо подгружать один баннер в десяток другой баннерных систем. Чтобы не возится с каждым баннером, можно написать программу, автоматизирующую процесс подгрузки баннеров на несколько сайтов, защищенных паролем в хидден-поле(безопасность для данного примера работает при клиенте с аутентификацией через хидден-поля). Используя встроенную упаковку CGI.pm пакетов multipart/from можно напороться на то, что CGI.pm формируетй такой пакет, который может не разобрать программа, написанная, скажем на языке C. Т.е. CGI.pm формирует пакеты не совсем согласно rfc1867. Чтобы избежать этого неудобства, можно посылать картинки, используя Socket.pm. Т.е. нужно сформировать и отправить пакет в точности с rfc1867, который является стандартом для всех языков программирования. Ниже представлена программа, реализующая эту задачу:
#!/usr/bin/perl -w
if ((!defined $ARGV[0]) || ($ARGV[0] =~ /^-h/i)) {
        print << '__HELP_END__';
This script sends banners to www.kuku.ru. Usage:
./set_banner.pl <image_filename>
__HELP_END__
        exit(1);
}
my $filename = shift @ARGV;
my %accounts = (
        'vovka'         => ['123321', 13]
);
my ($login, $data);
while (($login,$data) = each %accounts) {
        my %params = (
                image_filename  => $filename,
                login           => $login,
                password        => $data->[0],
                profile         => $data->[1]
        );
        #print join ":",  %params;
        send_banner_to_kuku_ru(%params);
}
exit(0);
sub send_banner_to_kuku_ru(%)
{
        my %params = @_;
        open FILE, $params{image_filename} or die "Can't open imagefile: $!";
        binmode(FILE);
        my $image_data = <FILE>;
        close FILE;
        %params = (%params,  (
                host            => 'www.kuku.ru',
                script_uri      => 'account/addimage.html',
                url             => 'www.rrrr.ru',
                image_data      => $image_data,
                ratio           => '0',
                alt             => 'Новости на www.rrrr.ru'
        ));
        use IO::Socket;
        my $socket = IO::Socket::INET->new(
                PeerAddr => $params{host},
                PeerPort => 80,
                Proto    => 'tcp' 
        ) 
                or die "Can't connect: $!";
my $body = ''. << "__END_OF_BODY__";
-----------------------------7d02d3301bfa0846
Content-Disposition: form-data; name="user"

$params{login}

-----------------------------7d02d3301bfa0846
Content-Disposition: form-data; name="password"

$params{password}

-----------------------------7d02d3301bfa0846
Content-Disposition: form-data; name="image"; filename="$params{image_filename}"
Content-Type: image/gif
Content-Transfer-Encoding: binary

$params{image_data}
-----------------------------7d02d3301bfa0846
Content-Disposition: form-data; name="href"

$params{url}

-----------------------------7d02d3301bfa0846
Content-Disposition: form-data; name="profile"

$params{profile}

-----------------------------7d02d3301bfa0846
Content-Disposition: form-data; name="ratio"

$params{ratio}

-----------------------------7d02d3301bfa0846
Content-Disposition: form-data; name="alt"

$params{alt}

__END_OF_BODY__

$body .= '-----------------------------7d02d3301bfa0846--';
        my $content_length = length($body);
my $header = '' . << "__END_OF_HEADER__";
POST $params{script_uri} HTTP/1.1
Accept: */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
Content-Length: $content_length
Content-Type: multipart/form-data; boundary=---------------------------7d02d3301bfa0846
Host: $params{host}
__END_OF_HEADER__
        print $header . "\n" . $body;
        print $socket $header . "\n\n" . $body;
        while (<$socket>) {
                print;
        }
        close $socket;
}
1;
Скрипт написан Максимом Дуниным
ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!

Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

Оформить подписку на год


  Закладки на сайте
  Проследить за страницей
Created 1996-2012 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList