[Python] Zaprogramuj bota dla IRC

Dzisiaj nauczę Cię, jak zaprogramować pysk dla IRC. Przede wszystkim dla tych, którzy nie wiedzą, bot to program, który łączy się z kanałem IRC i wchodzi z nim w interakcję, co pozwala nam np. moderować kanał bez że jesteśmy połączeni i w ten sposób uniknąć spamu, lub aby rozpoznał serię zamówień i wykonał odpowiedni kod.
Chociaż są gotowe boty, szczerze mówiąc należę do tych, którzy lubią tworzyć własne programy do nauki i ogromną satysfakcję, jaką daje nam to po zobaczeniu, że to działa ^^

Powiedziawszy to, przejdźmy do samouczka.

Do zaprogramowania bota będziemy potrzebować zwykły edytor tekstu Cualquiera (nano, gedit, medit itp.) i interpreter Pythona (2.6 lub 2.7 będzie konieczne, nie działa z pythonem 3.x).

Najpierw importujemy wymagane moduły, w tym przypadku będziemy potrzebować tylko dwóch:

[kod] #!/usr/bin/env python
# - * - kodowanie: utf-8 - * -

gniazdo importu
ciąg importu
[/ Code]

Teraz przechodzimy do skonfigurować bot:

[kod] HOST=»irc.desdelinux.internet"
PORT = 6667
NICK="CalicoBot"
IDENT="CalicoBot"
REALNAME=”CalicoBot”
CHAN="#Dom"
bufor odczytu=””
[/ Code]

Wyjaśnię każdą zmienną:

  • HOST: Adres URL serwera, z którym się połączymy
  • PORT: Port serwera. Domyślnie jest to 6667.
  • NICK, IDENT i REALNAME: Odpowiadają one nickowi bota, jego identyfikacji oraz prawdziwemu imieniu.
  • KANAŁ: Kanał, na który bot wejdzie
  • bufor odczytu: Dane przesłane przez serwer będą przechowywane w tej zmiennej.

Po skonfigurowaniu naszego bota przechodzimy do połączenie

[kod] s=gniazdo.gniazdo( )
s.connect((HOST, PORT))
s.send("NICK %s\r\n" %NICK)
s.send("UŻYTKOWNIK %s %s blah :%s\r\n" % (IDENT, HOST, REALNAME))
s.send("DOŁĄCZ :%s\r\n" %CHAN)
[/ Code]

Pierwsza linijka nie ma w sobie większej tajemnicy, druga tworzy połączenie z serwerem a ostatnie trzy wysyłają dane bota na serwer, aby kontynuować logowanie.

Po połączeniu utworzymy plik Nieskończona pętla w którym pójdziemy odbieranie i wysyłanie danych z/do serwera:

[kod] podczas gdy 1:
bufor odczytu=bufor odczytu+s.recv(1024)
temp=string.split(bufor odczytu, "\n")
bufor odczytu=temp.pop( )
dla linii w temp:
linia=string.rstrip(linia)
linia=linia.podział(KANAŁ + ':')

if line[0].find("PING") != -1:
pingid = line[0].split()[1] s.send("PONG %s\r\n" % pingid)
[/ Code]

Ze wszystkich linijek napisanych powyżej skomentuję tylko te ważne.
z linia=linia.split(KANAŁ + ':') dzielimy to, co serwer wysyła nam kiedy weźmy coś z kanału.
Na przykład następujący wiersz wskazuje, że ktoś napisał coś na kanale:

:[email protected] PRIVMSG #Home :Hola ^^

Pierwszą rzeczą jest nick użytkownika i dane połączenia (oddzielone ! ), polecenie (w tym przypadku wskazuje, co napisał), kanał i wreszcie, po dwukropku, wysłana wiadomość. Nie będę wyjaśniać wielu innych poleceń, ponieważ nie pasuje to do tego samouczka.

Inne ważne linie to te, które oni są po jeśli. Serwer od czasu do czasu wysyła polecenie PING, aby sprawdzić, czy użytkownik jest nadal połączony. W takim przypadku bot wysyła polecenie PONG z identyfikatorem wysłanym przez PING, aby wskazać serwerowi, że nadal jest połączony.

Dzięki temu mamy już bazę bota. Teraz przejdę do wyjaśnienia, jak sprawić, by bot reagował tak, jak chcemy, na określone polecenia, czy to z samego IRC, czy od użytkowników.

Odpowiadanie na polecenia IRC:

PING i PRIVMSG to przykłady poleceń IRC. Istnieje wiele poleceń, ale jak powiedziałem wcześniej, jest to coś, o czym nie będę wchodził w szczegóły.
Na przykład możemy sprawić, by bot witał użytkowników, którzy się łączą:

[kod] jeśli linia [0].find('JOIN') != -1:
nazwa = linia[0].split('!')[0].split(':')[1] if nazwa != NICK i nazwa.find(HOST) == -1:
s.send("PRIVMSG %s:Witamy@ %s ^^\n" % (KANAŁ, imię))
[/ Code]

Najpierw sprawdzamy, czy serwer wysyła polecenie DOŁĄCZ wskazując, że ktoś połączył się z serwerem. Następnie wyodrębniamy nick, sprawdzamy, czy nick nie jest adresem URL IRC (Jeśli nie, jak tylko uruchomimy bota, powita on adres URL) i na koniec wysyłamy wiadomość powitalną.

Komendy bota:

Jak teraz zrobić mojego bota reagować na moje własne polecenia? Lepiej spójrzmy na przykład:

[kod] if wiersz[1] == '$wersja':
s.send("PRIVMSG %s:CalicoBot 0.1.2 (c) 2012 Son Link\n" % CHAN)
[/ Code]

W tym przykładzie, jeśli ktoś pisze $wersja bot wyświetli komunikat wskazujący jego nazwę, wersję i autora. Pełny kod przykładu jest następujący:

[kod] gniazdo importu
ciąg importu

HOST="host lokalny"
PORT = 6667
NICK="CalicoBot"
IDENT="CalicoBot"
REALNAME=”CalicoBot”
CHAN="#Dom"
bufor odczytu=””
s=gniazdo.gniazdo( )
s.connect((HOST, PORT))
s.send("NICK %s\r\n" %NICK)
s.send("UŻYTKOWNIK %s %s blah :%s\r\n" % (IDENT, HOST, REALNAME))
s.send("DOŁĄCZ :%s\r\n" %CHAN)

podczas gdy 1:

bufor odczytu=bufor odczytu+s.recv(1024)
temp=string.split(bufor odczytu, "\n")
bufor odczytu=temp.pop( )
dla linii w temp:
linia drukarska
linia=string.rstrip(linia)
linia=linia.podział(KANAŁ + ':')

if line[0].find("PING") != -1:
pingid = line[0].split()[1] s.send("PONG %s\r\n" % pingid)

if line[0].find('JOIN') != -1:
nazwa = linia[0].split('!')[0].split(':')[1] if nazwa != NICK i nazwa.find(HOST) == -1:
s.send("PRIVMSG %s:Witamy@ %s ^^\n" % (KANAŁ, imię))

jeśli długość(linia) < 1:
if wiersz [1] == '$ wersja':
s.send("PRIVMSG %s:CalicoBot 0.1.2 (c) 2012 Son Link\n" % CHAN)
[/ Code]

Mam nadzieję, że spodobał Ci się ten poradnik i oczywiście zostawiam Ci link do kodu mojego bota, abyś mógł zobaczyć jego pełny kod i lepiej zobaczyć, jak to działa (chociaż usunąłem niektóre polecenia do użytku osobistego).

CalicoBot