file_get_contents 通过 tor
file_get_contents through tor
所以,我正在寻找使用 php 的页面标题。研究了 5 秒后,我在这里找到了答案:
function get_title($url){
$str = file_get_contents($url);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str));
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title);
return $title[1];
}
}
但我需要通过 Tor 代理,所以在这个网站上花费 5 秒的时间和你的智慧,我发现:
$aContext = array(
'http' => array(
'proxy' => 'proxy:port',
'request_fulluri' => true,
)
);
$cxContext = stream_context_create($aContext);
综合起来,我是这样做的:
$aContext = array(
'http' => array(
'proxy' => '127.0.0.1:9150',
'request_fulluri' => true,
)
);
$cxContext = stream_context_create($aContext);
function get_title($url){
global $cxContext;
$str = file_get_contents($url, False, $cxContext);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str));
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title);
return $title[1];
}
}
echo get_title('http://' . $theonionurl);
但是,这是行不通的。日志显示:
PHP Warning: file_get_contents(http://the_onion_address_to_check.onion): failed to open stream: Connection refused in /var/www/html/mychecker.php on line 44, referer: http://my_onion_address.onion/mychecker.php
我把端口改成9050了,还是不行
我做错了什么???
(显然,我检查过,要检查的 url 是有效的并且可以通过 tor 浏览器访问)
你的$aContext
在函数之外。
将它移到函数内部,它应该可以工作。
function get_title($url){
$aContext = array(
'http' => array(
'proxy' => '127.0.0.1:9150',
'request_fulluri' => true,
)
);
$cxContext = stream_context_create($aContext);
$str = file_get_contents($url, False, $cxContext);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str));
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title);
return $title[1];
}
}
echo get_title('http://' . $theonionurl);
不确定那个全局的东西。
我从来没有使用过它,我发现它使用局部变量更安全。
您的系统上是否安装并 运行正在使用 Tor?连接被拒绝表示该端口上没有任何内容正在侦听。
您首先需要安装 运行 Tor,然后才能使用它连接到站点。
此外,端口 9050 是一个 SOCKS
代理,而不是 HTTP 代理,因此您将无法将它与 HTTP 流代理上下文选项一起使用,因为这仅适用于 HTTP 代理。
相反,如果您想使用 Tor,您应该使用 curl 及其代理选项:
$ch = curl_init('http://example.onion/');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5_HOSTNAME,
CURLOPT_PROXY => '127.0.0.1:9050',
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_ENCODING => '',
CURLOPT_COOKIEFILE => '',
]);
$response = curl_exec($ch);
if ($response === false) {
echo sprintf(
"Request failed. Error (%d) - %s\n",
curl_errno($ch),
curl_error($ch)
);
exit;
}
if (preg_match('/<title>(.*)<\/title>', $response, $match)) {
echo "The title is '{$match[1]}'";
} else {
echo "Did not find title in page."
}
所以,我正在寻找使用 php 的页面标题。研究了 5 秒后,我在这里找到了答案:
function get_title($url){
$str = file_get_contents($url);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str));
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title);
return $title[1];
}
}
但我需要通过 Tor 代理,所以在这个网站上花费 5 秒的时间和你的智慧,我发现:
$aContext = array(
'http' => array(
'proxy' => 'proxy:port',
'request_fulluri' => true,
)
);
$cxContext = stream_context_create($aContext);
综合起来,我是这样做的:
$aContext = array(
'http' => array(
'proxy' => '127.0.0.1:9150',
'request_fulluri' => true,
)
);
$cxContext = stream_context_create($aContext);
function get_title($url){
global $cxContext;
$str = file_get_contents($url, False, $cxContext);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str));
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title);
return $title[1];
}
}
echo get_title('http://' . $theonionurl);
但是,这是行不通的。日志显示:
PHP Warning: file_get_contents(http://the_onion_address_to_check.onion): failed to open stream: Connection refused in /var/www/html/mychecker.php on line 44, referer: http://my_onion_address.onion/mychecker.php
我把端口改成9050了,还是不行
我做错了什么???
(显然,我检查过,要检查的 url 是有效的并且可以通过 tor 浏览器访问)
你的$aContext
在函数之外。
将它移到函数内部,它应该可以工作。
function get_title($url){
$aContext = array(
'http' => array(
'proxy' => '127.0.0.1:9150',
'request_fulluri' => true,
)
);
$cxContext = stream_context_create($aContext);
$str = file_get_contents($url, False, $cxContext);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str));
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title);
return $title[1];
}
}
echo get_title('http://' . $theonionurl);
不确定那个全局的东西。
我从来没有使用过它,我发现它使用局部变量更安全。
您的系统上是否安装并 运行正在使用 Tor?连接被拒绝表示该端口上没有任何内容正在侦听。
您首先需要安装 运行 Tor,然后才能使用它连接到站点。
此外,端口 9050 是一个 SOCKS
代理,而不是 HTTP 代理,因此您将无法将它与 HTTP 流代理上下文选项一起使用,因为这仅适用于 HTTP 代理。
相反,如果您想使用 Tor,您应该使用 curl 及其代理选项:
$ch = curl_init('http://example.onion/');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5_HOSTNAME,
CURLOPT_PROXY => '127.0.0.1:9050',
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_ENCODING => '',
CURLOPT_COOKIEFILE => '',
]);
$response = curl_exec($ch);
if ($response === false) {
echo sprintf(
"Request failed. Error (%d) - %s\n",
curl_errno($ch),
curl_error($ch)
);
exit;
}
if (preg_match('/<title>(.*)<\/title>', $response, $match)) {
echo "The title is '{$match[1]}'";
} else {
echo "Did not find title in page."
}