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