Torify 连接并以编程方式更改出口节点

Torify connection and change exit node programmatically

我正在编写一个 PHP 脚本,它基本上循环遍历我存储在数据库中的一些数据。该项目的两个主要重要字段是 'url' 和 'country'.

基本上我想做的是遍历所有这些 URL 并确定哪些链接断开(使用一些 PHP 解析器,但了解这个问题并不重要).但是,我遇到的问题是您无法访问分配给某个国家/地区的 URL,除非您拥有来自该国家/地区的 IP 地址。我已经为 U.S URL 设置了这个脚本,因为我在这里,所以这很简单。

我想知道我是否以及如何(向我指出资源、提示、解决方案)我可以使用 Tor 以编程方式检查这个 2 个字母的国家/地区代码并使用该 IP 转到 URL。我猜这与使用那个国家的出口节点有关,但我不太确定。

使用 ExitNodes 配置选项,可以使用语法 {US} 指定来自特定国家/地区的出口节点,其中 US 是国家/地区代码。

使用 PHP TorUtils 库可以简单地实现自动化。

这是一个代码示例:

<?php

require 'TorUtils/src/ControlClient.php';
require 'TorUtils/src/TorCurlWrapper.php';

// list of country codes to use
$countries = array('US', 'FR', 'RU', 'GB', 'CA');

// get new control client for connecting to Tor's control port
$tc = new Dapphp\TorUtils\ControlClient();

$tc->connect(); // connect
$tc->authenticate('password'); // authenticate

foreach($countries as $country) {
    $country = '{' . $country . '}'; // e.g. {US}

    $tc->setConf(array('ExitNodes' => $country)); // set config to use exit node from country

    // get new curl wrapped through Tor SOCKS5 proxy
    $curl = new Dapphp\TorUtils\TorCurlWrapper();
    $curl->setopt(CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox 41.0');

    // make request - should go through exit node from specified country
    if ($curl->httpGet('http://whatismycountry.com')) {
        echo $curl->getResponseBody();
    }
}

TorCurlWrapper 是一个简单的 cURL 包装器,它通过 Tor SOCKS5 代理路由 cURL。 ControlClient用于在每次请求从某个国家切换到ExitNodes之前设置配置选项。

您可以使用 composer 安装 TorUtils:

php composer.phar require dapphp/torutils

然后在您的代码中使用 require 'vendor/autoload.php'; 自动加载 TorUtils 类。