ArticlesProgramming

Post to LiveJournal with Perl
n0xi0uzz
12 october 2007 00:09



Tags: perl, livejournal, http

In this tutorial I'll show you how to post new entry to LiveJournal with perl.

It's quite simple: we should open a socket and create HTTP request to send it to a LiveJournal server. First of all, we'll get current date and time:
($sec, $Gmin, $Ghour, $mday, $Gmon, 
$Gyear, $wday, $yday, $isdst) = localtime;
$Gyear += 1900;
$Gmon += 1;

Then define all variables:
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";
$post.="&auth_response=&lineendings=pc";
$post.="&allowmask=&auth_challenge=&password=PASSWORD";
$post.="&year=$year&mon=$mon&day=$day&hour=$hour&min=$min";
$post.="&subject=$subject&event=$event";

Change USER and PASSWORD for your LiveJournal username and password. Variables $subject and $event must contain subject of an entry and entry text correspondingly. Read this for more information about arguments of such HTTP request.

Note that agrument password is plain-text, so, if you worry about security, use alternative argument hpassword to send yor password as an MD5 hex digest.

Also if text of your subject and entry not in UTF-8 codepage, you should encode it with something like this:
use Encode;
Encode::from_to($subject, "cp1251", "utf8");
Encode::from_to($event, "cp1251", "utf8");

and add to variable $post (wich contains HTTP request) argument &ver=1.

To post in community add to variable $post argument &usejournal=CMNT with the name of community you want to post instead CMNT.

And now we're ready to make the HTTP request to LiveJournal server. Take a look at the example:
if ($act eq "post")
{
  # open socket
  my $sock = IO::Socket::INET->new(
   PeerAddr => 'www.livejournal.com',
   PeerPort => '80',
   Proto => 'tcp'
  );

  # get the length of request
  $l = length($post);

  # print in socket request
  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
  );

  # get answer from server
  print <$sock>;
  close($sock);
}


That's all! To know more, read the Flat Client/Server Protocol Reference on livejournal.com.


Tags: perl, livejournal, http

Articles with same tags:

Authorisation system on environment variables.