#!/usr/bin/perl package Livelink;
use LWP::UserAgent;
use MIME::Base64 qw(encode_base64);
use HTTP::Cookies;
my $Basic_Url = "https://wcdma-ll.app.alcatel-lucent.com/livelink/livelink.exe";
sub new
{
my $invocant = shift;
my $class = ref $invocant || $invocant;
my $self = {
login => shift,
password => shift
};
bless $self, $class;
$self->init();
return $self;
}
sub init
{
my $self = shift;
$self->{browser} = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0});
#设置http代理
$self->{browser}->proxy('http', 'http://135.251.33.31:80');
#将用户名密码进行base64编码
die "Error: Login NONE.\n" if (! $self->{login});
die "Error: Password NONE.\n" if (! $self->{password});
$self->{encode_login} = encode_base64($self->{login} . ":" . $self->{password});
#模拟浏览器的header,我访问的网页比较特殊,请求头中带有Authorization字段来进行鉴权。
#也可以通过credentials方法来登录
my @headers = ('User-Agent' => 'Mozilla/5.0',
Authorization => "Basic $self->{encode_login}",
);
#这里是LWP::UserAgent对象调用default_header函数,它具有全局性
#即后面对网页请求时,都会带有@headers的信息
#在后面的HTTP::Reques对象也有个header函数,使用方法跟default_header一样
#但是它的header信息只在当前的请求中生效。
$self->{browser}->default_header(@headers);
$self->{cookie_jar} = HTTP::Cookies->new;
#设置cookie,正如前面所描述的,LWP::UserAgent对象调用的方法,在后面每次网页请求中都生效
$self->{browser}->cookie_jar( $self->{cookie_jar} );
#根据上面讲到的那段JAVASCRIPT,来构造post消息中的content字段。
my $content = {
# NextURL=>'/livelink/livelink.exe?Redirect=1',
func=>'ll.login',
};
#这里用$self->{browser}->post比较简单
#如果用$req = HTTP::Request->new(POST => $Basic_Url)来POST的话
#在构造$req->content之前,还需指明$req->content_type
#my $resp = $self->{browser}->post( $Basic_Url, Content => $content );
my $req = HTTP::Request->new(POST => $Basic_Url);
$req->content_type('application/x-www-form-urlencoded');
$req->content('func=ll.login');
my $resp = $self->{browser}->request($req);
if ($resp->is_success)
{
print "Login Success.\n";
}
else
{
print "Login Error.\n" . $resp->status_line . "\n";
exit 1;
}
}
sub get_web_content{
my $self = shift;
my ($url) = @_;
print "\tNow, processing $url\n";
my $get_cookie = 1;
while ($get_cookie)
{
#调用HTTP::Request对象,对网页进行GET请求
#效果和$self->{browser}->get($url)一样,这里是为了后面打印$request->headers_as_string
my $request = HTTP::Request->new('GET', $url);
#default_header设置好后,这里就不需要重复调用了
#$request->header(Authorization => "Basic $self->{encode_login}");
my $response = $self->{browser}->request($request);
$self->{cookie_jar}->extract_cookies($response);
print "=== Cookies:\n", $self->{cookie_jar}->as_string, "\n";
if ($response->is_success)
{
#打印响应码,请求头,响应头和响应内容
print "Login Success.\n** " . $response->status_line . " **\n";
print "=== Request header: \n", $request->headers_as_string, "\n";
print "=== Response header: \n", $response->headers_as_string, "\n";
return $response->content;
#访问成功后,即200 OK,就能获取到cookie值 $get_cookie = 0;
}
else
{
print "Login Error.\n** " . $response->status_line . " **\n";
print $response->content . "\n";
#如果发生网页重定向,将重组URL后继续访问
if ($response->status_line =~ /302/)
{
my ($redirect_url) = ($response->content =~ m/new_abs来将$response->base链接起来
$url = URI->new_abs($redirect_url, $response->base);
next;
}
}
exit 1;
}
}
}
sub get_file
{
my $self = shift;
my $object_id = shift;
unless($object_id)
{
die "$object_id is invalid> }
my $ll_url = "$Basic_Url/open/$object_id";
return $self->get_web_content($ll_url);
}
package main;
my $ll = new Livelink('username', 'password');
my $content = $ll->get_file('50967038');
open my $fh, '>', "myfile.html" or die "Can't open file, $!\n";
print $fh $content;
close $fh;