Кто-нибудь знает, пожалуйста, почему
fputs($fp, "SIGNAL NEWNYM\r\n");
$response = fread($fp, 1024);
вернуть пустой ответ $ (на окнах)? я не могу заставить его работать после 5 часов, пытаясь все
я использую код в:
$fp = fsockopen('localhost', 9051, $errno, $errstr, 30);
$auth_code = 'a-password';
if ($fp) {
echo "Connected to TOR port<br />";
}
else {
echo "Cant connect to TOR port<br />";
}
fputs($fp, "AUTHENTICATE \"".$auth_code."\"\r\n");
$response = fread($fp, 1024);
list($code, $text) = explode(' ', $response, 2);
if ($code = '250') {
echo "Authenticated 250 OK<br />";
}
else {
echo "Authentication failed<br />";
}
fputs($fp, "SIGNAL NEWNYM\r\n");
$response = fread($fp, 1024);
моя цель состоит в том, чтобы TOR использовал новый ip для каждого запроса
Вы правы!
иногда требуется около 8 секунд, чтобы открыть новый ip.
журналы:
16 января 18: 27: 54.000 [извещение] Ограничение скорости Запрос NEWNYM: задержка на 3 секунды
16 января 18: 28: 00.000 [уведомление] Новое управляющее соединение открыто с 127.0.0.1.
16 января 18: 28: 00.000 [уведомление] Ограничение скорости Запрос NEWNYM: задержка на 7 секунд
Я предполагаю, что аутентификация не проходит и соединение закрывается, поэтому последующее fputs
а также fread
для сигнала NEWNYM только возвращаются false
,
При проверке ответа проверки подлинности здесь есть логическая ошибка:
if ($code = '250') {
Сравнивать $code
в 250
нужно использовать ==
,
Если аутентификация не удалась, это означает, что вы обманули себя, заставив думать, что вы проходили проверку подлинности, когда она могла потерпеть неудачу.
Аутентификация может быть неудачной, потому что пароль просто неверный или поддерживается только аутентификация с использованием cookie.
Примечание: я создал библиотеку PHP, которая может вас заинтересовать, называется TorUtils который предоставляет классы для общения с Tor контроль порт, а также обертка cURL для обеспечения правильности запросов cURL, пройдите через SOCKS прокси Tor.
Используя упаковщик curl и управляющий клиент, ваш код может легко обернуть запросы curl через Tor и выдавать команды на порт управления для запроса нового IP.
Спасибо drew010! Вы, где прав, я не был аутентифицирован. Сейчас я.
Однако, с кодом ниже, каждый раз, когда я запускаю этот скрипт, он выбирает http://www.watismijnip.nl с другим ip.
Но нам нужен новый ip, после каждой загрузки страницы. Сейчас это не так.
Я понимаю, что требуется новый идентификатор с портом 9051, в то время как curl использует порт 9050. Но если я позволю curl использовать порт 9051, он выдаст и пустую строку обратно.
Можно ли это сделать?
function tor_new_identity($tor_ip='127.0.0.1', $control_port='9051', $auth_code=''){
$fp = fsockopen($tor_ip, $control_port, $errno, $errstr, 30);
if (!$fp) return false; //can't connect to the control port
fputs($fp, "AUTHENTICATE $auth_code\r\n");
$response = fread($fp, 1024);
echo 'debug: $response='.$response."\n<br>";
list($code, $text) = explode(' ', $response, 2);
if ($code != '250') return false; //authentication failed
//send the request to for new identity
fputs($fp, "signal NEWNYM\r\n");
$response = fread($fp, 1024);
list($code, $text) = explode(' ', $response, 2);
if ($code != '250') return false; //signal failed
fclose($fp);
return true;
}if (tor_new_identity('127.0.0.1', '9051', '"my_password"')) {
echo "Identity switched!";
}else{
echo "Identity NOT switched!";
}
$url='http://www.watismijnip.nl/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9050");
curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);
print_r($output);
print_r($curl_error);if (tor_new_identity('127.0.0.1', '9051', '"my_password"')) {
echo "Identity switched!";
}else{
echo "Identity NOT switched!";
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9050");
curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);
print_r($output);
print_r($curl_error);