Клиент для LiveJournal.com на Perl
Дело было вечером, делать было нечего. И решил я изучить, как отсылаются запросы на livejournal.com для добавления новой записи (потом, может, где-нибудь пригодится). Но, поскольку, информации на эту тему нигде не нашёл, пришлось копаться самому в документации к протоколу.
Итак, из написанного там следовало, что для добавления новой записи нужно всего лишь открыть сокет и послать туда HTTP-запрос. Параметры, которые необходимо было передать, перечислены здесь. Что ж, дело остаётся за малым, - сделать HTML-форму и написать Perl-скрипт, который и будет эти самые параметры передавать серверу.
Для начала, чтобы вручную не вводить год/месяц/день/время записи, стоит написать следующий код, чтобы скрипт автоматически получал эти параметры:
# 0 1 2 3 4 5 6 7 8 ($sec, $Gmin, $Ghour, $mday, $Gmon, $Gyear, $wday, $yday, $isdst) = localtime; $Gyear += 1900; $Gmon+=1;
Затем, подключаем все необходимые модули и объявляем переменные:
use IO::Socket qw(:DEFAULT :crlf); use CGI; $c = new CGI; $year = $c->param("year"); $mon = $c->param("mon"); $day = $c->param("day"); $subject = $c->param("subject"); $hour = $c->param("hour"); $min = $c->param("min"); $event = $c->param("event"); $act = $c->param("act"); $post="mode=postevent&user=USER&auth_method=clear&auth_response="; $post.="&allowmask=&auth_challenge=&password=PASSWORD&lineendings=pc $post.="&year=$year&mon=$mon&day=$day&hour=$hour&min=$min&event=$event";
Теперь можно переходить непосредственно к передачи запроса серверу, так как HTML-форму с полями темы сообщения и самим сообщением, я думаю, вы сами сверстаете. Я не буду описывать все передаваемые параметры, о них вы можете узнать тут, покажу лишь код:
if ($act eq "post") { #открываем сокет my $sock = IO::Socket::INET->new( PeerAddr => 'www.livejournal.com', PeerPort => '80', Proto => 'tcp' ); #узнаем длину запроса для Content-length: $l = length($post); #отправляем запрос: print $sock join("\r\n" => "POST /interface/flat HTTP/1.0", "Host: www.livejournal.com", "Content-type: application/x-www-form-urlencoded", "Content-length: $l", "", $post ); print <$sock>; #выводит ответ сервера close($sock); }
Здесь пароль передается с помощью параметра password обычным текстом, но если вы заботитесь о безопасности, то вам следует использовать альтернативный параметр hpassword, в котором следует указывать MD5-хеш. Остальное, думаю, и так понятно.
Ссылки по теме
- Отправка POST запроса из perl-сценария;
- Модуль CGI.pm;
- Perl и работа с сокетами;
- RFC2068 - Протокол передачи гипертекста - HTTP/1.1.