Tor Web Crawler
Хорошо, вот что мне нужно.
У меня есть веб-искатель на основе PHP.
Он доступен здесь:
http://rz7ocnxxu7ka6ncv.onion/
Теперь моя проблема в том, что мой паук, который на самом деле сканирует страницы, должен делать это на порту SOCKS 9050. Дело в том, что мне нужно туннелировать его соединение через Tor, чтобы оно могло разрешать .onion-домены, что я и индексирую, (Только заканчивается на .onion.)
Я вызываю это script из командной строки, используя php crawl.php, и добавляю соответствующие параметры для обхода страницы.
Вот что я думаю:
Есть ли способ заставить его использовать Tor?
ИЛИ могу ли я заставить свою ENTIRE MACHINE туннелировать вещи через Tor и как?
(Как заставить весь трафик через 127.0.0.1:9050)
возможно, если я настрою глобальные настройки прокси-сервера, php будет их уважать?
Если какое-либо из моих решений работает, как мне это сделать? (Пошаговые инструкции, пожалуйста, я noob.)
Я просто хочу создать свою собственную поисковую систему Tor. (Не рекомендуйте мои поисковые системы p2p - это не то, что я хочу для этого - я знаю, что они существуют, я сделал домашнее задание.)
Вот источник искателя, если вам интересно взглянуть на:
Возможно, кто-то с добрым сердцем может изменить его, чтобы использовать 127.0.0.1:9050 для всех запросов на сканирование?
http://pastebin.com/kscGJCc5
Ответы
Ответ 1
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);
Ответ 2
Если мне не хватает чего-то, да, да, и вот некоторая документация на сайте Tor. Инструкции довольно конкретны. Хотя я не задал Tor в качестве прокси-сервера, это то, что я рассмотрел, это место, которое я бы начал.
EDIT:
мертвый простой, чтобы установить Tor в Linux и использовать его в качестве прокси-сервера, как предполагает документация.
sudo apt-get install tor
sudo /etc/init.d/tor start
netstat -ant | grep 9050 # verify Tor is running
Теперь, просматривая код OPs, мы вызываем вызовы file_get_contents. Хотя самый простой способ использовать сначала file_get_contents становится громоздким, когда вы хотите начать параметризацию запроса, потому что вам нужно использовать контексты потока.
Первое предложение - перейти на curl, но опять же, больше читайте о том, как SOCKS работает с HTTP/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. Другим вариантом является Google для клиентов PHP SOCKS. Быстрый осмотр показывает библиотеку, которая утверждает, что может отправлять HTTP-запросы через SOCKS.
EDIT:
Хорошо, еще одно редактирование! Через несколько секунд после окончания моего последнего сообщения я нашел способ сделать это. Эта статья показывает нам, как настроить что-то, называемое Privoxy, который переводит запросы SOCKS в HTTP-запросы. Положите это перед Tor и blamo, мы отправляем проксированные HTTP-запросы через Tor!
Ответ 3
вам нужно перехватить запрос поиска dns из php script, настроив tor с помощью директивы dnsport. то вам нужно настроить "транспорт" для tor и "virtualnetworkaddress" . теперь, когда ваш PHP скрипт выполняет dns-lookup thru tor, это то, что tor видит запрос на луковый адрес и отвечает с IP-адресом из диапазона "virtualnetworkaddress" . вам теперь нужно перенаправить трафик, идущий по этому адресу, на адрес, определенный с помощью "транспорта". прочитайте руководство "torrc" на "automaphostonresolve", "virtualnetworkaddress" , "dnsport" и "transport".
Ответ 4
Я думаю, что это так же просто, как запустить запрос командной строки с помощью параметра usewithtor
или torify
. Например:
$ usewithtor crawl.php
И script сможет взаимодействовать с сайтами .onion. Создав искатель для самого Тора, я определенно не пошел бы по этому пути для использования в производстве, вместо этого вместо CURL я бы использовал python, PySocks и другие библиотеки искателей. Надеюсь, это ответит на ваш вопрос и даст вам некоторые идеи для продвижения других стратегий реализации.
Спасибо
Ответ 5
Я искал, как сделать то же самое в 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 )
Как я нахожусь на environement 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);
return string '0.00296787' (length = 10)
Это не идеально, но если это может помочь кому-то. Извините за моих английских друзей.
Ответ 6
Просто создайте собственный 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();