Mam skrypt, który powinien być w stanie wykonać niektórepołączenia z usługą o różnych adresach IP. Mój kod działa, gdy nie ustawiam adresu IP na swoje połączenia, napisałem funkcję przypisywania adresu IP do obiektu przed wykonaniem połączenia, ale zwraca błąd:
Can"t locate object method "local_address" via package "LWP::UserAgent"
To jest moja struktura funkcji:
#!/usr/bin/perl -w
use LWP::UserAgent;
use HTTP::Headers;
use HTTP::Request::Common;
use HTTP::Cookies;
use URI::Escape;
use HTML::LinkExtor;
# set user agent object values
my $ua = new LWP::UserAgent;
$ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6");
push @{ $ua->requests_redirectable }, "POST";
$ua->cookie_jar({});
sub set_caller_ip {
my($set_ip_address) = @_;
$ua->local_address("$set_ip_address");
return 1;
}
sub test_caller_ip {
my $req = new HTTP::Request("GET", "http://whatismyip.org/");
$req->headers->push_header("Connection","Keep-Alive");
$req->headers->push_header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
my $res = $ua->request($req) or die "$!";
return $res->content();
}
I w taki sposób je nazywam:
set_caller_ip($caller_ip_address);
$caller_ip_tested = test_caller_ip();
print "$caller_ip_tested=".$caller_ip_tested."n";die;
Czy wiesz, o co chodzi ?!
Dzięki za pomoc z góry!
Odpowiedzi:
8 dla odpowiedzi № 1The local_address
atrybut został dodany w LWP :: UserAgent wersja 5.834. Czy możesz używać starszej wersji?
Próbować:
use LWP::UserAgent 5.834; # need local_address
(Ilekroć określam minimalną wersję dla modułu, próbuję dodać krótki komentarz wyjaśniający, dlaczego jest to minimalna wersja.)
1 dla odpowiedzi nr 2
@cjm już odpowiedział na pytanie dotyczące Twojego błędu, ale warto zauważyć alternatywę dla starszych wersji LWP :: UserAgent.
Istnieje nie- (lub przynajmniej nie) udokumentowana funkcja LWP :: Protocol :: http, która pozwala ci ustawić "dodatkowe opcje gniazda". Robię to w moim kodzie (używając 5.824) i działa:
@LWP::Protocol::http::EXTRA_SOCK_OPTS = { LocalAddr => "10.11.12.13" };
Ten sam kod w LWP / Protocol / http.pm wydaje się istnieć również w znacznie starszym LWP zainstalowanym z perl 5.8 na starym systemie RHEL4, więc minęło trochę czasu ... :-)