17

是否有一个 PHP 模块可用于以编程方式读取 torrent 以查找有关它的信息,例如 Seeders?

4

4 回答 4

19

我曾经在自己做的一个小网站中使用过这些功能。我想我用一个叫做 OpenTracker 的 php bittorrent 跟踪器或其他东西找到了它们,但找不到该网站......

但是,您不会在 torrent 文件中找到播种机。种子文件只包含有关文件、哈希码和长度等的信息。我相信还有一些跟踪器信息。您必须从跟踪器中获得多少播种机等。您可以在BitTorrent.org阅读有关该协议的信息。我相信通信是经过编码的,因此您也可以使用这些功能。这意味着你只需要弄清楚要发送什么来获得你想要的东西。

注意:这三个函数不是我写的。就像我说的,我在一个开源种子跟踪器的源代码中找到了它们。这些函数没有注释,但是函数名称和一个在 torrent 文件结果中的 print_r 你知道的信息应该足以理解如何使用它们。我在底部添加了一些示例代码来展示我是如何使用它们的。他们工作了。

function bdecode($str) {
    $pos = 0;
    return bdecode_r($str, $pos);
}

function bdecode_r($str, &$pos) {
    $strlen = strlen($str);
    if (($pos < 0) || ($pos >= $strlen)) {
            return null;
    }
    else if ($str{$pos} == 'i') {
            $pos++;
            $numlen = strspn($str, '-0123456789', $pos);
            $spos = $pos;
            $pos += $numlen;
            if (($pos >= $strlen) || ($str{$pos} != 'e')) {
                    return null;
            }
            else {
                    $pos++;
                    return intval(substr($str, $spos, $numlen));
            }
    }
    else if ($str{$pos} == 'd') {
            $pos++;
            $ret = array();
            while ($pos < $strlen) {
                    if ($str{$pos} == 'e') {
                            $pos++;
                            return $ret;
                    }
                    else {
                            $key = bdecode_r($str, $pos);
                            if ($key == null) {
                                    return null;
                            }
                            else {
                                    $val = bdecode_r($str, $pos);
                                    if ($val == null) {
                                            return null;
                                    }
                                    else if (!is_array($key)) {
                                            $ret[$key] = $val;
                                    }
                            }
                    }
            }
            return null;
    }
    else if ($str{$pos} == 'l') {
            $pos++;
            $ret = array();
            while ($pos < $strlen) {
                    if ($str{$pos} == 'e') {
                            $pos++;
                            return $ret;
                    }
                    else {
                            $val = bdecode_r($str, $pos);
                            if ($val == null) {
                                    return null;
                            }
                            else {
                                    $ret[] = $val;
                            }
                    }
            }
            return null;
    }
    else {
            $numlen = strspn($str, '0123456789', $pos);
            $spos = $pos;
            $pos += $numlen;
            if (($pos >= $strlen) || ($str{$pos} != ':')) {
                    return null;
            }
            else {
                    $vallen = intval(substr($str, $spos, $numlen));
                    $pos++;
                    $val = substr($str, $pos, $vallen);
                    if (strlen($val) != $vallen) {
                            return null;
                    }
                    else {
                            $pos += $vallen;
                            return $val;
                    }
            }
    }
}

function bencode($var) {
    if (is_int($var)) {
            return 'i' . $var . 'e';
    }
    else if (is_array($var)) {
            if (count($var) == 0) {
                    return 'de';
            }
            else {
                    $assoc = false;
                    foreach ($var as $key => $val) {
                            if (!is_int($key)) {
                                    $assoc = true;
                                    break;
                            }
                    }
                    if ($assoc) {
                            ksort($var, SORT_REGULAR);
                            $ret = 'd';
                            foreach ($var as $key => $val) {
                                    $ret .= bencode($key) . bencode($val);
                            }
                            return $ret . 'e';
                    }
                    else {
                            $ret = 'l';
                            foreach ($var as $val) {
                                    $ret .= bencode($val);
                            }
                            return $ret . 'e';
                    }
            }
    }
    else {
            return strlen($var) . ':' . $var;
    }
}

一些示例用法:

# Read a file
$content = file_get_contents("file.torrent");
$content_d = bdecode($content);

# Check if bdecode succeeded
if(empty($content_d)) exit('Something is wrong with the torrent. BDecode failed.');

# Calculate info_hash
$info_hash = sha1(bencode($content_d['info']), true);

# Calculate length
$length = 0;
function add_length($value, $key)
{
    global $length;
    if($key == 'length') $length += $value;
}
array_walk_recursive($content_d, 'add_length');
于 2009-03-02T09:37:28.430 回答
8

Google在 sourceforge上提供了这个PHP 客户端,在 PHP 类上提供了这个 torrent类。应该是你所需要的。

于 2008-10-03T14:51:53.347 回答
7

Torrent 文件基本上是用BEncode编码的嵌套字典。BEncode 是一种简单的编码,有几个 BDecode PHP 类,比如这个

torrent 文件的结构在BEP0003中描述。

请注意,种子文件不包含您提到的“播种者”字段。播种者列表是动态的,由跟踪服务器管理。拥有 torrenthash_infotracker_url(都可以从 torrent 文件中获得)您可以将抓取请求发送到跟踪器,它将在“完整”字段中返回播种机的数量,请参阅Tracker Scrape Convention

于 2009-03-02T09:11:18.213 回答
-1

这个库包含一个很好的子库:http: //www.binpress.com/app/phptracker/177

于 2011-02-26T22:20:31.230 回答