[Python] Програмиране на бот за IRC

Днес ще ви науча как да програмирате a бот за IRC. На първо място, за тези, които не знаят, ботът е програма, която се свързва с IRC канал и взаимодейства с него, което ни позволява например да модерираме канала без че сме свързани и по този начин се избягва спам или че той разпознава поредица от поръчки и изпълнява съответния код.
Въпреки че вече има готови ботове, честно казано съм от онези, които обичат да създават свои програми за учене и голямото удовлетворение, което ни доставя, след като видя, че работи ^^

С това казано, нека преминем към урока.

За да програмираме бота, ще ни трябва a редактор на обикновен текст cualquiera (nano, gedit, medit и т.н.) и интерпретатор на python (Ще са необходими 2.6 или 2.7, не работи с python 3.x).

Първо импортираме необходими модули, в този случай ще ни трябват само две:

[код] #! / usr / bin / env python
# - * - кодиране: utf-8 - * -

внос сокет
низ за импортиране
[/ Код]

Сега пристъпваме към настройвам ботът:

[код] HOST=»irc.desdelinux.net»
ПОРТ = 6667
NICK = »CalicoBot»
ИДЕНТ = »CalicoBot»
ИМЕ ИМЕ = »CalicoBot»
CHAN = »# Начало»
readbuffer = »»
[/ Код]

Ще обясня всяка променлива:

  • Водещ: URL адресът на сървъра, към който ще се свържем
  • ПРИСТАНИЩЕ: Портът на сървъра. По подразбиране е 6667.
  • NICK, IDENT и REALNAME: Те съответстват на прякора на бота, неговата идентификация и истинското име.
  • ЧАН: Каналът, в който ще влезе ботът
  • буфер за четене: В тази променлива данните, изпратени от сървъра, ще бъдат запазени.

След като нашият бот е конфигуриран, ние пристъпваме към връзката

[код] 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)
[/ Код]

Първият ред няма много загадка, а вторият създава сървърна връзка и последните три изпращат данните на бота на сървъра, за да продължат с влизането.

След като се свържем, ще създадем a Безкраен цикъл в която ще отидем получаване и изпращане на данни от / към сървъра:

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

ако ред [0] .намерете ("PING")! = -1:
pingid = линия [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Код]

От всички редове, написани по-горе, ще коментирам само важните.
Con line = line.split (CHAN + ':') това, което правим, е да разделим какво ни изпраща сървърът кога нека вземем нещо от канала.
Например следният ред показва, че някой е написал нещо в канала:

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

Първият е псевдонимът на потребителя и данните за връзката (разделени с!), Командата (в този случай това показва, че той е писал), каналът и накрая, след двоеточието, съобщението е изпратено. Няма да обяснявам много повече команди, тъй като това не попада в този урок.

Другите важни линии са тези те са след ако. Сървърът от време на време изпраща командата PING, за да провери дали потребителят все още е свързан. В този случай ботът изпраща командата PONG с идентификатор, който PING изпраща, за да покаже на сървъра, че все още е свързан.

С това вече имаме основата на бота. Сега ще продължа да обяснявам как да накараме бота да реагира според това, което искаме на определени команди, независимо дали са от самия IRC или от потребители.

Отговаряне на IRC команди:

PING и PRIVMSG са примери за IRC команди. Има много команди, но както казах преди, това е нещо, за което няма да навлизам в подробности.
Например можем да накараме бота да поздрави потребителите, които се свързват:

[код] ако ред [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK и name.find (HOST) == -1:
s.send ("PRIVMSG% s: Добре дошли @% s ^^ \ n"% (CHAN, име))
[/ Код]

Първо проверяваме дали сървърът изпраща командата ПРИСЪЕДИНЕТЕ СЕ КЪМ което показва, че някой е свързан със сървъра. След това извличаме псевдонима, проверяваме дали псевдонимът не е IRC URL адресът (ако не веднага след като стартираме бота, той ще поздрави URL адреса) и накрая изпращаме поздравителното съобщение.

Бот команди:

Сега как да направя моя бот отговарям на моите собствени команди? Нека по-добре разгледаме един пример:

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

В този пример, ако някой пише $ версия ботът ще покаже съобщението, посочващо името му, версията и автора. Пълният код на примера е следният:

[код] сокет за импортиране
низ за импортиране

HOST = »localhost»
ПОРТ = 6667
NICK = »CalicoBot»
ИДЕНТ = »CalicoBot»
ИМЕ ИМЕ = »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 (readbuffer, "\ n")
readbuffer = temp.pop ()
за ред в темп:
линия за печат
линия = низ.rstrip (линия)
line = line.split (CHAN + ':')

ако ред [0] .намерете ("PING")! = -1:
pingid = линия [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

ако ред [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if 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)
[/ Код]

Надявам се този урок да ви е харесал и разбира се, оставям ви връзката към кода на моя бот, за да можете да видите неговия код в пълен размер и да видите по-добре как работи (въпреки че съм премахнал някои команди за лична употреба).

CalicoBot