TopList Яндекс цитирования
Русский переплет
Портал | Содержание | О нас | Авторам | Новости | Первая десятка | Дискуссионный клуб | Чат Научный форум
-->
Первая десятка "Русского переплета"
Темы дня:

Президенту Путину о создании Института Истории Русского Народа. |Нас посетило 40 млн. человек | Чем занимались русские 4000 лет назад?

| Кому давать гранты или сколько в России молодых ученых?
Rambler's Top100

Сокеты


Примеры

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

Предположим Вы работаете менеджером по рекламе и вам необходимо подгружать один баннер в десяток другой баннерных систем. Чтобы не возится с каждым баннером, можно написать программу, автоматизирующую процесс подгрузки баннеров на несколько сайтов, защищенных паролем в хидден-поле(безопасность для данного примера работает при клиенте с аутентификацией через хидден-поля). Используя встроенную упаковку 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;
Скрипт написан Максимом Дуниным

Rambler's Top100