file_get_contents to tor

时间:2018-06-15 18:25:59

标签: php linux file-get-contents 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 Proxy,所以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警告:file_get_contents(http://the_onion_address_to_check.onion):无法打开流:第44行的/var/www/html/mychecker.php拒绝连接,引用:http://my_onion_address.onion/mychecker.php

我将端口更改为9050,仍然无法正常工作。

我做错了什么???

(显然,我检查过,要检查的网址是有效的,可通过浏览器访问)

2 个答案:

答案 0 :(得分:1)

您的$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);

不确定那个全球性的东西 我从来没有使用过它,我觉得局部变量更安全。

答案 1 :(得分:1)

Tor是否在您的系统上安装并运行?连接被拒绝表示没有任何东西正在侦听该端口。

首先需要先安装并运行Tor,然后才能使用它连接到网站。

此外,端口9050是SOCKS代理,而不是HTTP代理,因此您无法将其与HTTP流代理上下文选项一起使用,因为这仅适用于HTTP代理。 / p>

相反,如果你想使用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."
}