Tor Web Crawler - PullRequest
       64

Tor Web Crawler

10 голосов
/ 11 февраля 2012

Хорошо, вот что мне нужно. У меня есть веб-сканер на основе PHP. Это доступно здесь: http://rz7ocnxxu7ka6ncv.onion/ Теперь моя проблема заключается в том, что мой паук, который фактически сканирует страницы, должен делать это на SOCKS-порту 9050. Дело в том, что мне нужно туннелировать его соединение через Tor, чтобы он мог разрешать домены .onion, что я и индексирую , (Заканчивается только на .onion.) Я вызываю этот скрипт из командной строки, используя php crawl.php, и добавляю соответствующие параметры для сканирования страницы. Вот что я думаю: Есть ли способ заставить его использовать Tor? ИЛИ я могу заставить ВСЕЮ МАШИНУ туннелировать вещи через Tor и как? (Как форсирование всего трафика через 127.0.0.1:9050) возможно, если я настрою глобальные настройки прокси, php будет их уважать?

Если какое-либо из моих решений сработает, как бы я это сделал? (Пошаговые инструкции, пожалуйста, я нуб.)

Я просто хочу написать свою собственную поисковую систему Tor. (Не рекомендую мои p2p-поисковые системы - это не то, что я хочу для этого - я знаю, что они существуют, я сделал свою домашнюю работу.) Вот источник искателя, если вам интересно взглянуть на: Возможно, кто-то с добрым сердцем может изменить его, чтобы использовать 127.0.0.1:9050 для всех запросов сканирования? http://pastebin.com/kscGJCc5

Ответы [ 6 ]

10 голосов
/ 11 июля 2012

cURL также поддерживает соединения SOCKS;попробуйте это:

<?php

$ch = curl_init('http://google.com'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 

// SOCKS5
curl_setopt($ch, CURLOPT_PROXY, 'localhost:9050'); 
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

curl_exec($ch); 
curl_close($ch);
9 голосов
/ 11 февраля 2012

Если я что-то упустил, ответ - да, и вот некоторая документация на сайте Tor. Инструкции довольно специфичны. Хотя я не настроил Tor в качестве прокси-сервера, это то, что я рассмотрел, это место, с которого я бы начал.

EDIT: очень просто настроить Tor на Linux и использовать его в качестве прокси-сервера, как следует из документации.

sudo apt-get install tor
sudo /etc/init.d/tor start

netstat -ant | grep 9050 # verify Tor is running

Теперь после просмотра кода OP мы видим вызовы file_get_contents . Хотя самый простой метод для использования вначале file_get_contents становится громоздким, когда вы хотите начать параметризацию запроса, потому что вы должны использовать контексты потока .

Первое предложение состоит в том, чтобы перейти к curl , но опять же, больше чтения о том, как SOCKS работает с HTTP, вероятно, для того, чтобы действительно ответить на этот вопрос ... Но чтобы ответить на вопрос технически, как отправьте HTTP-запрос на прокси-сервер Tor SOCKS на localhost, опять же просто ...

<?php  
$ch = curl_init('http://google.com'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt($ch, CURLOPT_PROXY, 'https://127.0.01:9050/'); 
curl_exec($ch); 
curl_close($ch);

Но что нам говорит Тор?

HTTP / 1.0 501 Tor не является HTTP-прокси

Content-Type: text / html; кодировка = изо-8859-1

В основном, узнать больше о SOCKS & HTTP. Другой вариант - поискать клиентов PHP SOCKS. При быстрой проверке обнаруживается библиотека , которая утверждает, что может отправлять HTTP-запросы через SOCKS.

EDIT:

Хорошо, еще 1 редактировать! Через несколько секунд после завершения моего последнего поста я нашел способ сделать это. В этой статье показано, как настроить нечто, называемое Privoxy , которое преобразует запросы SOCKS в запросы HTTP. Поместите это перед Tor и blamo, мы отправляем прокси HTTP-запросы через Tor!

2 голосов
/ 25 января 2014

вы должны перехватить запрос поиска dns из скрипта php, настроив tor с помощью директивы dnsport.Затем вы должны настроить «транспорт» для tor и «адрес виртуальной сети».Теперь, когда ваш php-скрипт выполняет поиск через DNS, он видит запрос на луковый адрес и отвечает по IP-адресу из диапазона «virtualnetworkaddress».Теперь вам нужно перенаправить трафик, идущий на этот адрес, на адрес, определенный с помощью «транспорта».прочитайте руководство "torrc" по "automaphostonresolve", "virtualnetworkaddress", "dnsport" и "transport".

1 голос
/ 27 мая 2015

Я думаю, что это так же просто, как запустить запрос командной строки с параметром usewithtor или torify. Например:

$ usewithtor crawl.php

И скрипт сможет взаимодействовать с сайтами .onion. Собрав сам сканер для Tor, я бы точно не пошел по этому пути для производственного использования, вместо этого я использую python, PySocks и другие библиотеки сканеров вместо CURL. Надеюсь, это ответит на ваш вопрос и даст вам некоторые идеи для других стратегий реализации в будущем.

Спасибо

0 голосов
/ 16 июля 2017

Я искал, как сделать то же самое в php с Curl, я прочитал много тем и примеров, но это не работает! безуспешно я видел другой пост: Как я могу подключиться к скрытому сервису Tor, используя cURL в PHP? в Stackoverflow, кому это может быть интересно

Мне удалось найти хук, это работает для меня в PHP:

маленький пример с https://blockchainbdgpzk.onion/

exec('curl -k --socks5-hostname 127.0.0.1:9150 "https://blockchainbdgpzk.onion/tobtc?currency=EUR&value=5"', $a);

print_r( $a );

return  Array ( [0] => 0.0029577 ) 

Поскольку я работаю в среде Windows, я скопировал curl.exe и его сертификат в папку c: \ windows \ system32

или что-то вроде этого тоже работает, просто добавьте это 2 правила (-k)

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

источник: PHP CURL CURLOPT_SSL_VERIFYPEER игнорируется

$url = "https://blockchainbdgpzk.onion/tobtc?currency=EUR&value=5";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_PROXYTYPE, 7 );
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt ($ch, CURLOPT_PROXY, '127.0.0.1:9150' );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

ob_start();

curl_exec ($ch);
curl_close ($ch);

$result = ob_get_contents();
ob_end_clean();

var_dump($result);

возвращаемая строка '0,00296787' (длина = 10)

Это не идеально, но если это может кому-то помочь. Извините за моих дерьмовых английских друзей.

0 голосов
/ 30 июля 2013

Просто создайте собственный HTTP-прокси:

<?php

/**
* Proxy script that performs any HTTP request requested.
*/

// Check key
$key = 'YOUR_API_KEY';
if($_GET['key'] != $key) die; // Check for the API key

// Check URL
$url = isset($_GET['url']) ? trim(base64_decode($_GET['url'])) : '';
if(!$url || !filter_var($url, FILTER_VALIDATE_URL)) die; // Incorrect URL

class MyCurl {

    /**
    * CURL resource link
    * 
    * @var resource
    */
    protected $resource;

    /**
    * Constructor
    * 
    * @param String $host
    * @return MyCurl
    */
    public function __construct($url = 'localhost'){
        $this->resource = curl_init();
        $this->setUrl($url);
        $this->setOptions(array(
//          CURLOPT_RETURNTRANSFER => TRUE,
            CURLOPT_AUTOREFERER => TRUE,
            CURLOPT_FOLLOWLOCATION => TRUE,
            CURLOPT_REFERER => 'http://www.google.com/',
            CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)',
            CURLOPT_SSL_VERIFYHOST => FALSE,
            CURLOPT_SSL_VERIFYPEER => FALSE,
        ));
    }

    /**
    * Set URL for the next request
    * 
    * @param String $url
    */
    public function setUrl($url = 'localhost') {
        $this->setOption(CURLOPT_URL, $url);
    }

    /**
    * Sets option to the CURL resource.
    * See http://www.php.net/manual/en/function.curl-setopt.php for option description
    * 
    * @param int $name Option identifier
    * @param mixed $value Option value
    * @return Crawler_Curl Returns itself for sugar-code
    */
    public function & setOption($name, $value){
        curl_setopt($this->resource, $name, $value);
        return $this;
    }

    /**
    * Sets multiple CURL options at once
    * 
    * @param array $options Associative array of options
    * @return Crawler_Curl Returns itself for sugar-code
    */
    public function & setOptions($options){
        curl_setopt_array($this->resource, $options);
        return $this;
    }

    /**
    * Set User-Agent header of the browser
    * 
    * @param String $useragent Defaults to Mozilla browser
    */
    public function setUserAgent($useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0') {
        $this->setOption(CURLOPT_USERAGENT, $useragent);
    }

    /**
    * Get curl request info
    * 
    * @array
    */
    public function info() {
        return curl_getinfo($this->resource);
    }

    /**
    * Return sent headers if CURLINFO_HEADER_OUT option was enabled
    * 
    * @return String Headers
    */
    public function headersSent() {
        return curl_getinfo($this->resource, CURLINFO_HEADER_OUT);
    }

    /**
    * Executes CURL request
    *
    * @return mixed Returns CURL execution result
    */
    public function execute(){
        return curl_exec($this->resource);
    }

    /**
    * Cleans CURL connection
    */
    function __destruct(){
        curl_close($this->resource);
    }

}

$curl = new MyCurl($url);
$curl->execute();
...