[Python] Program bot untuk IRC

Hari ini saya akan mengajar anda cara memprogram a bot perenggan IRC. Pertama sekali, bagi mereka yang tidak tahu, bot adalah program yang menghubungkan ke saluran IRC dan berinteraksi dengannya, yang membolehkan kita, misalnya, untuk menyederhanakan saluran tanpa bahawa kita berhubung dan dengan itu mengelakkan spam, atau bahawa ia mengenali serangkaian pesanan dan melaksanakan kod yang sesuai.
Walaupun sudah ada bot yang siap dibina, saya sejujurnya adalah salah seorang yang suka membuat program mereka sendiri untuk belajar dan kepuasan yang sangat besar yang diberikan kepada kami setelah melihatnya berfungsi ^^

Dengan itu, mari kita beralih ke tutorial.

Untuk memprogram bot, kami memerlukan penyunting teks biasa cualquiera (nano, gedit, medit, dll) dan jurubahasa python (2.6 atau 2.7 akan diperlukan, tidak berfungsi dengan python 3.x).

Pertama kita mengimport modul yang diperlukan, dalam kes ini kita hanya memerlukan dua:

[code] #! / usr / bin / env python
# - * - pengekodan: utf-8 - * -

soket import
rentetan import
[/kod]

Sekarang kita teruskan ke mengkonfigurasi bot:

[code] HOST=»irc.desdelinux.net»
PELABUHAN = 6667
NICK = »CalicoBot»
IDEN = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Rumah»
readbuffer = »»
[/kod]

Saya akan menerangkan setiap pemboleh ubah:

  • HOST: URL pelayan yang akan kami sambungkan
  • PELABUHAN: Port pelayan. Secara lalai adalah 6667.
  • NICK, IDENT dan REALNAME: Mereka sesuai dengan nama panggilan bot, pengenalannya dan nama sebenarnya.
  • CHAN: Saluran bot akan masuk
  • pembaca baca: Dalam pemboleh ubah ini data yang dihantar oleh pelayan akan disimpan.

Setelah bot kami dikonfigurasi, kami terus ke sambungan itu

[code] s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("PENGGUNA% s% s bla:% s \ r \ n"% (IDEN, HOST, REALNAME))
s.send ("SERTAI:% s \ r \ n"% CHAN)
[/kod]

Baris pertama tidak mempunyai banyak misteri, yang kedua mencipta sambungan pelayan dan tiga yang terakhir menghantar data bot ke pelayan untuk meneruskan proses masuk.

Setelah disambungkan kita akan membuat a Gelung tak terhingga di mana kita akan pergi menerima dan menghantar data dari / ke pelayan:

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

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

Dari semua baris yang ditulis di atas, saya hanya akan mengulas yang penting.
dengan line = line.split (CHAN + ':') apa yang kita lakukan ialah membahagikan masa pelayan menghantar kita mari dapatkan sesuatu dari saluran.
Contohnya baris berikut menunjukkan bahawa seseorang menulis sesuatu di saluran:

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

Yang pertama adalah nama panggilan dan data sambungan pengguna (dipisahkan oleh!), Perintah (dalam hal ini menunjukkan bahawa dia menulis), saluran dan akhirnya, setelah titik dua, mesej dihantar. Saya tidak akan menerangkan banyak lagi arahan kerana itu tidak termasuk dalam tutorial ini.

Garis penting yang lain adalah yang lain mereka mengejar jika. Pelayan selalu menghantar arahan PING untuk memeriksa sama ada pengguna masih berhubung. Dalam kes itu, bot mengirimkan perintah PONG dengan ID yang PING hantar untuk menunjukkan kepada pelayan bahawa ia masih disambungkan.

Dengan ini kita sudah mempunyai dasar bot. Sekarang saya akan terus menerangkan bagaimana membuat bot bertindak balas sesuai dengan apa yang kita inginkan pada perintah tertentu, sama ada dari IRC itu sendiri atau dari pengguna.

Membalas arahan IRC:

PING dan PRIVMSG adalah contoh arahan IRC. Terdapat banyak arahan, tetapi seperti yang saya katakan sebelumnya, ia adalah sesuatu yang tidak akan saya sampaikan secara terperinci.
Sebagai contoh, kami dapat membuat bot menyapa pengguna yang berhubung:

[code] if line [0]. cari ('BERGABUNG')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] jika nama! = NICK dan name.find (HOST) == -1:
s.send ("PRIVMSG% s: Welcome @% s ^^ \ n"% (CHAN, nama))
[/kod]

Mula-mula kita periksa sama ada pelayan menghantar arahan JOIN yang menunjukkan bahawa seseorang yang terhubung ke pelayan. Kemudian kami mengekstrak nama samaran, kami memeriksa bahawa nama samaran tersebut bukan url IRC (jika tidak begitu kami menjalankan bot itu akan menyapa url) dan akhirnya kami menghantar mesej ucapan.

Perintah bot:

Sekarang bagaimana saya membuat bot saya menyahut arahan saya sendiri? Mari kita lihat contohnya:

[code] if line [1] == 'versi $':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) Pautan Anak 2012 \ n»% CHAN)
[/kod]

Dalam contoh ini jika seseorang menulis versi $ bot akan menunjukkan mesej yang menunjukkan nama, versi dan pengarangnya. Kod lengkap contohnya ialah:

[kod] soket import
rentetan import

HOST = »localhost»
PELABUHAN = 6667
NICK = »CalicoBot»
IDEN = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Rumah»
readbuffer = »»
s = soket. soket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("PENGGUNA% s% s bla:% s \ r \ n"% (IDEN, HOST, REALNAME))
s.send ("SERTAI:% s \ r \ n"% CHAN)

sementara 1:

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

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

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

jika len (garis) <1:
jika baris [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) Pautan Anak 2012 \ n»% CHAN)
[/kod]

Saya harap anda menyukai tutorial ini, dan tentu saja, saya meninggalkan pautan ke kod bot saya supaya anda dapat melihat kodnya dengan lengkap dan anda dapat melihat cara kerjanya dengan lebih baik (walaupun saya telah membuang beberapa arahan untuk kegunaan peribadi).

CalicoBot


Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   auroszx kata

    Heh, saya tidak boleh ketinggalan Bot omong kosong yang anda naiki di IRC article Artikel yang sangat menarik.

  2.   Terhenti kata

    Penjelasan yang sangat mudah dan jelas.
    Bagaimana jika, kod python kehilangan semua lekukan.

  3.   rafa kata

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

    Ini mengingatkan saya pada masa-masa ketika kita merasa seperti pengaturcara menulis skrip untuk mIRC dalam sembang di MSN atau MSNGroups.

  4.   Truko22 kata

    Menarik saya menyimpannya 😀

  5.   Genesis Vargas J. (@elprincipiodeto) kata

    excellent!

  6.   elynx kata

    Sangat berguna, terima kasih Son_Link!

    Salam!

  7.   dbillyx kata

    Sorakan…

    mengikuti garis panduan anda dan menguji satu-satunya perkara yang berkesan adalah
    soket import
    rentetan import

    HOST = »localhost»
    PELABUHAN = 6667
    NICK = »CalicoBot»
    IDEN = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Rumah»
    readbuffer = »»
    s = soket. soket ()
    s.connect ((HOST, PORT))
    s.send ("NICK% srn"% NICK)
    s.send ("PENGGUNA% s% s bla:% srn"% (IDEN, HOST, REALNAME))
    s.send ("SERTAI:% srn"% CHAN)

    menukar saluran dan nama samaran di bawah ini melontarkan saya sintaks ralat

    Saya bertanya kepada kenalan lain dan mereka memberitahu saya bahawa itu tidak kelihatan seperti ular sawa

    Saya tidak tahu apa yang saya buat salah atau mengapa saya menyalin semuanya dan menampalnya ke python dan memberikannya masuk dan ia menyambung ke saluran tetapi selepas 250 saat saluran itu menghapusnya kerana tidak ada tindak balas dari pong ...

  8.   pinfry kata

    Kod yang lengkap tidak berfungsi untuk saya, perenggan terakhir adalah yang gagal dan saya tidak dapat menemui ralat. Sekiranya saya memadamkan bahagian itu, ia bersambung dan berfungsi dengan sempurna. Diuji dengan Python 2.7.3 pada Windows 7.

    PS: Dalam kes saya, saya menyambung ke pelayan dengan kata laluan dan menambah baris berikut:
    LULUS = »Passdelbot»
    s.send ("LULUS% s \ r \ n"% LULUS)

  9.   DoLpHiN kata

    Hai Son Link, terima kasih banyak untuk artikel ini, sangat menarik, saya tidak dapat menjawab arahan yang dihantar. Program tidak masuk ke yang terakhir jika dan saya tidak dapat mengetahui mengapa: "if len (line)> 1:"
    Saya tunggu jawapan anda.
    Terima kasih