Бот для пиринговых сетей Direct Connect

Несмотря на распространение торрентов в интернетах, в домашних сетях (и не только) многих провайдеров все еще остаются популярными пиринговые сети обмена файлами на основе Direct Connect. Поэтому актуальным является вопрос использования ботов для контроля, сбора информации, каталогизации файлов в таких p2p-сетях. В этом качестве можно использовать множество серверных LUA-скриптов, но, на сколько мне известно, такие скрипты сильно грузят сервак и не очень удобны.

Поэтому я искал возможность создания бота, который работал бы как обычный клиент хаба.  Поиски привели меня к такой хорошей perl-библиотеке как Net::DirectConnect (svn://svn.setun.net/dcppp/trunk). Хоть она до конца еще и не доработана, тем не менее текущие ее возможности возволяют решить множество задач:

  • собирать статистику поисковых запросов пользователей;
  • собирать статистику наиболее качаемых файлов;
  • проверять раздаваемые файлы на наличие порно, подмены названий и прочее;
  • проверять чат на мат, оскорбления;
  • автоматически банить провинившихся пользователей;
  • искать файлы по названию и TTH;
  • скачивать файлы и файл-листы;
  • раздавать файлы;
  • организовать веб-интерфейс между ботом и администратором.

Лично я использую эту бибилиотеку для поиска фильмов по базе данных своего ресурса о кино – собираю TTH найденных файлов и предлагаю ползователям сайта магнет-ссылки на для скачивания файлов.

К сожалению библиотека пока не имеет документации, поэтому разбираться придется самим.

Пример использования бота, который ищет файл по TTH и печатает результаты:

#!/usr/bin/perl

use 5.10.0;
use strict;
use IO::Socket::INET;
eval { use Time::HiRes qw(time sleep); };

use lib '../lib';
use Net::DirectConnect;    #::clihub;
use Data::Dumper;

$Data::Dumper::Sortkeys = $Data::Dumper::Useqq = $Data::Dumper::Indent = 1;

my $dc = Net::DirectConnect->new(
'host'           => 'dchub://example.ru:411',
'Nick'         => "Spy",
'Pass'         => '*****',
'M'            => 'A',
'reconnects'   => 500,

#следующие три параметра указывать если бот за NATом, на нате включить портфорвардинг
'myport'       => 4444,
'myport_udp'   => 4444,
'myip'           => '10.0.0.2',
################################
'S'           => 20,
'O'           => 0,
'sharesize'    => 1000099800000,
'client'       => 'dc++',
'V'            => '0.777',
'description'  => 'spy',
'connection'   => 'LAN(T3)',
'email'           => '',
'flag'           => 1,
'log'          => sub(){},
'auto_GetINFO' => 0,
);

#эта функция вызывается тогда когда к боту приходит поисковый запрос
$dc->{'handler'}{'Search'} = sub
{
    my $dc = shift;
    my $s = shift;
    #print $s."\n" if !($s =~ m/tth:/i);
};

#эта функция вызывается тогда когда к боту приходит результат на его(бота) поисковый запрос
$dc->{'handler'}{'SR'} = sub
{
    my $dc = shift;
    my %s = %{ $_[1] || return };
    if ($s{tth} ne '')
    {
        print $s{nick}.':::'.$s{filename}."\n";
    }
};

my $i = 0;
while ($dc->active())
{
    if ($i == 1000)
    {
        $dc->search('6U4DTAKUXPXNUXNS366T5CS7ALJZWRQ2PH4ZSMI');
    }

    $dc->work();
    $i++;
}

$dc->wait_finish();
$dc->disconnect();
exit 0;

Метки: ,

Добавить комментарий