Парсинг торрент файла

Тема в разделе "PHP", создана пользователем mulekula, 12 июн 2011.

Статус темы:
Закрыта.
Модераторы: latteo
  1. mulekula

    mulekula Постоялец

    Регистр.:
    6 дек 2008
    Сообщения:
    91
    Симпатии:
    2
    Сегодня пробовал прикрепить к своему сайту отдельный индексатор торрент файлов. Для этого я использовал PHP PsxTorrent 2.1.1. Так как узнал что его можно применять независимо от DLE.
    И понял что моих знаний недостаточно для написания его под отдельный движок.
    Прошу вашей помощи.

    Вот файл gett.php
    PHP:
    <?php
    if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest')
    {
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     * Модуль Псевдо-Трекер версия 2.1 (PHP PsxTreker 2.1)
     * Автор: Rolly (http://rollyz.net)
     * Модуль сделан для сайта: dvdmir.org (псевдо-торрент)
     * Описание: это не продолжение Псевдо-Торрента 1.1, это новый скрипт основанный на новом улучшенном движке.
     * 
     * Основные преимущества версия 2.1:
     * + Fix (указать полный путь к файлам), теперь это делает скрипт
     * + Файл gett.php храниться в папке с модулями '/engine/modules'
     * + Fix показа пиров и сидов
     * Основные преимущества версия 2.0:
     * + Поддержка русского и украинского языка в названиях файлов и папок
     * + Получает информацию о со всех свободных трекеров
     * + Точный сбор данных с аннонсов
     * + Нет пугающих ошибок о отсутствии информации о аннонсе
     * + Не грузит страницу в отличии от старого модуля
     * + Страница не ждет пока информация будет загружена, информация загружается за кулисами
     * Требования:
     * ^ DLE 5 и выше
     * ^ jQuery библиотека 
     * Примечание: скрипт можно использовать в любых движках за счет того, что он независимый. Единственное это файл psxtorrent.php который дает знать о модуле.   
     * Остальное выполняется другим скриптом независимо от движка DLE.
     *
     * Благодарность можно прислать в виде денежки :-) :
     * WebMoney:
     * Z407292316114
     * U354045620899
     * R290646762154
     * E276154191878
     * А еще в виде ссылки на мои сайты: dvdmir.org, rollyz.net, uptracker.ru
     * Контакты:
     * icq: 8661373
    */
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     * Это другой класс (движок) который используется для получения информации о торренте.
     * Автор: Adrien Gibrat 
     * @author   Adrien Gibrat <adrien.gibrat@gmail.com>
     * @copyleft 2009 - Just use it!
     * @license  http://www.gnu.org/licenses/gpl.html GNU General Public License version 3
     * @version  Release: 0.9
    */
    class Torrent {
        
    /**
        * @var array List of error occured
        */
        
    static protected $errors = array();
        
    /** Read and decode torrent file/data OR build a torrent from source folder/file(s)
         * Supported signatures:
         * - Torrent(); // get an instance (usefull to scrape and check errors)
         * - Torrent( string $torrent ); // analyse a torrent file
         * - Torrent( string $torrent, string $announce );
         * - Torrent( string $torrent, array $meta );
         * - Torrent( string $file_or_folder ); // create a torrent file
         * - Torrent( string $file_or_folder, string $announce_url, [int $piece_length] );
         * - Torrent( string $file_or_folder, array $meta, [int $piece_length] );
         * - Torrent( array $files_list );
         * - Torrent( array $files_list, string $announce_url, [int $piece_length] );
         * - Torrent( array $files_list, array $meta, [int $piece_length] );
         * @param string|array torrent to read or source folder/file(s) (optional, to get an instance)
         * @param string|array announce url or meta informations (optional)
         * @param int piece length (optional)
         */
        
    public function __construct $data null$meta = array(), $piece_length 256 ) {
            if ( 
    is_null$data ) )
                return 
    false;
            if ( 
    $piece_length 32 || $piece_length 4096 )
                return 
    self::set_error( new Exception'Invalid piece lenth, must be between 32 and 4096' ) );
            if ( 
    is_string$meta ) )
                
    $meta = array( 'announce' => $meta );
            if ( 
    $this->build$data$piece_length 1024 ) )
                
    $this->touch();
            else
                
    $meta array_merge$meta$this->decode$data ) );
            foreach( 
    $meta as $key => $value )
                
    $this->{$key} = $value;
        }

        
    /** Convert the current Torrent instance in torrent format
         * @return string encoded torrent data
         */
        
    public function __toString() {
            return 
    $this->encode$this );
        }

        
    /** Return last error message
         * @return string|boolean last error message or false if none
         */
        
    public function error() {
            return empty( 
    self::$errors ) ?
                
    false :
                
    self::$errors[0]->getMessage();
        }

        
    /** Return Errors
         * @return array|boolean error list or false if none
         */
        
    public function errors() {
            return empty( 
    self::$errors ) ?
                
    false :
                
    self::$errors;
        }

        
    /**** Getters and setters ****/

        /** Getter and setter of torrent announce url / list
         * If the argument is a string, announce url is added to announce list (or set as announce if announce is not set)
         * If the argument is an array/object, set announce url (with first url) and list (if array has more than one url), tiered list supported
         * If the argument is false announce url & list are unset
         * @param null|false|string|array announce url / list, reset all if false (optional, if omitted it's a getter)
         * @return string|array|null announce url / list or null if not set
         */
        
    public function announce $announce null ) {
            if ( 
    is_null$announce ) )
                return ! isset( 
    $this->{'announce-list'} ) ?
                    isset( 
    $this->announce ) ? $this->announce null :
                    
    $this->{'announce-list'};
            
    $this->touch();
            if ( 
    is_string$announce ) && isset( $this->announce ) )
                return 
    $this->{'announce-list'} = self::announce_list( isset( $this->{'announce-list'} ) ? $this->{'announce-list'} : $this->announce$announce );
            unset( 
    $this->{'announce-list'} );
            if ( 
    is_array$announce ) || is_object$announce ) )
                if ( ( 
    $this->announce self::first_announce$announce ) ) && count$announce ) > )
                    return 
    $this->{'announce-list'} = self::announce_list$announce );
                else
                    return 
    $this->announce;
            if ( ! isset( 
    $this->announce ) && $announce )
                return 
    $this->announce = (string) $announce;
            unset( 
    $this->announce );
        }

        
    /** Getter and setter of torrent comment
         * @param null|string comment (optional, if omitted it's a getter)
         * @return string|null comment or null if not set
         */
        
    public function comment $comment null ) {
            return 
    is_null$comment ) ?
                isset( 
    $this->comment ) ? $this->comment null :
                
    $this->touch$this->comment = (string) $comment );
        }

        
    /** Getter and setter of torrent name
         * @param null|string name (optional, if omitted it's a getter)
         * @return string|null name or null if not set
         */
        
    public function name $name null ) {
            return 
    is_null$name ) ?
                isset( 
    $this->info['name'] ) ? $this->info['name'] : null :
                
    $this->touch$this->info['name'] = (string) $name );
        }

        
    /** Getter and setter of private flag
         * @param null|boolean is private or not (optional, if omitted it's a getter)
         * @return boolean private flag
         */
        
    public function is_private $private null ) {
            return 
    is_null$private ) ?
                ! empty( 
    $this->info['private'] ) :
                
    $this->touch$this->info['private'] = $private );
        }

        
    /** Getter and setter of webseed(s) url list ( GetRight implementation )
         * @param null|string|array webseed or webseeds mirror list (optional, if omitted it's a getter)
         * @return string|array|null webseed(s) or null if not set
         */
        
    public function url_list $urls null ) {
            return 
    is_null$urls ) ?
                isset( 
    $this->{'url-list'} ) ? $this->{'url-list'} : null :
                
    $this->touch$this->{'url-list'} = is_string$urls) ? $urls : (array) $urls );
        }

        
    /** Getter and setter of httpseed(s) url list ( Bittornado implementation )
         * @param null|string|array httpseed or httpseeds mirror list (optional, if omitted it's a getter)
         * @return array|null httpseed(s) or null if not set
         */
        
    public function httpseeds $urls null ) {
            return 
    is_null$urls ) ?
                isset( 
    $this->httpseeds ) ? $this->httpseeds null :
                
    $this->touch$this->httpseeds = (array) $urls );
        }

        
    /**** Analyze BitTorrent ****/

        /** Get piece length
         * @return integer piece length or null if not set
         */
        
    public function piece_length () {
            return isset( 
    $this->info['piece length'] ) ?
                
    $this->info['piece length'] :
                
    null;
        }

        
    /** Compute hash info
         * @return string hash info or null if info not set
         */
        
    public function hash_info () {
            return isset( 
    $this->info ) ?
                
    sha1self::encode$this->info ) ) :
                
    null;
        }

        
    /** List torrent content
         * @param integer|null size precision (optional, if omitted returns sizes in bytes)
         * @return array file(s) and size(s) list, files as keys and sizes as values
         */
        
    public function content $precision null ) {
            
    $files = array();
            if ( isset( 
    $this->info['files'] ) && is_array$this->info['files'] ) )
                foreach ( 
    $this->info['files'] as $file )
                    
    $files[self::path$file['path'], $this->info['name'] )] = $precision ?
                        
    self::format$file['length'], $precision ) :
                        
    $file['length'];
            elseif ( isset( 
    $this->info['name'] ) )
                    
    $files[$this->info['name']] = $precision ?
                        
    self::format$this->info['length'], $precision ) :
                        
    $this->info['length'];
            return 
    $files;
        }

        
    /** List torrent content pieces and offset(s)
         * @return array file(s) and pieces/offset(s) list, file(s) as keys and pieces/offset(s) as values
         */
        
    public function offset () {
            
    $files = array();
            
    $size 0;
            if ( isset( 
    $this->info['files'] ) && is_array$this->info['files'] ) )
                foreach ( 
    $this->info['files'] as $file )
                    
    $files[self::path$file['path'], $this->info['name'] )] = array(
                        
    'startpiece'    => floor$size $this->info['piece length'] ),
                        
    'offset'    => fmod$size$this->info['piece length'] ),
                        
    'size'        => $size += $file['length'],
                        
    'endpiece'    => floor$size $this->info['piece length'] )
                    );
            elseif ( isset( 
    $this->info['name'] ) )
                    
    $files[$this->info['name']] = array(
                        
    'startpiece'    => 0,
                        
    'offset'    => 0,
                        
    'size'        => $this->info['length'],
                        
    'endpiece'    => floor$this->info['length'] / $this->info['piece length'] )
                    );
            return 
    $files;
        }

        
    /** Sum torrent content size
         * @param integer|null size precision (optional, if omitted returns size in bytes)
         * @return integer|string file(s) size
         */
        
    public function size $precision null ) {
            
    $size 0;
            if ( isset( 
    $this->info['files'] ) && is_array$this->info['files'] ) )
                foreach ( 
    $this->info['files'] as $file )
                    
    $size += $file['length'];
            elseif ( isset( 
    $this->info['name'] ) )
                    
    $size $this->info['length'];
            return 
    is_null$precision ) ?
                
    $size :
                
    self::format$size$precision );
        }

        
    /** Request torrent statistics from scrape page
         * @param string announce or scrape page url (optional, to request an alternative tracker BUT mandatory for static call)
         * @param string torrent hash info (optional: ONLY for static call)
         * @return array tracker torrent statistics
         */
        /* static */ 
    public function scrape $announce null$hash_info null ) {
            if ( ! 
    ini_get'allow_url_fopen' ) )
                return 
    self::set_error( new Exception'"allow_url_fopen" must be enabled' ) );
            
    $packed_hash pack('H*'$hash_info $hash_info $this->hash_info() );
            
    $scrape = array();
            foreach ( (array) (
    $announce $announce $this->announce()) as $tier )
                foreach ( (array) 
    $tier as $tracker ) {
                    if ( ! 
    $scrape_data = @file_get_contentsstr_ireplace( array( 'udp://''/announce' ), array( 'http://''/scrape' ), $tracker ) . '?info_hash=' urlencode$packed_hash ) ) )
                        continue 
    $scrape[$tracker] = self::set_error( new Exception'Tracker request failed' ), true );
                    
    $stats self::decode_data$scrape_data );
                    
    $scrape[$tracker] = isset( $stats['files'][$packed_hash] ) ?
                        
    $stats['files'][$packed_hash] :
                        
    self::set_error( new Exception'Invalid scrape data' ), true );
                }
            return 
    $scrape;
        }

        
    /**** Save and Send ****/

        /** Save torrent file to disk
         * @param null|string name of the file (optional)
         * @return boolean file has been saved or not
         */
        
    public function save $filename null ) {
            return 
    file_put_contentsis_null$filename ) ? $this->info['name'] . '.torrent' $filename$this->encode$this ) );
        }

        
    /** Send torrent file to client
         * @param null|string name of the file (optional)
         * @return void script exit
         */
        
    public function send $filename null ) {
            
    $data $this->encode$this );
            
    header'Content-type: application/x-bittorrent' );
            
    header'Content-Length: ' strlen$data ) );
            
    header'Content-Disposition: attachment; filename="' . ( is_null$filename ) ? $this->info['name'] . '.torrent' $filename ) . '"' );
            exit( 
    $data );
        }

        
    /**** Encode BitTorrent ****/

        /** Encode torrent data
         * @param mixed data to encode
         * @return string torrent encoded data
         */
        
    static public function encode $mixed ) {
            switch ( 
    gettype$mixed ) ) {
                case 
    'integer':
                case 
    'double':
                    return 
    self::encode_integer$mixed );
                case 
    'array':
                case 
    'object':
                    return 
    self::encode_array( (array) $mixed );
                default:
                    return 
    self::encode_string( (string) $mixed );
            }
        }

        
    /** Encode torrent string
         * @param string string to encode
         * @return string encoded string
         */
        
    static private function encode_string $string ) {
            return 
    strlen$string ) . ':' $string;
        }

        
    /** Encode torrent integer
         * @param integer integer to encode
         * @return string encoded integer
         */
        
    static private function encode_integer $integer ) {
            return 
    'i' $integer 'e';
        }

        
    /** Encode torrent dictionary or list
         * @param array array to encode
         * @return string encoded dictionary or list
         */
        
    static private function encode_array $array ) {
            if ( 
    self::is_list$array ) ) {
                
    $return 'l';
                foreach ( 
    $array as $value )
                    
    $return .= self::encode$value );
            } else {
                
    ksort$arraySORT_STRING );
                
    $return 'd';
                foreach ( 
    $array as $key => $value )
                    
    $return .= self::encodestrval$key ) ) . self::encode$value );
            }
            return 
    $return 'e';
        }

        
    /**** Decode BitTorrent ****/

        /** Decode torrent data or file
         * @param string data or file path to decode
         * @return array decoded torrent data
         */
        
    static protected function decode $string ) {
            
    $data is_file$string ) || self::url_exists$string ) ?
                
    file_get_contents$string ) :
                
    $string;
            return (array) 
    self::decode_data$data );
        }

        
    /** Decode torrent data
         * @param string data to decode
         * @return array decoded torrent data
         */
        
    static private function decode_data ( & $data ) {
            switch( 
    self::char$data ) ) {
            case 
    'i':
                
    $data substr$data);
                return 
    self::decode_integer$data );
            case 
    'l':
                
    $data substr$data);
                return 
    self::decode_list$data );
            case 
    'd':
                
    $data substr$data);
                return 
    self::decode_dictionary$data );
            default:
                return 
    self::decode_string$data );
            }
        }

        
    /** Decode torrent dictionary
         * @param string data to decode
         * @return array decoded dictionary
         */
        
    static private function decode_dictionary ( & $data ) {
            
    $dictionary = array();
            
    $previous null;
            while ( ( 
    $char self::char$data ) ) != 'e' ) {
                if ( 
    $char === false )
                    return 
    self::set_error( new Exception'Unterminated dictionary' ) );
                if ( ! 
    ctype_digit$char ) )
                    return 
    self::set_error( new Exception'Invalid dictionary key' ) );
                
    $key self::decode_string$data );
                if ( isset( 
    $dictionary[$key] ) )
                    return 
    self::set_error( new Exception'Duplicate dictionary key' ) );
                if ( 
    $key $previous )
                    return 
    self::set_error( new Exception'Missorted dictionary key' ) );
                
    $dictionary[$key] = self::decode_data$data );
                
    $previous $key;
            }
            
    $data substr$data);
            return 
    $dictionary;
        }

        
    /** Decode torrent list
         * @param string data to decode
         * @return array decoded list
         */
        
    static private function decode_list ( & $data ) {
            
    $list = array();
            while ( ( 
    $char self::char$data ) ) != 'e' ) {
                if ( 
    $char === false )
                    return 
    self::set_error( new Exception'Unterminated list' ) );
                
    $list[] = self::decode_data$data );
            }
            
    $data substr$data);
            return 
    $list;
        }

        
    /** Decode torrent string
         * @param string data to decode
         * @return string decoded string
         */
        
    static private function decode_string ( & $data ) {
            if ( 
    self::char$data ) === '0' && substr$data1) != ':' )
                
    self::set_error( new Exception'Invalid string length, leading zero' ) );
            if ( ! 
    $colon = @strpos$data':' ) )
                return 
    self::set_error( new Exception'Invalid string length, colon not found' ) );
            
    $length intvalsubstr$data0$colon ) );
            if ( 
    $length $colon strlen$data ) )
                return 
    self::set_error( new Exception'Invalid string, input too short for string length' ) );
            
    $string substr$data$colon 1$length );
            
    $data substr$data$colon $length );
            return 
    $string;
        }

        
    /** Decode torrent integer
         * @param string data to decode
         * @return integer decoded integer
         */
        
    static private function decode_integer ( & $data ) {
            
    $start 0;
            
    $end    strpos$data'e');
            if ( 
    $end === )
                
    self::set_error( new Exception'Empty integer' ) );
            if ( 
    self::char$data ) == '-' )
                
    $start++;
            if ( 
    substr$data$start) == '0' && ( $start != || $end $start ) )
                
    self::set_error( new Exception'Leading zero in integer' ) );
            if ( ! 
    ctype_digitsubstr$data$start$end ) ) )
                
    self::set_error( new Exception'Non-digit characters in integer' ) );
            
    $integer substr$data0$end );
            
    $data substr$data$end );
            return 
    $integer 0;
        }

        
    /**** Internal Helpers ****/

        /** Build torrent info
         * @param string|array source folder/file(s) path
         * @param integer piece length
         * @return array|boolean torrent info or false if data isn't folder/file(s)
         */
        
    protected function build $data$piece_length ) {
            if ( 
    is_null$data ) )
                return 
    false;
            elseif ( 
    is_array$data ) && self::is_list$data ) )
                return 
    $this->info $this->files$data$piece_length );
            elseif ( 
    is_dir$data ) )
                return 
    $this->info $this->folder$data$piece_length );
            elseif ( ( 
    is_file$data ) || self::url_exists$data ) ) && ! self::is_torrent$data ) )
                return 
    $this->info $this->file$data$piece_length );
            else
                return 
    false;
        }

        
    /** Set torrent creator and creation date
         * @param any param
         * @return any param
         */
        
    protected function touch $void null ) {
            
    $this->{'created by'}        = 'Torrent PHP Class - Adrien Gibrat';
            
    $this->{'creation date'}    = time();
            return 
    $void;
        }

        
    /** Add an error to errors stack
         * @param Exception error to add
         * @param boolean return error message or not (optional, default to false)
         * @return boolean|string return false or error message if requested
         */
        
    static protected function set_error $exception$message false ) {
            return ( 
    array_unshiftself::$errors,  $exception ) && $message ) ? $exception->getMessage() : false;
        }

        
    /** Build announce list
         * @param string|array announce url / list
         * @param string|array announce url / list to add (optionnal)
         * @return array announce list (array of arrays)
         */
        
    static protected function announce_list$announce$merge = array() ) {
            return 
    array_mapcreate_function'$a''return (array) $a;' ), array_merge( (array) $announce, (array) $merge ) );
        }

        
    /** Get the first announce url in a list
         * @param array announce list (array of arrays if tiered trackers)
         * @return string first announce url
         */
        
    static protected function first_announce$announce ) {
            while ( 
    is_array$announce ) )
                
    $announce reset$announce );
            return 
    $announce;
        }

        
    /** Helper to pack data hash
         * @param string data
         * @return string packed data hash
         */
        
    static protected function pack ( & $data ) {
            return 
    pack('H*'sha1$data ) ) . ( $data '' );
        }

        
    /** Helper to build file path
         * @param array file path
         * @param string base folder
         * @return string real file path
         */
        
    static protected function path $path$folder ) {
            
    array_unshift$path$folder );
            return 
    joinDIRECTORY_SEPARATOR$path );
        }

        
    /** Helper to test if an array is a list
         * @param array array to test
         * @return boolean is the array a list or not
         */
        
    static protected function is_list $array ) {
            foreach ( 
    array_keys$array ) as $key )
                if ( ! 
    is_int$key ) )
                    return 
    false;
            return 
    true;
        }

        
    /** Build torrent info from single file
         * @param string file path
         * @param integer piece length
         * @return array torrent info
         */
        
    private function file $file$piece_length ) {
            if ( ! 
    $handle self::fopen$file$size self::filesize$file ) ) )
                return 
    self::set_error( new Exception'Failed to open file: "' $file '"' ) );
            
    $pieces '';
            while ( ! 
    feof$handle ) )
                
    $pieces .= self::packfread$handle$piece_length ) );
            
    fclose$handle );
            return array(
                
    'length'    => $size,
                
    'name'        => basename$file ),
                
    'piece length'    => $piece_length,
                
    'pieces'    => $pieces
            
    );
        }

        
    /** Build torrent info from files
         * @param array file list
         * @param integer piece length
         * @return array torrent info
         */
        
    private function files $files$piece_length ) {
            
    $files array_map'realpath'$files );
            
    sort$files );
            
    usort$filescreate_function'$a,$b''return strrpos($a,DIRECTORY_SEPARATOR)-strrpos($b,DIRECTORY_SEPARATOR);' ) );
            
    $path    explodeDIRECTORY_SEPARATORdirnamerealpathcurrent$files ) ) ) );
            
    $length    $piece_length;
            
    $piece    $pieces '';
            foreach ( 
    $files as $i => $file ) {
                if ( 
    $path != array_intersect_assoc$file_path explodeDIRECTORY_SEPARATOR$file ), $path ) )
                    continue 
    self::set_error( new Exception'Files must be in the same folder: "' $file '" discarded' ) );
                if ( ! 
    $handle self::fopen$file$filesize self::filesize$file ) ) )
                    continue 
    self::set_error( new Exception'Failed to open file: "' $file '" discarded' ) );
                while ( ! 
    feof$handle ) )
                    if ( ( 
    $length strlen$piece .= fread$handle$length ) ) ) == $piece_length )
                        
    $pieces .= self::pack$piece );
                    else
                        
    $length $piece_length $length;
                
    fclose$handle );
                
    $info_files[$i] = array(
                    
    'length'    => $filesize,
                    
    'path'        => array_diff$file_path$path )
                );
            }
            switch ( 
    count$info_files ) ) {
                case 
    0:
                    return 
    false;
                case 
    1:
                    return 
    $this->file$files[key$info_files )], $piece_length );
                default:
                    return array(
                        
    'files'        => $info_files,
                        
    'name'        => end$path ),
                        
    'piece length'    => $piece_length,
                        
    'pieces'    => $pieces . ( $piece self::pack$piece ) : '' )
                    );
            }
        }

        
    /** Build torrent info from folder content
         * @param string folder path
         * @param integer piece length
         * @return array torrent info
         */
        
    private function folder $dir$piece_length ) {
            return 
    $this->filesself::scandir$dir ), $piece_length );
        }

        
    /** Helper to return the first char of encoded data
         * @param string encoded data
         * @return string|boolean first char of encoded data or false if empty data
         */
        
    static private function char $data ) {
            return empty( 
    $data ) ?
                
    false :
                
    substr$data0);
        }

        
    /**** Public Helpers ****/

        /** Helper to format size in bytes to human readable
         * @param integer size in bytes
         * @param integer precision after coma
         * @return string formated size in appropriate unit
         */
        
    static public function format $size$precision ) {
            
    $units = array ('bytes''Kb''Mb''Gb''Tb');
            while( ( 
    $next next$units ) ) && $size 1024 )
                
    $size /= 1024;
            return 
    round$size$precision ) . ' ' . ( $next prev$units ) : end$units ) );
        }

        
    /** Helper to return filesize (even bigger than 2Gb -linux only- and distant files size)
         * @param string file path
         * @return double|boolean filesize or false if error
         */
        
    static public function filesize $file ) {
            if ( 
    is_file$file ) )
                return (double) 
    sprintf'%u', @filesize$file ) );
            else if ( 
    $content_length preg_grep$pattern '#^Content-Length:\s+(\d+)$#i', (array) @get_headers$file ) ) )
                return (int) 
    preg_replace$pattern'$1'reset$content_length ) );
        }

        
    /** Helper to open file to read (even bigger than 2Gb, linux only)
         * @param string file path
         * @param integer|double file size (optional)
         * @return ressource|boolean file handle or false if error
         */
        
    static public function fopen $file$size null ) {
            if ( ( 
    is_null$size ) ? self::filesize$file ) : $size ) <= pow1024) )
                return 
    fopen$file'r' );
            elseif ( 
    PHP_OS != 'Linux' )
                return 
    self::set_error( new Exception'File size is greater than 2GB. This is only supported under Linux' ) );
            elseif ( ! 
    is_readable$file ) )
                return 
    false;
            else
                return 
    popen'cat ' escapeshellargrealpath$file ) ), 'r' );
        }

        
    /** Helper to scan directories files and sub directories recursivly
         * @param string directory path
         * @return array directory content list
         */
        
    static public function scandir $dir ) {
            
    $paths = array();
            foreach ( 
    scandir$dir ) as $item )
                    if ( 
    $item != '.' && $item != '..' )
                        if ( 
    is_dir$path realpath$dir DIRECTORY_SEPARATOR $item ) ) )
                            
    $paths array_mergeself::scandir$path ), $paths );
                        else
                            
    $paths[] = $path;
            return 
    $paths;
        }

        
    /** Helper to check if url exists
         * @param string url to check
         * @return boolean does the url exist or not
         */
        
    static public function url_exists $file ) {
            return (bool) 
    preg_grep('#^HTTP/.*\s(200|304)\s#', (array) @get_headers$file ) );
        }

        
    /** Helper to check if a file is a torrent
         * @param string file location
         * @return boolean is the file a torrent or not
         */
        
    static public function is_torrent $file ) {
            return @
    file_get_contents$file0null011 ) === 'd8:announce';
        }
    }

    ini_set('default_socket_timeout',    3);

    $tornf         $_POST['torrnetnamefile'];
    // В '' введите "полный" путь к файлам

    define('ROOT_DIR'realpath(dirname(__FILE__)));

    $torrent     = new Torrent(ROOT_DIR.'/../../uploads/files/'.$tornf);
    $ann_s        $torrent->announce();
    $scr         $torrent->scrape();

    // $content = $torrent->content();
    // Функция переводит UTF-8 в Win1251 (CP1251)
    function Utf8ToWin($fcontents) {
        
    $out $c1 '';
        
    $byte2 false;
        for (
    $c 0;$c strlen($fcontents);$c++) {
            
    $i ord($fcontents[$c]);
            if (
    $i <= 127) {
                
    $out .= $fcontents[$c];
            }
            if (
    $byte2) {
                
    $new_c2 = ($c1 3) * 64 + ($i 63);
                
    $new_c1 = ($c1 >> 2) & 5;
                
    $new_i $new_c1 256 $new_c2;
                if (
    $new_i == 1025) {
                    
    $out_i 168;
                } else {
                    if (
    $new_i == 1105) {
                        
    $out_i 184;
                    } else {
                        
    $out_i $new_i 848;
                    }
                }
                
    // UKRAINIAN fix
                
    switch ($out_i){
                    case 
    262$out_i=179;break;// і
                    
    case 182$out_i=178;break;// І 
                    
    case 260$out_i=186;break;// є
                    
    case 180$out_i=170;break;// Є
                    
    case 263$out_i=191;break;// ї
                    
    case 183$out_i=175;break;// Ї
                    
    case 321$out_i=180;break;// ґ
                    
    case 320$out_i=165;break;// Ґ
                
    }
                
    $out .= chr($out_i);
                
                
    $byte2 false;
            }
            if ( ( 
    $i >> 5) == 6) {
                
    $c1 $i;
                
    $byte2 true;
            }
        }
        return 
    $out;
    }
    // Функция для вычисления размера файла
    function formatBytes($bytes$precision 2
    {
    $units = array('bytes''Kb''Mb''Gb''Tb');
    $bytes max($bytes0);
    $pow floor(($bytes log($bytes) : 0) / log(1024));
    $pow min($powcount($units) - 1);
    $bytes /= pow(1024$pow);
    return 
    round($bytes$precision) . ' ' $units[$pow];
    }
    /*
    // Выводим все файлы .торрента
    foreach ($content as $cx => $v) {
    $ssdx = formatBytes($v);
    echo Utf8ToWin("$cx  | $ssdx ($v) <br /><br />");
    }
    */

    $t_size $torrent->size(2);
    $t_hash $torrent->hash_info();
    $t_name $torrent->name();

    foreach(
    $scr as $mx
    {
    if(
    is_array($mx)     && array_key_exists('complete'$mx)    || 
    is_array($mx)         && array_key_exists('downloaded'$mx)    ||
    is_array($mx)         && array_key_exists('incomplete'$mx)) 
    {
    $t_complete     += $mx['complete'];
    $t_downloaded     += $mx['downloaded'];
    $t_incomplete     += $mx['incomplete'];
    }
    }
    $tx_cx1 $t_complete;
    $tx_dx1 $t_downloaded;
    $tx_ix1 $t_incomplete;

    if (!isset(
    $t_hash))
    {
    $error_x += 1;
    }
    if (!isset(
    $tx_cx1) && !isset($tx_dx1) && !isset($tx_ix1))
    {
    $error_x += 2;
    }
    if (
    $error_x == 2)
    {
    $rrra_seed rand(1,999);
    $rrra_pir  rand(1,99);
    $tx_status 1;
    $tx_cx1 $rrra_seed;
    $tx_dx1 $rrra_seed+$rrra_seed;
    $tx_ix1 $rrra_pir;
    $t_ann     'Скачал? Не слазь с раздачи!';
    }
    else if (
    $error_x == 3)
    {
    $tx_status 0;
    $tx_cx1 0;
    $tx_dx1 0;
    $tx_ix1 0;
    $t_hash 0;
    $t_name 'File is dead!';
    $t_size 0;
    $t_ann     'Торрент мертв.';
    }
    else
    {
    if (
    $tx_cx1 || $tx_dx1 || $tx_ix1 0)
    {
    $tx_status 1;
    if (
    $tx_cx1 $tx_ix1)
    {
    $t_ann     'Все отлично.';
    }
    else if (
    $tx_cx1 == && $tx_ix1 0)
    {
    $t_ann     'Некому раздавать торрент, если у вас есть этот файл(ы), помогите, станьте на раздачу.';
    }
    else if (
    $tx_dx1 && $tx_cx1 && $tx_ix1 1)
    {
    $t_ann     'Торрент не активен.';
    }
    else
    {
    $tx_status 1;
    $t_ann     'После скачивания, не покидайте раздачу.';
    }
    }
    }
    echo 
    "{
    status:'
    $tx_status',
    t_complete:'
    $tx_cx1',
    t_downloaded:'
    $tx_dx1',
    t_incomplete:'
    $tx_ix1',
    t_size:'
    $t_size',
    t_hash:'
    $t_hash',
    t_name:'
    $t_name',
    t_ann:'
    $t_ann'
    }"
    ;
    }
    else
    {
    echo 
    "hack attack, interesting what inside? Callme: icq 8661373 or gkhelloworld[DOG]gmail.com, powered by Rolly";
    }
    ?>
    После запроса _http://localhost/php/gett.php?torr=1.torrent получаю ответ
    {"SCRIPTDATA": "hack attack, interesting what inside? Callme: icq 8661373 or gkhelloworld [DOG] gmail.com, powered by Rolly", "ERROR ":""})
    Что именно мог сделать автор чтобы запретить парсинг информации?
     
  2. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    самое первое условие: if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest') возвращает false, если не ошибаюсь параметр HTTP_X_REQUESTED_WITH передает только Google Chrome
     
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    991
    Симпатии:
    267
    Объект XMLHttpRequest (или, сокращенно, XHR) дает возможность браузеру делать HTTP-запросы к серверу без перезагрузки страницы. Т.е. это обычный ajax.

    Запрос нужно выполнять с помощью ajax технологии или удалить в самом начале:
    и в самом конце кода
     
  4. mulekula

    mulekula Постоялец

    Регистр.:
    6 дек 2008
    Сообщения:
    91
    Симпатии:
    2
    после удаления данного кода получил новую ошибку.
    ({"SCRIPTDATA":"{\nstatus:'0',\nt_complete:'0',\nt_downloaded:'0',\nt_incomplete:'0',\nt_size:'0',\nt_hash:'0',\nt_name:'File is dead!',\nt_ann:'\u0422\u043e\u0440\u0440\u0435\u043d\u0442 \u043c\u0435\u0440\u0442\u0432.'\n}","ERROR":""})
    Добавлено через 3 минуты
    как именно можно сделать ajax запрос?
    Добавлено через 32 минуты

    может так?
    PHP:
    <script>
    var 
    jsonstr JSON.stringify(obj);
    var 
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST""http://localhost/php/gett.php?torr=1.torrent"true);
    </script>
     
  5. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    Обрати внимания:
    PHP:
    $tornf         $_POST['torrnetnamefile']; 
    // В '' введите "полный" путь к файлам 
    define('ROOT_DIR'realpath(dirname(__FILE__))); 
    $torrent     = new Torrent(ROOT_DIR.'/../../uploads/files/'.$tornf); 
    Ты должен передавать $_POST['torrnetnamefile'], а не $_GET['torr'].
    Используй JS-Framework меньше геморроя;
    PHP:
    $.post('gett.php',{'torrnetnamefile':'1.torrent'},function(data){
        
    alert(data);
    })
    //jQuery
    Добавлено через 3 минуты
    это не ошибка, а результат, данные о торренте
     
    mulekula нравится это.
  6. mulekula

    mulekula Постоялец

    Регистр.:
    6 дек 2008
    Сообщения:
    91
    Симпатии:
    2
    Как я понял здесь продемонстовано POST-запрос. Правильно?

    http://bigtorrents.org/php/tfi.php?tor=http://bigtorrents.ws/torr/13/Krikuny.2.Ohota[Bigtorrents.org].torrent

    Это код вывода информации о торрент на сайт.

    PHP:
    <script>
    if (/
    bigtorrents.ws/.test(document.getElementById('torrname').href)) {
    var 
    obj = {"name""michelle"};
    var 
    jsonstr JSON.stringify(obj);
    var 
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST""http://bigtorrents.org/php/tfi.php?tor=http://bigtorrents.ws/torr/13/Krikuny.2.Ohota[Bigtorrents.org].torrent"true);
    xmlhttp.onreadystatechange = function () {
    if(
    xmlhttp.readyState == 4) {
    document.getElementById('torinf').innerHTML=xmlhttp.responseText;
    }
    }
    xmlhttp.setRequestHeader("Content-Type""text/html");
    xmlhttp.send(jsonstr);
    document.getElementById('torrazmur').style.display 'none';
    } else {
    document.getElementById('torinf').style.display 'none';};
    </script>

    Это все можно заменить вашим примером?
     
  7. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    Это GET-запрос

    PHP:
    <script
    $(function(){
        if (/
    bigtorrents.ws/.test($("#torrname").attr('href'))) { 
            $.
    ajax({
                
    url'http://bigtorrents.org/php/tfi.php?tor=http://bigtorrents.ws/torr/13/Krikuny.2.Ohota[Bigtorrents.org].torrent',
                
    type:'POST',
                
    dataType:'html',
                
    data:{
                    
    name"michelle"
                
    },
                
    success:function(data){
                    $(
    "#torinf").html(data);
                    $(
    "#torrazmur").hide();
                }
            })
        }else{
            $(
    "#torinf").hide();
        }
    })
    </script>   
    Добавлено через 10 минут
    Так как ты используешь PHP PsxTorrent 2.1.1, для которого был написан модуль для DLE используй код из модуля:

    Файл: psxtorrent.php
    Строка: 873 по 913

    А выше всего есть HTML;
     
    mulekula нравится это.
  8. mulekula

    mulekula Постоялец

    Регистр.:
    6 дек 2008
    Сообщения:
    91
    Симпатии:
    2
    Могу ли я весь этот код запхать в gett.php чтобы в дальнейшем через GEt запросы получать информацию о файле?

    PHP:
    <table width='100%' border='0' cellpadding='3' cellspacing='1' id='torrent_table_file'>
          <
    tr>
            <
    td width='100' bgcolor='#FFFFFF'><b>Популярность:</b></td>
            <
    td bgcolor='#FFFFFF' class='dwntorrent_total'><span class='dwntorrent_up'><img src='{THEME}/images/psxtorrent/load1.png' border='0' /></span>&nbsp;<span id='total_downloaded-{$row['id']}'><img src='{THEME}/images/psxtorrent/sload.gif'></span>&nbsp;ед.</td>
          </
    tr>
          <
    tr>
            <
    td bgcolor='#FFFFFF'><b>Сиды:</b></td>
            <
    td bgcolor='#FFFFFF' class='dwntorrent_down'><span class='dwntorrent_up'><img src='{THEME}/images/psxtorrent/up1.gif' border='0' />&nbsp;<span id='total_seeds-{$row['id']}'><img src='{THEME}/images/psxtorrent/sload.gif'></span>&nbsp;</span></td>
          </
    tr>
          <
    tr>
            <
    td bgcolor='#FFFFFF'><b>Пиры:</b></td>
            <
    td bgcolor='#FFFFFF' class='dwntorrent_down'><img src='{THEME}/images/psxtorrent/down1.gif' border='0' />&nbsp;<span id='total_leachers-{$row['id']}'><img src='{THEME}/images/psxtorrent/sload.gif'></span>&nbsp;</td>
          </
    tr>
          <
    tr>
            <
    td bgcolor='#FFFFFF'><b>Название:</b></td>
            <
    td bgcolor='#FFFFFF'><span id='torrent_name-{$row['id']}'><img src='{THEME}/images/psxtorrent/sload.gif'></span></td>
          </
    tr>
          <
    tr>
            <
    td bgcolor='#FFFFFF'><b>Общий размер:</b></td>
            <
    td bgcolor='#FFFFFF' class='torrent_size'><span id='torrent_size-{$row['id']}'><img src='{THEME}/images/psxtorrent/sload.gif'></span></td>
          </
    tr>
          <
    tr>
            <
    td bgcolor='#FFFFFF'>SHA Hash:</td>
            <
    td bgcolor='#FFFFFF'><span id='torrent_hash-{$row['id']}'><img src='{THEME}/images/psxtorrent/sload.gif'></span></td>
          </
    tr>
          <
    tr>
            <
    td bgcolor='#FFFFFF'>Аннонсы:</td>
            <
    td bgcolor='#FFFFFF'><span id='torrent_ann-{$row['id']}'><img src='{THEME}/images/psxtorrent/sload.gif'></span></td>
          </
    tr>
        </
    table></td>
      </
    tr>
    PHP:
    <script>
    $(
    document).ready(function()
    {
    $.
    ajax({
    type:     'POST',
    url:     '/engine/modules/gett.php',
    data:     'torrnetnamefile={$torrent1}',
    dataType'json',
    success: function(msg)
    {
    if(
    parseInt(msg.status)==1)
    {
    $(
    '#total_downloaded-{$row['id']}').text(msg.t_downloaded);
    $(
    '#total_seeds-{$row['id']}').text(msg.t_complete);
    $(
    '#total_leachers-{$row['id']}').text(msg.t_incomplete);
    $(
    '#torrent_size-{$row['id']}').text(msg.t_size);
    $(
    '#torrent_hash-{$row['id']}').text(msg.t_hash);
    $(
    '#torrent_name-{$row['id']}').text(msg.t_name);
    $(
    '#torrent_ann-{$row['id']}').text(msg.t_ann);
    }
    else if(
    parseInt(msg.status)==0)
    {
    $(
    '#total_downloaded-{$row['id']}').text(msg.t_downloaded);
    $(
    '#total_seeds-{$row['id']}').text(msg.t_complete);
    $(
    '#total_leachers-{$row['id']}').text(msg.t_incomplete);
    $(
    '#torrent_size-{$row['id']}').text(msg.t_size);
    $(
    '#torrent_hash-{$row['id']}').text(msg.t_hash);
    $(
    '#torrent_name-{$row['id']}').text(msg.t_name);
    $(
    '#torrent_ann-{$row['id']}').text(msg.t_ann);
    }
    }
    });
        $(
    '#dwntorrenttxtx-{$row['id']}').toggle(
          function () {
            $(
    '#div_torrentfiles-{$row['id']}').fadeIn('slow');
          },
          function () {
            $(
    '#div_torrentfiles-{$row['id']}').fadeOut('slow');
          });
    });
    </script>
     
Статус темы:
Закрыта.