2011-07-27 71 views
2

你知道任何易于使用的,适合Python或Perl的API来与BitTorrent跟踪器交互吗?例如,我带一个torrent文件,列举文件中的所有跟踪器并向跟踪器询问与下载文件相关的同伴的统计信息?尼斯BitTorrent跟踪API?

BitTorrent的追踪器规格是不是太复杂,但我不想重新发明轮子:)

请注意,我不想要下载的数据,只是抓住一些统计数据(净:: BitTorrent的远远超过我的需求)

+0

可能相关:http://stackoverflow.com/questions/4418157/python-bittorrent-library –

回答

0

我制作了Perl脚本以从.torrent文件获取数据,将追踪程序集中并获取一些统计信息(文件哈希,IP连接到跟踪程序,文件大小等)。没有大科学,只是一些Perl-fu。要运行它,您需要:Perl模块Bencode,curl传输显示已安装。调试垃圾被发送到stderr和适当的输出到标准输出

#!/usr/bin/perl 

use Bencode qw(bencode bdecode); 
use Data::Dumper; 

use warnings; 
use strict; 

my $G_PEER_ID = "hfgdbvnchdgfhvnfbghf"; 
my $G_MAX_TIME = 20; 

sub peer_decode 
{ 
    my $d = shift; 
    my @a = split '', $d; 
# printf ">>%d %d<<\n", length($d), scalar(@a); 

    my @ret; 

    while(@a) { 
     my $ip = sprintf "%d.%d.%d.%d" , 
       unpack('C',shift(@a)), 
       unpack('C',shift(@a)), 
       unpack('C',shift(@a)), 
       unpack('C',shift(@a)); 
     my $port = sprintf "%d", 256 * unpack('C',shift(@a)) 
            + unpack('C',shift(@a)); 

#  printf "%d $ip $port\n",scalar(@a); 
     push @ret, $ip; 
    } 
    return \@ret; 
} 


sub get_tracker_data_from_file 
{ 
    my $fname = shift; 

    my $ret = {}; 

    my $c = `transmission-show $fname`; 

    print STDERR "$c\n"; 

    if ($c =~ /^\s+Hash:\s*(\S+)/mg) { 
     $ret->{'hash'} = $1; 
    } 

    if ($c =~ /^\s+Total Size:\s*(.+)$/mg) { 
     $ret->{'size'} = $1; 
    } 

    my @g; 
    @g = ($c =~ /Tier \#\d+[\n\r\s]+(\S+)/gm); 
    if (@g) { 
     $ret->{'tiers'} = \@g; 
    } 

    return $ret; 

} 

sub get_peer_ips 
{ 
    my $hash = shift; 
    my $tracker = shift; 

    my $ret = undef; 

    $hash =~ s/(..)/\%$1/g; 
    $tracker =~ s/\/$//; 

    my $c = "curl -m $G_MAX_TIME -s '$tracker?info_hash=$hash&peer_id=$G_PEER_ID&uploaded=0&downloaded=0&left=1'"; 
    print STDERR "$c\n"; 

    my $w = `$c`; 
    return undef if not $w; 
    printf STDERR "%s\n" , Dumper($w); 
    return undef if $w =~ /<\s*html\s*>/gi; 

    $w = bdecode($w, 1); 

    if (defined $w->{'peers'}) { 
     $ret = peer_decode($w->{'peers'}); 
    } 
    return $ret; 
} 

# -- main 

my @files = @ARGV; 

if (not @files) { 
    print <<END 
    usage: $0 <file1.torrent> <file2.torrent> ... 

    (c) http://stackoverflow.com/users/497208 
END 
} 

for my $fname (@files) { 
    printf STDERR "File: %s\n", $fname; 

    my $tr = get_tracker_data_from_file($fname); 
    printf STDERR "%s\n", Dumper $tr; 

    my $hash = undef; 
    $hash = $tr->{'hash'} if defined $tr->{'hash'}; 
    exit if not defined $hash; 

    my $size = undef; 
    if (defined $tr->{'size'}) { 
     $size = $tr->{'size'}; 
    } 
    else { 
     $size = "?"; 
    } 

    if (defined $tr->{'tiers'}) { 
    # shift @{$tr->{'tiers'}} for (1..5); 
     for my $tracker (@{$tr->{'tiers'}}) { 

      my $ips = get_peer_ips($hash, $tracker); 
      printf STDERR "%s\n", Dumper $ips; 

      if (defined $ips) { 
       for my $ip (@$ips) { 
        my $c = sprintf "%s; %16s; %s; %s", $hash, $ip, $size, $tracker; 
        printf STDERR "$c\n"; 
        printf "$c\n"; 
       } 
      } 
     } 
    } 
} 
+1

Take看看https://forum.transmissionbt.com/viewtopic.php?f=1&t=9085 - 他们试图应用像你这样的脚本来实现传输排队。 – Konstantin

3

只是简单的命令行是不够的? :-)(Transmission)为您提供传输远程工具,该工具允许枚举跟踪器并使用一个命令获取对等统计信息。看看上

 -pi --peer-info 
     List the current torrent's connected peers. In the `status' section of the list, the following shorthand is used: 
       D: Downloading from this peer 
       d: We would download from this peer if they would let us 
       E: Encrypted connection 
       I: Peer is an incoming connection 
       K: Peer has unchoked us, but we're not interested 
       O: Optimistic unchoked 
       U: Uploading to peer 
       u: We would upload to this peer if they asked 
       X: Peer was discovered through Peer Exchange (PEX) 
       ?: We unchoked this peer, but they're not interested 
... 

    -si --session-info 
     List session information from the server 

好了,使用它,你必须使用传输,您的BT客户端,但如果这样做,那么你可以使用grep做到这一点,这取决于你真正想要达到的目标。

+0

它不在标准的Ubuntu软件包中:'apt-get install tr​​ansmission -cli transmission-common transmission-daemon'。 _transmission-show_也很有用 –

+1

问题:_transmission-remote_给出意外的响应:

401:未经授权的

未授权的Useroded错误,即使跟踪器不需要验证... –

+1

这不是跟踪器的问题 - 检查有关配置访问列表的文档在守护进程的配置和远程管理的访问权限,也许你只是想关闭它们?在〜/ .config/transmission或/ etc/transmission-daemon中检查settings.json(取决于你如何启动它)rpc- *选项。注意,只要在/ etc中编辑配置是不够的,如果将它作为守护进程运行 - 您将需要执行服务传输守护进程重新加载,因为它在出口时悄悄地覆盖settings.conf。若要检查您是否可以使用rpc,请访问localhost:默认为9091 – Konstantin