package Rest; use Common; use LWP; use LWP::UserAgent; use URI::Escape; use WWW::Shorten; use XML::Simple; sub new { my ($class, $self) = @_; my $self ||= {}; bless $self, $class; } sub browser { my ($self) = @_; if (! exists($self->{'browser'}) ) { $self->{'browser'} = new LWP::UserAgent; $self->{'browser'}->agent("Mozilla/5.0 (compatible)"); } return $self->{'browser'}; } sub rest_post_raw { my ($self, $uri, $data) = @_; my $qs = $self->qs_encode($data); my $r = HTTP::Request->new(POST => $uri); $r->content_type('application/x-www-form-urlencoded'); $r->content($qs); my $re = $self->browser->request($r); my $content = $re->content(); return $content; } sub rest_post { my ($self, $uri, $data) = @_; my $qs = $self->qs_encode($data); return undef unless $qs && $self->do_auth; my $r = HTTP::Request->new(POST => $uri); if ($self->do_auth) { $r->authorization_basic($self->auth); } $r->content_type('application/x-www-form-urlencoded'); $r->content($qs); my $re = $self->browser->request($r); my $xml = $re->content(); my $ref = XMLin($xml); return $ref; } sub proxy_uri { my ($self, $uri) = @_; my $random_proxy = $self->proxy_random; my $proxy_uri = "http://" . $random_proxy . "/browse.php?u=" . uri_escape($uri); return $proxy_uri; } sub proxy_load { my ($self) = @_; my $proxies = $self->read_data("../tmp/proxies.txt"); my @lines = split "\n", $proxies; my $real = []; map { push @$real, $_ if $_ } @lines; return $real; } sub rest_get_proxy { my ($self, $uri, $data) = @_; my $proxy_uri = $self->proxy_uri($uri); return $self->rest_get_raw($proxy_uri, $data, \&_rest_get_raw_callback); } sub rest_get_raw { my ($self, $uri, $data) = @_; return $self->rest_get($uri, $data, \&_rest_get_raw_callback); } sub rest_get_xml { my ($self, $uri, $data) = @_; return $self->rest_get($uri, $data, \&_rest_get_xml_callback); } sub _rest_get_raw_callback { my ($self, $data) = @_; return $data; } sub _rest_get_xml_callback { my ($self, $data) = @_; return XMLin($data); } sub rest_get { my ($self, $uri, $data, $callback) = @_; $callback ||= \&_rest_get_xml_callback; my $qs = $self->qs_encode($data); if ($qs) { $uri = $uri . "?" . $qs; } my $r = HTTP::Request->new(GET => $uri); if ($self->do_auth) { $r->authorization_basic($self->auth); } print "getting $uri\n"; my $re = $self->browser->request($r); my $data = $re->content(); my $ref = $self->$callback($data); return $ref; } sub qs_encode { my ($self, $data) = @_; my $qs = []; foreach my $key (keys %$data) { my $val = uri_escape($data->{$key}); next unless $val; push @$qs, "$key=$val"; } return undef unless scalar(@$qs); my $encoded = join "&", @$qs; return $encoded; } sub auth { my ($self, $user, $pass) = @_; if ($user && $pass) { $self->{'user'} = $user; $self->{'pass'} = $pass; } else { $user = $self->{'user'}; $pass = $self->{'pass'}; } return ($user, $pass); } sub do_auth { my ($self) = @_; if ($self->{'user'} && $self->{'pass'}) { return 1; } return undef; } sub user { my ($self) = @_; if ($self->do_auth) { return $self->{'user'}; } return undef; } sub read_xml { my ($self, $file) = @_; my $data = $self->read_data($file); return XMLin($data); } sub write_xml { my ($self, $file, $data) = @_; my $xml = XMLout($data); $self->write_data($file, $xml); } sub read_data { my ($self, $file) = @_; return undef unless -e $file; open IN, $file or die $!; my @lines = ; close IN; my $out = join "", @lines; print "Read " . length($out) . " bytes\n"; return $out; } sub write_data { my ($self, $file, $data) = @_; open OUT, ">$file" or die $!; print OUT $data; close OUT; print "Wrote " . length($data) . " bytes\n"; } 1;