СтатьиПрограммирование

Клиент для LiveJournal.com на Perl
n0xi0uzz
14 февраля 2008 12:29



Теги: perl, livejournal, http

Дело было вечером, делать было нечего. И решил я изучить, как отсылаются запросы на 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-хеш. Остальное, думаю, и так понятно.

Примечание (добавлено 26/03/2007):
Если в вашей записи, либо же в её теме, содержится русский язык, то придется поменять этим двум параметрам (новой записи и её заголовку) кодировку на UTF-8, а в запрос (в выше указанном примере это переменная $post) добавить "&ver=1" (без ковычек, естественно).

Перекодировка осуществляется следующим образом:
use Encode;
Encode::from_to($subject, "cp1251", "utf8");
Encode::from_to($event, "cp1251", "utf8");

Ещё не лишним будет упомянуть тот факт, что запрос необходимо закодировать в безопасное представление. В PHP этим занимается функция urlencode(), в Perl же это делается так:

use URI::Escape;
$subject = uri_escape($subject);
$event = uri_escape($event);




Теги: perl, livejournal, http

Статьи с такими же тегами:

Гостевая книга на perl: последние штрихи.
Система авторизации по переменным окружения.
Обработка PDF на Perl.
Использование AJAX в Perl.
Выбирая шаблонизатор на Perl.
Написание web-приложений на языке Go
Веб-сервер lighttpd.