Качаем файлы из тор сети на PHP

05.05.2015

Также этот подход подойдет и для скачивания обычный файлов (или страниц) из обычного интернета.

Нам понадобится сервер с установленным TOR и php с curl.

Для начала, предположим, что сервер с php у нас есть и он на Centos.

  1. Устанавливаем TOR:

    yum -y install tor

  2. Запускаем:

    service tor start

  3. Вот пример простого скрипта, позволяющего скачать файл использую ТОР как прокси:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:9050');
      curl_setopt($ch, CURLOPT_URL, "http://domen.ru/");
      curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
      
      $result = curl_exec($ch);
    
      if(!$result)
      {
        echo curl_error($ch);
      }
      else
      {
        echo $result;
      }
    
      curl_close($ch);

  4. А вот уже более интересный, на мой взгляд, скрипт. Он перебирает страницы на сайте и копирует все картинки.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
      error_reporting(E_ALL);
      ini_set('display_errors', 'On');
      
      class soMain
      {
        protected $_oCURL                = NULL;
        protected $_sSite                = NULL;
        protected $_sURL                = NULL;
    
        function __construct($sSite, $sURL) 
        {
          $this->_oCURL = curl_init();
          $this->_sSite = $sSite;
          $this->_sURL = $sURL;
    
          curl_setopt($this->_oCURL, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($this->_oCURL, CURLOPT_PROXY, '127.0.0.1:9050');
          curl_setopt($this->_oCURL, CURLOPT_PROXYTYPE, 7);
        }
    
    
        protected function _getPageContent($sURL)
        {
          curl_setopt($this->_oCURL, CURLOPT_URL, $sURL);
          $Res = curl_exec($this->_oCURL);
    
          if($Res === false)
          {
            echo ('<b style="color :red">Ошибка curl:</b> ' . curl_error($this->_oCURL)) .'<br />';
          }
          else
          {
            return $Res;
          }
        }
    
    
        protected function _parseImg($sText)
        {
          //$sTag = '<a href=';
          $sTag = '<img src=';
          
          $sPattern  = "|";
            $sPattern .= $sTag.'".*?"';
            $sPattern .= '".*?"';
            //$sPattern .= "|si";
          $sPattern .= "|";
    
          preg_match_all($sPattern, $sText, $aMatches, PREG_SET_ORDER);
    
          $aRet = array();
          foreach($aMatches as $aMatche)
          {
            $aRet[] = str_replace('"', '', str_replace($sTag.'"', '', $aMatche[0]));
          }
    
          return $aRet;
        }
        
        protected function _downloadImg($aImages)
        {
          foreach($aImages as $sImage)
          {
            $sFileUrl = $this->_sSite.$sImage;
            
            $Res = $this->_getPageContent($sFileUrl);
            
            $sFN = str_replace('/', '_', $sImage);
    
            file_put_contents('tmp/'.$sFN, $Res);
          }
        }
    
        public function go()
        {
          ob_start();
    
          $sPageContent = $this->_getPageContent($this->_sURL);
          $aImages = $this->_parseImg($sPageContent);
          
          $this->_downloadImg($aImages);
    ?>
    
    <?
          return ob_get_clean();
        }
      }
    
    
    //----------------------------------------------
      $sURL = 'http://domen.ru/';  
      
      for ($i=1; $i < 10; $i++)
      {
        $sURL = $sSite.'/page/'.$i.'.html'; 
        $oMain = new soMain($sSite, $sURL);
        echo $oMain->go();
      }

Более локаничный пример:

 
  function getContent($sUrl)
  {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:9050');
    curl_setopt($ch, CURLOPT_URL, $sUrl);
    curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
  
    $result = curl_exec($ch);

    if(!$result)
    {
      echo curl_error($ch);
    }

    curl_close($ch);
    
    return($result);
  }
  
  
  $sText = getContent('http://TEST.onion/3976.html');

  //echo strlen($sText)."\n";  
  //file_put_contents('out.html', $sText);
  //$sText = file_get_contents('out.html');

  $sPattern  = '|Файл: <a href="(.*?)">|si';
 
  preg_match_all($sPattern, $sText, $aMatches, PREG_SET_ORDER);
  
  $i = 0;
  $iTotal = count($aMatches);
  foreach($aMatches as $aMatche)
  {
    $i++;
    echo $i.' / '.$iTotal."\n";
    
    
    file_put_contents($i.'-'.basename($aMatche[1]), 
      getContent('http://TEST.onion/'.$aMatche[1])
    );
  }


Категории: Web, PHP, Linux, Centos
Пометки: onion tor
Яндекс.Метрика