ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Пишем простого Irc бота на Perl
  #1  
Старый 16.06.2007, 23:30
Аватар для ENFIX
ENFIX
Участник форума
Регистрация: 06.06.2006
Сообщений: 213
Провел на форуме:
1628290

Репутация: 474
Отправить сообщение для ENFIX с помощью ICQ
По умолчанию Пишем простого Irc бота на Perl

Пишем IRC бота на PERL

Здравствуйте! Сегодня я вам расскажу, как написать простенького irc бота на PERL.
Сам недавно только взялся за изучение этого языка. Как то раз скачал книгу Клинтон Пирс - "Освой самостоятельно Perl за 24 часа"
Скажу сразу - книга так себе, только основы (Но мне как раз это и нужно было)
И вот, когда я дошел до модулей, наткнулся на IO::Socket. Тем вечером я еще сидел в ирке, и подумал: "А почему бы не попробовать..."

Ну вот, лирическое отступление кончилось =) Начнем!

И так, что нам понадобится:
ActivePerl, подключение к интернету, mIRC(или другой клиент для IRC), минимальные знания PERL, а также документация по протоколу IRC со стороны клиента (я брал http://tools.ietf.org/html/rfc2812)

Собственно вот... Открываем текстовый редакор, пишем строчки:
Код:
#!/usr/bin/perl
Думаю, тут комментировать ненадо, но все таки. Эта строка указывает путь к интерпритатору PERL.

Подключаем модули:
Код:
use strict; 
use IO::Socket;
Подключили =)
Код:
my $server = "irc.inattack.ru"; 
my $port=6667;
my $chanel = "#inattack";
my $nick = "MIKE"; 
my $ident = "mike";
my $name="Майк";
В переменной $server хранится адрес irc сервера (вписываем нужный)
В переменной $port хранится порт irc сервера (вписываем нужный)
И в переменной $chanel хранится адрес канала
В переменной $nick хранится Ник бота
В переменной $ident хранится Идент бота
В переменной $name хранится имя бота (увидите при хуизе)

Идем дальше:
Код:
my $socket = new IO::Socket::INET(PeerAddr => $server, PeerPort => $port, Proto => "tcp");
в этой строке создаем новый объект IO::Socket::INET и ссылка на него присваевается переменной $socket

Ну вот, переменные мы задали, начало есть =)
Теперь идем к документации, видим, что первым делом мы должны послать
Цитата:
Command: NICK
Parameters: <nickname>
Так и сделаем 8)
Код:
print $socket "NICK $nick\r\n";
В переменную $socket вы вводим NICK $nick, \r\n - перевод каретки на следущую строку (то же что и Enter)

Идем дальше, следущей командой должна быть:
Цитата:
Command: USER
Parameters: <user> <mode> <unused> <realname>
Собственно что мы и сделаем:
Код:
print $socket "USER $ident 8 * :$name\r\n";
Что далее? Далее мы заходим на нужный нам канал, что говорит документация?
Цитата:
Command: JOIN
Parameters: ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] )
/ "0"
Реализовываем:
Код:
print $socket "JOIN $chanel\r\n";
Готово, бот законнектился на ирк сервер, зашел на канал, НО, спустя какое то время его выкинет по причине (Ping timeout)
Этого нам конечно же не нужно. По протоколу, спустя какое то время, сервер на посылает запрос вида "PING : irc.site.com", а нам надо отправить ответ PONG.
Идем к документации, видим:
Цитата:
Command: PONG
Parameters: <server> [ <server2> ]
"Шкодим" через цикл
Код:
while (my $body = <$socket>) { 
chop $body; 
if ($body =~ /^PING(.*)$/i) { 
print $socket "PONG $1\r\n"; 
}
}
Готово! Теперь наш бот умеет коннектиться к серверу, заходить на канал и "не вылетать" 8)
Но все равно чего-то не хватает, правда? =)
Давайте сделаем, чтоб при заходе на канал, он говорил привет:
Код:
print $socket ("PRIVMSG $chanel : Привет всем =)\r\n");
Отлично! Но бот без команд, это не бот, так? =)

Приведу пример некоторых: (пишем в цикл while() )
Код:
if ($body =~ /^.*!yandex(.*)$/i) { 
print $socket ("PRIVMSG $chanel Сам ищи, я не лох :-P\r\n"); 
}
if ($body =~ /^.*!bye(.*)$/i) { 
print $socket ("QUIT\r\n"); 
}
Собственно вот он, самый простой бот готов! =)

Основы я вам дал, дальше давайте сами. Прошу сильно не критиковать, ибо только недавно взялся за изучение перл.
С радостью выслушаю вашу критику и замечания.
Ниже приведу весь исходник бота.
Код:
#!/usr/bin/perl
use strict; 
use IO::Socket; 
my $server = "irc.inattack.ru"; 
my $port=6667;
my $chanel = "#inattack";
my $nick = "MIKE"; 
my $ident = "mike";
my $name="Майк";
my $socket = new IO::Socket::INET(PeerAddr => $server, PeerPort => $port, Proto => "tcp") or die "lol";
print $socket "NICK $nick\r\n"; 
print $socket "USER $ident 8 * :$name\r\n"; 
print $socket "JOIN $chanel\r\n"; 
print $socket ("PRIVMSG $chanel : Рад вновь увидеть вас всех!!\r\n"); 
while (my $body = <$socket>) { 
chop $body; 
if ($body =~ /^PING(.*)$/i) { 
print $socket "PONG $1\r\n"; 
} 
if ($body =~ /^.*!yandex(.*)$/i) { 
print $socket ("PRIVMSG $chanel Сам ищи, я не лох :-P\r\n"); 
}
if ($body =~ /^.*!bye(.*)$/i) { 
print $socket ("QUIT\r\n"); 
} 
}
Спасибо за внимание!

Последний раз редактировалось ENFIX; 17.06.2007 в 04:43..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Irc, добро пожаловать на #antichat madnet Авторские статьи 109 17.06.2010 20:45
Настройка бота вида eggdrop MicRO *nix 0 11.12.2006 03:26
Вводный курс по созданию и настройке Irc ботов KPOT_f!nd Чужие Статьи 0 15.10.2006 02:17
Пишем MailBomber на перле foreva Чужие Статьи 3 08.02.2005 07:13



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ