Tor:" SIGNAL NEWNYM \ r \ n"导致fread的空响应

时间:2016-01-15 15:29:07

标签: php curl tor

有没有人请知道原因

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

3 个答案:

答案 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信号的后续fputsfread只会返回false

在检查身份验证响应时,此处存在逻辑错误:

if ($code = '250') {

要将$code250进行比较,您需要使用==

如果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);