设为首页 收藏本站
查看: 856|回复: 0

[经验分享] 【perl】使用LWP获取带cookie验证的HTTPS网页

[复制链接]

尚未签到

发表于 2018-8-31 10:38:10 | 显示全部楼层 |阅读模式
#!/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;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559278-1-1.html 上篇帖子: LWP(Library for WWW in Perl)的基本使用 下篇帖子: perl两个神奇的数组@-和@+
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表