[Python] Program bot untuk IRC

Hari ini saya akan mengajari Anda cara memprogram a bot ayat IRC. Pertama-tama, bagi mereka yang tidak tahu, bot adalah program yang menghubungkan ke saluran IRC dan berinteraksi dengannya, yang memungkinkan kita, misalnya, untuk memoderasi saluran tanpa bahwa kita terhubung dan dengan demikian menghindari spam, atau yang mengenali serangkaian pesanan dan mengeksekusi kode yang sesuai.
Meskipun sudah ada bot yang siap, sejujurnya saya adalah salah satu dari mereka yang suka membuat program mereka sendiri untuk dipelajari dan kami sangat puas setelah melihatnya berhasil ^^

Karena itu, mari kita lanjutkan ke tutorial.

Untuk memprogram bot kita membutuhkan file editor teks biasa cualquiera (nano, gedit, medit, dll) dan penerjemah python (2.6 atau 2.7 akan diperlukan, tidak bekerja dengan python 3.x).

Pertama kita mengimpor file modul yang dibutuhkan, dalam hal ini kita hanya membutuhkan dua:

[kode] #! / usr / bin / env python
# - * - pengkodean: utf-8 - * -

soket impor
impor string
[/ kode]

Sekarang kita lanjutkan ke configurar bot:

[kode] HOST=»irc.desdelinux.bersih"
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Beranda»
readbuffer = »»
[/ kode]

Saya akan menjelaskan setiap variabel:

  • HOST: URL server yang akan kami hubungkan
  • PELABUHAN: Port server. Secara default adalah 6667.
  • NICK, IDENT dan REALNAME: Mereka sesuai dengan nama panggilan bot, identifikasi dan nama aslinya.
  • CHAN: Saluran yang akan dimasuki bot
  • penyangga baca: Dalam variabel ini data yang dikirim oleh server akan disimpan.

Setelah bot kami dikonfigurasi, kami melanjutkan ke koneksi

[kode] s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("GABUNG:% s \ r \ n"% CHAN)
[/ kode]

Baris pertama tidak memiliki banyak misteri, baris kedua menciptakan koneksi server dan tiga yang terakhir mengirim data bot ke server untuk melanjutkan proses masuk.

Setelah terhubung kita akan membuat file Lingkaran tak terbatas kemana kita akan pergi menerima dan mengirim data dari / ke server:

[kode] sementara 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
untuk baris dalam suhu:
line = string.rstrip (baris)
line = line.split (CHAN + ':')

jika baris [0]. temukan ("PING")! = -1:
pingid = baris [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ kode]

Dari semua baris yang tertulis di atas, saya hanya akan mengomentari yang penting.
dengan line = line.split (CHAN + ':') yang kami lakukan adalah membagi apa yang dikirim server kepada kami mari kita dapatkan sesuatu dari saluran.
Misalnya baris berikut menunjukkan bahwa seseorang menulis sesuatu di saluran:

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

Yang pertama adalah nama panggilan pengguna dan data koneksi (dipisahkan oleh!), Perintah (dalam hal ini menunjukkan bahwa dia menulis), saluran dan terakhir, setelah titik dua, pesan dikirim. Saya tidak akan menjelaskan lebih banyak perintah karena itu tidak termasuk dalam tutorial ini.

Garis penting lainnya adalah garisnya adalah setelah jika. Server sering kali mengirimkan perintah PING untuk memeriksa apakah pengguna masih terhubung. Dalam hal ini, bot mengirimkan perintah PONG dengan ID yang dikirim PING untuk menunjukkan ke server bahwa ia masih terhubung.

Dengan ini kita sudah memiliki basis bot. Sekarang saya akan melanjutkan untuk menjelaskan bagaimana membuat bot merespon sesuai dengan apa yang kita inginkan untuk perintah tertentu, apakah itu dari IRC itu sendiri atau dari pengguna.

Menanggapi perintah IRC:

PING dan PRIVMSG adalah contoh perintah IRC. Ada banyak perintah, tetapi seperti yang saya katakan sebelumnya, itu adalah sesuatu yang tidak akan saya bahas secara detail.
Misalnya, kita dapat membuat bot menyapa pengguna yang terhubung:

[kode] jika baris [0]. temukan ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK dan name.find (HOST) == -1:
s.send ("PRIVMSG% s: Selamat datang @% s ^^ \ n"% (CHAN, nama))
[/ kode]

Pertama kami memeriksa apakah server mengirimkan perintah BERGABUNG yang menunjukkan bahwa seseorang terhubung ke server. Kemudian kita ekstrak nick tersebut, kita periksa bahwa nick tersebut bukan url IRC (jika tidak segera setelah kita menjalankan bot itu akan menyapa url) dan akhirnya kami mengirimkan pesan salam.

Perintah bot:

Sekarang bagaimana cara membuat bot saya menanggapi perintah saya sendiri? Mari kita lihat contoh dengan lebih baik:

[kode] jika baris [1] == '$ versi':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kode]

Dalam contoh ini jika seseorang menulis $ versi bot akan menampilkan pesan yang menunjukkan nama, versi, dan pembuatnya. Kode lengkap dari contohnya adalah ini:

[kode] soket impor
impor string

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Beranda»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("GABUNG:% s \ r \ n"% CHAN)

sedangkan 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
untuk baris dalam suhu:
garis cetak
line = string.rstrip (baris)
line = line.split (CHAN + ':')

jika baris [0]. temukan ("PING")! = -1:
pingid = baris [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

jika baris [0]. temukan ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK dan name.find (HOST) == -1:
s.send ("PRIVMSG% s: Selamat datang @% s ^^ \ n"% (CHAN, nama))

jika len (baris) <1:
jika baris [1] == '$ versi':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kode]

Saya harap Anda menyukai tutorial ini, dan tentu saja, saya meninggalkan Anda tautan ke kode bot saya sehingga Anda dapat melihat kodenya secara lengkap dan Anda dapat melihat lebih baik cara kerjanya. (meskipun saya telah menghapus beberapa perintah untuk penggunaan pribadi).

CalicoBot


tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   auroszx dijo

    Heh, saya tidak bisa melewatkan Bot omong kosong yang Anda tumpangi di IRC 😛 Artikel yang sangat menarik.

  2.   Berhenti dijo

    Penjelasan yang sangat sederhana dan jelas.
    Bagaimana jika, kode python kehilangan semua indentasi.

  3.   rafa dijo

    Artikel yang sangat bagus dan betapa mudahnya menyambung ke IRC untuk memprogram bot :)…

    Ini mengingatkan saya pada saat-saat ketika kami merasa seperti programmer menulis skrip untuk mIRC dalam obrolan di MSN atau MSNGroups.

  4.   truko22 dijo

    Menarik, saya menyimpannya 😀

  5.   Genesis Vargas J. (@elprincipodeto) dijo

    sangat baik!

  6.   elynx dijo

    Sangat berguna, terima kasih Son_Link!

    Salam!

  7.   dbillyx.dll dijo

    Bersulang…

    mengikuti garis Anda dan menguji satu-satunya hal yang berhasil adalah
    soket impor
    impor string

    HOST = »localhost»
    PORT = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Beranda»
    readbuffer = »»
    s = socket.socket ()
    s.connect ((HOST, PORT))
    s.send ("NICK% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("GABUNG:% srn"% CHAN)

    mengubah saluran dan nick sekarang di bawah ini membuat saya kesalahan sintaks

    Saya bertanya kepada kenalan lain dan mereka memberi tahu saya bahwa itu tidak terlihat seperti python

    Saya tidak tahu apa yang saya lakukan salah atau mengapa saya menyalin semuanya dan menempelkannya ke python dan memberikannya masuk dan terhubung ke saluran tetapi setelah 250 detik saluran menghapusnya karena tidak ada tanggapan dari pong ...

  8.   pinfri dijo

    Kode lengkap tidak berfungsi untuk saya, paragraf terakhir adalah yang gagal dan saya tidak dapat menemukan kesalahan. Jika saya menghapus bagian itu, itu menghubungkan dan bekerja dengan sempurna. Diuji dengan Python 2.7.3 pada Windows 7.

    PS: Dalam kasus saya, saya terhubung ke server dengan kata sandi dan menambahkan baris ini:
    LULUS = »Passdelbot»
    s.send ("LULUS% s \ r \ n"% PASS)

  9.   LakukanLpHiN dijo

    Hai Son Link, terima kasih banyak untuk artikelnya, sangat menarik, saya tidak bisa menanggapi perintah yang dikirim. Program tidak akan masuk ke if dan saya tidak tahu alasannya: "if len (line)> 1:"
    Saya menunggu jawaban Anda.
    terima kasih