有没有人请知道原因
fputs($fp, "SIGNAL NEWNYM\r\n");
$response = fread($fp, 1024);
返回一个空的$响应(在Windows上)?尝试所有事情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);
我的目标是为每个请求使用新的ip进行TOR
答案 0 :(得分:1)
你是对的! 有时需要8秒才能获得新的ip。 日志: 1月16日18:27:54.000 [通知]限速NEWNYM请求:延迟3秒 1月16日18:28:00.000 [通知]从127.0.0.1打开新的控制连接。 1月16日18:28:00.000 [通知]限速NEWNYM请求:延迟7秒
答案 1 :(得分:0)
我的猜测是身份验证失败且连接正在关闭,因此NEWNYM信号的后续fputs
和fread
只会返回false
。
在检查身份验证响应时,此处存在逻辑错误:
if ($code = '250') {
要将$code
与250
进行比较,您需要使用==
。
如果auth失败,则评估结果为真,诱使您认为在可能失败时进行了身份验证。
身份验证可能失败,因为密码不正确,或者仅支持cookie身份验证。
旁注,我创建了一个您可能感兴趣的PHP库TorUtils,它提供了与Tor control端口进行通信的类,还提供了cURL wrapper来确保cURL请求正确地通过Tor的SOCKS代理。
使用curl包装器和控制客户端,您的代码可以轻松地通过Tor包装curl请求并向控制端口发出命令以请求新的IP。
答案 2 :(得分:0)
谢谢drew010!你在哪里,我没有经过身份验证。我现在。
但是,使用下面的代码,每次运行此脚本时,它都会使用不同的ip获取http://www.watismijnip.nl。 但是每次获取页面后,它需要一个新的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);