6

如果它是一个 https 站点,但如果它是一个 http 站点,我很难使用 perl 通过 TOR 访问一个网站。

#!/usr/bin/perl
use strict;

use WWW::Mechanize;
use LWP::Protocol::socks;
use LWP::Protocol::https;
use utf8;

my $mech = WWW::Mechanize->new(timeout => 60*5);
$mech->proxy(['http', 'https'], 'socks://localhost:9150');
$mech->get("https://www.google.com");

我收到错误消息:错误获取https://www.google.com:状态读取失败:第 10 行的文件描述符错误,“其中 i10 行是程序的最后一行。

在TOR浏览器中,我可以成功查看:“ https://www.google.com ”,端口为9150。我使用的是ActivePerl 5.16.2;瓦达利亚 0.2.21 和 Tor 0.2.3.25。我有一台 Windows 机器,我的主要互联网浏览器是 Mozilla。

我尝试使用以下命令安装软件包:

cpan LWP::UserAgent
ppm install LWP::Protocol::https
cpan LWP::Protocol::https
ppm install LWP::Protocol::socks
cpan LWP::Protocol::socks
ppm install Mozilla::CA
ppm install IO::Socket::SSL
ppm install Crypt::SSLeay
cpan Crypt::SSLeay

感谢您的任何帮助!请让我知道是否有任何进一步的信息可以提供。

4

3 回答 3

2

前段时间,我找到了通过 Tor 使用 WWW::Curl::Easy 来获取这些网站的方法,因为使用 LWP 我发现了同样的问题。之后,我将所有 html 保存在文件中并使用 WWW::Mechanzie 或 HTML::TreeBuilder 解析它们。

如果您想与网站进行更多交互,例如发布表单等。此解决方案可能会更加乏味,因为您需要与 curl 进行交互。

package Curl; use warnings; use WWW::Curl::Easy; use WWW::UserAgent::Random; my $curl = WWW::Curl::Easy->new; my $useragent = rand_ua("browsers"); my $host = 'localhost'; my $port = '9070'; my $timeout = '20'; my $connectTimeOut= '20'; &init; sub get { my $url = shift; $curl->setopt(CURLOPT_URL, $url); my $response_body; $curl->setopt(CURLOPT_WRITEDATA,\$response_body); my $retcode = $curl->perform; if ($retcode == 0) { print("Transfer went ok Http::Code = ".$curl->strerror($retcode)."\n"); my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); # judge result and next action based on $response_code return \$response_body; } else { # Error code, type of error, error message print("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n"); return 0; } } sub init { #setejem el proxy $curl->setopt(CURLOPT_PROXY,"$host:".$port); $curl->setopt(CURLOPT_PROXYTYPE,CURLPROXY_SOCKS4); #posem les altres dades $curl->setopt(CURLOPT_USERAGENT, $useragent); $curl->setopt(CURLOPT_CONNECTTIMEOUT, $connectTimeOut); $curl->setopt(CURLOPT_TIMEOUT, $timeout); $curl->setopt(CURLOPT_SSL_VERIFYPEER,0); $curl->setopt(CURLOPT_HEADER,0); }

希望对你有帮助!

于 2013-09-24T13:22:59.567 回答
1

也许您正在使用的代理已经是 HTTPS 代理(即 CONNECT 代理)。在这种情况下,这应该有效(未经测试):

#!/usr/bin/perl
use strict;

use WWW::Mechanize;
use LWP::Protocol::socks;
use LWP::Protocol::https;
use utf8;

my $mech = WWW::Mechanize->new(timeout => 60*5);
$mech->proxy(['http'], 'socks://localhost:9150');
$mech->proxy(['https'], 'https://localhost:9150'); ### <-- make https go over https-connect proxy

$mech->get("https://www.google.com");
于 2013-03-28T12:17:03.157 回答
1

我找不到起源,但我很久以前就与它抗争过。基本上我遇到的问题是 LWP::UserAgent 用于 https 请求的实施。

可能这个问题可以帮助你:我如何强制 LWP 使用 Crypt::SSLeay 进行 HTTPS 请求?

于 2013-09-24T11:43:27.520 回答