Как я могу подключиться к скрытой службе Tor, используя cURL в PHP?

Я пытаюсь подключиться к скрытой службе Tor, используя следующий код PHP:

$url = 'http://jhiwjjlqpyawmpjx.onion/' $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:9050/"); curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); $output = curl_exec($ch); $curl_error = curl_error($ch); curl_close($ch); print_r($output); print_r($curl_error); 

Когда я запускаю его, я получаю следующую ошибку:

Не удалось разрешить имя хоста

Однако, когда я запускаю следующую команду из моей командной строки в Ubuntu:

 curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion 

Я получаю ответ, как ожидалось

Документация PHP cURL гласит следующее:

 --socks5-hostname Use the specified SOCKS5 proxy (and let the proxy resolve the host name). 

Я считаю, что причина, по которой он работает из командной строки, заключается в том, что Tor (прокси) разрешает имя .onion hostname, которое он распознает. При запуске PHP-кода выше, я предполагаю, что cURL или PHP пытается разрешить имя .onion hostname и не распознает его. Я искал способ сообщить cURL / PHP, чтобы прокси-сервер разрешил имя хоста, но я не могу найти способ.

Существует очень похожий вопрос переполнения стека, запрос cURL с использованием прокси-сервера socks5 не работает при использовании PHP, но он работает через командную строку .

    Похож, что CURLPROXY_SOCKS5_HOSTNAME не определен в PHP, но вы можете явно использовать его значение, равное 7:

     curl_setopt($ch, CURLOPT_PROXYTYPE, 7); 

    Я использую Privoxy и cURL для очистки страниц Tor:

     <?php $ch = curl_init('http://jhiwjjlqpyawmpjx.onion'); // Tormail URL curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); curl_setopt($ch, CURLOPT_PROXY, "localhost:8118"); // Default privoxy port curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_exec($ch); curl_close($ch); ?> 

    После установки Privoxy вам нужно добавить эту строку в файл конфигурации ( /etc/privoxy/config ). Обратите внимание на пробел и '.' a конец строки.

     forward-socks4a / localhost:9050 . 

    Затем перезапустите Privoxy.

     /etc/init.d/privoxy restart 

    Попытайтесь добавить это:

     curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);