package SecondLife::SimpleLogin; use strict; use warnings; use XMLRPC::Lite; use Digest::MD5 'md5_hex'; use XML::Simple; our $VERSION = 0.01; our $LOGIN_URI = 'https://login.agni.lindenlab.com/cgi-bin/login.cgi'; sub new { bless {}, shift } sub login { my ($self, $first, $last, $passwd, $mac ) = @_; my $passwd_md5 = '$1$' . md5_hex($passwd); my %login_details = ( 'first' => $first, 'last' => $last, 'passwd' => $passwd_md5, 'start' => 'last', 'major' => '1', 'minor' => '18', 'patch' => '2', 'build' => '15', 'platform' => 'Win', 'mac' => $mac, 'options' => [], 'user-agent' => "$0/$VERSION", 'id0' => '', 'agree_to_tos' => '', 'viewer_digest' => '09d93740-8f37-c418-fbf2-2a78c7b0d1ea' ); my $res = $self->do_login(\%login_details); if ($res->{login} eq 'false' && $res->{message} =~ /^Required version: (\d+).(\d+)\.(\d+)\.(\d+)\.$/) { @login_details{qw/major minor patch build/} = ($1, $2, $3, $4); $res = $self->do_login(\%login_details); $self->{login_resposnse} = $res; return $res; } else { $self->{login_resposnse} = $res; return $res; } } sub do_login { my ($self, $login_details) = @_; return XMLRPC::Lite->proxy($LOGIN_URI) ->call( 'login_to_simulator', $login_details )->result; } sub get_capabilities { my ($self, ) = @_; my $url = $self->{login_resposnse}->{seed_capability}; my $xml = <<'...'; MapLayer MapLayerGod NewAgentInventory EventQueueGet ... my $req = HTTP::Request->new(POST => $url); $req->content($xml); my $ua = $self->_ua; my $res = $ua->request($req); if ($res->is_success) { return XMLin($res->content); } else { die $res->status_line; } } sub _ua { LWP::UserAgent->new(agent => join '/', __PACKAGE__, $VERSION); } 1; package main; use strict; use warnings; use Data::Dumper; use XML::Simple; my $sl = SecondLife::SimpleLogin->new; warn Dumper($sl->login(@ARGV)); warn Dumper($sl->get_capabilities()); =head1 DESCRIPTION simple sample script for secondlife login XMLRPC. =head1 SEE ALSO L =head1 AUTHOR tokuhiro matsuno.