[Python] Програмуйте бота для IRC

Сьогодні я навчу вас, як програмувати морда пункт IRC. Перш за все, для тих, хто не знає, бот - це програма, яка підключається до IRC-каналу та взаємодіє з ним, що дозволяє нам, наприклад, модерувати канал без що ми пов'язані і таким чином уникати спаму, або що він розпізнає серію замовлень і виконує відповідний код.
Хоча вже є готові боти, я, чесно кажучи, один із тих, хто любить створювати власні програми для навчання, і велике задоволення, яке воно нам доставляє, побачивши, що це працює ^^

З урахуванням цього, перейдемо до навчального посібника.

Для програмування бота нам знадобиться a редактор простого тексту будь-який (nano, gedit, medit тощо) у-ель- інтерпретатор python (Знадобиться 2.6 або 2.7, не працює з python 3.x).

Спочатку ми імпортуємо необхідні модулі, у цьому випадку нам знадобляться лише два:

[код] #! / usr / bin / env python
# - * - кодування: utf-8 - * -

імпорт сокет
рядок імпорту
[/ Code]

Тепер приступаємо до configurar бот:

[код] HOST=»irc.desdelinux.net»
ПОРТ = 6667
NICK = »CalicoBot»
ІДЕНТ = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Головна»
readbuffer = »»
[/ Code]

Я поясню кожну змінну:

  • ВЕДУЧИЙ: URL-адреса сервера, до якого ми будемо підключатися
  • ПОРТ: Порт сервера. За замовчуванням це 6667.
  • НІК, ІДЕНТИКА І ІМЕ: Вони відповідають прізвисько бота, його ідентифікації та справжньому імені.
  • ЧАН: Канал, на який увійде бот
  • буфер читання: У цій змінній будуть збережені дані, надіслані сервером.

Після налаштування нашого бота ми переходимо до з'єднання

[код] s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("КОРИСТУВАЧ% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("ПРИЄДНАЙТЕСЬ:% s \ r \ n"% CHAN)
[/ Code]

Перший рядок не має великої таємниці, другий створює підключення до сервера а останні три надсилають дані бота на сервер для продовження входу.

Після підключення ми створимо a Нескінченна петля в яку ми підемо отримання та надсилання даних з / на сервер:

[код] при 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (буфер, "\ n")
readbuffer = temp.pop ()
для рядка в temp:
рядок = рядок.rstrip (рядок)
line = line.split (CHAN + ':')

якщо рядок [0] .find ("PING")! = -1:
pingid = рядок [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Code]

З усіх рядків, написаних вище, я прокоментую лише важливі.
з line = line.split (CHAN + ':') ми ділимося тим, що коли нам надсилає сервер давайте щось з каналу.
Наприклад, наступний рядок вказує, що хтось щось писав на каналі:

:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^

Перший - це псевдонім користувача та дані з’єднання (розділені знаком!), Команда (у цьому випадку це вказує, що він писав), канал і, нарешті, після двокрапки - надіслане повідомлення. Я не буду пояснювати багато інших команд, оскільки це не підпадає під цей посібник.

Інші важливі рядки - це ті вони після if. Сервер так часто надсилає команду PING, щоб перевірити, чи користувач все ще підключений. У цьому випадку бот надсилає команду PONG з ідентифікатором, який PING надіслав, щоб вказати серверу, що він все ще підключений.

З цим ми вже маємо базу бота. Тепер я продовжу пояснювати, як змусити бота відповідати відповідно до того, що ми хочемо для певних команд, незалежно від того, чи вони від самого IRC, чи від користувачів.

Відповідь на команди IRC:

PING та PRIVMSG - приклади команд IRC. Є багато команд, але, як я вже говорив раніше, це те, про що я не буду вдаватися в подробиці.
Наприклад, ми можемо змусити бота привітати користувачів, які підключаються:

[код], якщо рядок [0] .find ('JOIN')! = -1:
name = рядок [0] .split ('!') [0] .split (':') [1], якщо name! = NICK та name.find (HOST) == -1:
s.send ("PRIVMSG% s: Ласкаво просимо @% s ^^ \ n"% (CHAN, ім'я))
[/ Code]

Спочатку ми перевіряємо, чи надсилає сервер команду РЕЄСТРАЦІЯ що вказує на те, що хтось підключався до сервера. Потім ми витягаємо нік, ми перевіряємо, що нік не є URL-адресою IRC (якщо не як тільки ми запустимо бота, він привітає url) і нарешті ми відправляємо привітальне повідомлення.

Команди бота:

Тепер як я можу зробити свого бота відповідати на мої власні команди? Давайте краще розглянемо приклад:

[код] якщо рядок [1] ​​== '$ версія':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

У цьому прикладі, якщо хтось пише $ версія бот покаже повідомлення із зазначенням його імені, версії та автора. Повний код прикладу такий:

[код] сокет імпорту
рядок імпорту

ВЕДУЧИЙ = »localhost»
ПОРТ = 6667
NICK = »CalicoBot»
ІДЕНТ = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Головна»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("КОРИСТУВАЧ% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("ПРИЄДНАЙТЕСЬ:% s \ r \ n"% CHAN)

в той час як 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (буфер, "\ n")
readbuffer = temp.pop ()
для рядка в temp:
рядок для друку
рядок = рядок.rstrip (рядок)
line = line.split (CHAN + ':')

якщо рядок [0] .find ("PING")! = -1:
pingid = рядок [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

якщо рядок [0] .find ('JOIN')! = -1:
name = рядок [0] .split ('!') [0] .split (':') [1], якщо name! = NICK та name.find (HOST) == -1:
s.send ("PRIVMSG% s: Ласкаво просимо @% s ^^ \ n"% (CHAN, ім'я))

якщо len (рядок) <1:
якщо рядок [1] ​​== '$ версія':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

Сподіваюся, вам підручник сподобався, і, звичайно, я залишаю вам посилання на код мого бота, щоб ви могли бачити його код повністю і краще бачити, як він працює (хоча я видалив деякі команди для особистого користування).

CalicoBot