Como posso me conectar a um serviço Tor escondido usando cURL em PHP?

Estou tentando me conectar a um serviço Tor escondido usando o seguinte código 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); 

Quando eu executá-lo, recebo o seguinte erro:

Não foi possível resolver o nome do host

No entanto, quando eu executar o seguinte comando da minha linha de comando no Ubuntu:

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

Recebo uma resposta conforme o esperado

As documentações PHP CURL dizem isso:

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

Eu acredito que o motivo por que funciona a partir da linha de comando é porque Tor (o proxy) está resolvendo o nome de host .onion, que ele reconhece. Ao executar o código PHP acima, meu palpite é que o CURL ou PHP está tentando resolver o nome do host .onion e não o reconhece. Procurei uma maneira de dizer ao CURL / PHP que o proxy resolva o nome do host, mas não consigo encontrar um caminho.

Há uma questão de transbordamento de Pilha muito semelhante, a solicitação de CURL usando socks5 proxy falha ao usar PHP, mas funciona através da linha de comando .

    Parece que CURLPROXY_SOCKS5_HOSTNAME não está definido em PHP, mas você pode usar explicitamente seu valor, que é igual a 7:

     curl_setopt($ch, CURLOPT_PROXYTYPE, 7); 

    Eu uso Privoxy e CURL para raspar páginas 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); ?> 

    Depois de instalar o Privoxy, você precisa adicionar esta linha ao arquivo de configuração ( /etc/privoxy/config ). Observe o espaço e ‘.’ um fim de linha.

     forward-socks4a / localhost:9050 . 

    Em seguida, reinicie o Privoxy.

     /etc/init.d/privoxy restart 

    Tente adicionar isso:

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