BitTorrent 跟踪器 API 不错吗?

发布于 2024-11-26 23:07:53 字数 233 浏览 0 评论 0原文

您是否知道任何易于使用、简洁的 Python 或 Perl API 可以与 BitTorrent Tracker 进行交互?例如,我获取一个 torrent 文件,枚举文件中的所有跟踪器,并向跟踪器询问与下载文件相关的对等点的统计信息?

BitTorrent Tracker 规范并不太复杂,但我不想重新发明轮子:)

请注意,我不想下载数据,只是为了获取一些统计数据(Net::BitTorrent 远远超过我需要的)

Do you know of any easy to use, neat API for Python or Perl to interact with BitTorrent Trackers? E.g., I take a torrent file, enumerate all trackers in the file and ask the tracker for the statistics of the peers related with the downloaded file?

BitTorrent Tracker specification is not too complicated, but I don't want to reinvent the wheel :)

Note that I don't want to download the data, just to grab some stats (Net::BitTorrent far more than I need)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

二智少女 2024-12-03 23:07:53

仅简单的命令行还不够吗? :-) (Transmission) 为您提供了transmission-remote工具,允许枚举跟踪器并通过一个命令获取对等统计信息。好吧

     -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

,要使用它,您必须使用 Transmission 作为您的 torrent 客户端,但如果您这样做,那么您可以使用 grep 来完成,这取决于您真正想要实现的目标。

Just plain command line isn't enough? :-) (Transmission) gives you transmission-remote tool which permits to enumerate trackers and get peer statistics with one command. Look on

     -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

Well, to use it you have to use transmission as your torrent client, but if you do then you can do it with grep, it depends on what really you want to achieve.

哎呦我呸! 2024-12-03 23:07:53

看看 py-transmission

编辑:自从我写了这篇文章以来,我发现transmissionbt的RPC接口有非常详细的文档记录并且用户足够友好如果你采取学习基础知识的时间。

Have a look at py-transmission

Edit: Since I wrote this, I found that transmissionbt's RPC interface is extremely well documented and user friendly enough if you take the time to learn the basics.

你的笑 2024-12-03 23:07:53

我制作了 Perl 脚本来从 .torrent 文件获取数据、汇集跟踪器并获取一些统计信息(文件哈希、连接到跟踪器的 IP、文件大小等)。没有什么大科学,只是一些 Perl-fu。要运行它,您需要:安装 Perl 模块 Bencodecurltransmission-show。调试垃圾被发送到stderr,正确的输出被发送到stdout

#!/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";
                }
            }
        }
    }
}

I made the Perl script to get data from .torrent files, pool the trackers and get some statistics (file hash, IP connected to the tracker, file size, etc.). No big science, just some Perl-fu. To run it, you need: Perl module Bencode, curl and transmission-show installed. Debug garbage is sent to stderr and the proper output to stdout.

#!/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";
                }
            }
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文