file_get_contents через тор

Итак, я искал, как найти заголовок страницы, используя 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): не удалось открыть поток: Отказано в соединении в /var/www /html/mychecker.php в строке 44, реферер: http://my_onion_address.onion/mychecker.php

Я изменил порт на 9050, все равно не работает.

Что я делаю не так ???

(очевидно, я проверил, URL-адреса для проверки действительны и доступны через браузер tor)


person Guy Dresher    schedule 15.06.2018    source источник


Ответы (2)


Tor установлен и работает в вашей системе? Отказ в подключении означает, что на этом порту ничего не прослушивается.

Сначала вам нужно установить и запустить Tor, прежде чем вы сможете использовать его для подключения к сайтам.

Кроме того, порт 9050 является прокси-сервером SOCKS, а не прокси-сервером HTTP, поэтому вы не сможете использовать его с параметром контекста прокси-потока HTTP, поскольку он работает только с прокси-серверами HTTP.

Вместо этого вам следует использовать curl вместе с параметрами прокси, если вы хотите использовать Tor:

$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."
}
person drew010    schedule 17.06.2018
comment
Благодарю вас! керлинг работает! [пришлось сначала установить] - person Guy Dresher; 17.06.2018
comment
@Borna Порт по умолчанию по-прежнему 9050. 9150 используется Tor Browser Bundle. - person drew010; 27.09.2018

Ваш $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);

Не уверен насчет этой глобальной вещи.
Я никогда не использовал ее, и мне кажется, что с локальными переменными безопаснее.

person Andreas    schedule 15.06.2018
comment
Неа! Предупреждение PHP: file_get_contents(the_onion_address_to_check.onion): не удалось открыть поток: Отказано в соединении в /var/www/html/mychecker .php в строке 109, реферер: my_onion_address.onion/mychecker.php по-прежнему. - person Guy Dresher; 16.06.2018