[Python] IRC үшін ботты бағдарламалаңыз

Бүгін мен а бағдарламалауды үйретемін Bot дейін IRC. Біріншіден, білмейтіндер үшін бот - бұл IRC арнасына қосылатын және онымен өзара әрекеттесетін бағдарлама, мысалы бізге арнаны жоқ модерациялауға мүмкіндік береді. біз байланыстырылған осылайша спамнан аулақ болыңыз немесе ол бірқатар тапсырыстарды таниды және сәйкес кодты орындайды.
Боттар дайын болса да, мен шынымен де өз бағдарламаларын оқуды ұнататындардың бірімін және оның жұмыс істегенін көргеннен кейін біз оны қанағаттандырамыз ^^

Осыны айтып, оқулыққа көшейік.

Ботты бағдарламалау үшін бізге а керек болады қарапайым мәтіндік редактор cualquiera (nano, gedit, medit және т.б.) және питон аудармашысы (2.6 немесе 2.7 қажет болады, 3.x python-мен жұмыс істемейді).

Алдымен біз импорттаймыз қажетті модульдер, бұл жағдайда бізге тек екі қажет:

[code] #! / usr / bin / env python
# - * - кодтау: utf-8 - * -

импорттық розетка
импорттық жол
[/ code]

Енді біз жалғастырамыз орнату бот:

[код] HOST = »irc.fromlinux.net»
ПОРТ = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# үй»
readbuffer = »»
[/ code]

Мен әр айнымалыны түсіндіремін:

  • ХОСТ: Біз қосылатын сервердің URL мекен-жайы
  • ПОРТ: Сервер порты. Әдепкі бойынша бұл 6667.
  • NICK, IDENT және REALNAME: Олар боттың лақап атына, оның сәйкестендірілуіне және нақты атына сәйкес келеді.
  • ЧАН: Боттың арнасы кіреді
  • оқу буфері: Бұл айнымалыда сервер жіберген деректер сақталады.

Біздің бот конфигурацияланғаннан кейін біз жалғастырамыз байланыс

[код] 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 («JOIN:% s \ r \ n»% CHAN)
[/ code]

Бірінші жолда көп құпия жоқ, екіншісінде сервер байланысы және соңғы үшеуі жүйеге кіру үшін боттың деректерін серверге жібереді.

Қосылғаннан кейін біз a жасаймыз Шексіз цикл біз оған барамыз / серверден деректерді қабылдау және жіберу:

[код] 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, «\ n»)
readbuffer = temp.pop ()
темп бойынша сызық үшін:
жол = string.rstrip (жол)
line = line.split (CHAN + ':')

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

Жоғарыда жазылған барлық жолдардың ішінде мен тек маңыздыларына түсініктеме беремін.
Con line = line.split (CHAN + ':') біз не істейміз - сервердің бізге жібергенін бөлу арнадан бірдеңе алайық.
Мысалы, келесі жол біреудің арнада бірдеңе жазғанын көрсетеді:

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

Біріншісі - пайдаланушының лақап аты және байланыс деректері (бөлінген!), Пәрмен (бұл жағдайда ол оның жазғанын көрсетеді), арна және соңында қос нүктеден кейін хабарлама жіберіледі. Мен көптеген командаларды түсіндірмеймін, өйткені бұл оқулыққа жатпайды.

Басқа маңызды сызықтар - солар егер кейін болса. Сервер әрдайым пайдаланушының әлі де қосылып тұрғанын тексеру үшін PING пәрменін жібереді. Бұл жағдайда, бот PING жіберген идентификаторы бар PONG пәрменін серверге оның әлі де қосылғанын көрсету үшін жібереді.

Бізде боттың негізі бар. Енді мен боттың IRC-дің өзінен немесе пайдаланушылардан алынған белгілі бір командаларға жауап беруін қалай түсіндіруге болатындығын түсіндіремін.

IRC командаларына жауап беру:

PING және PRIVMSG - IRC командаларының мысалдары. Пәрмендер көп, бірақ бұған дейін айтқанымдай, мен егжей-тегжейлі айтпайтын нәрсе.
Мысалы, біз ботқа қосылатын пайдаланушыларға сәлем жолдай аламыз:

[code] if line [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send («PRIVMSG% s: Welcome @% s ^^ \ n»% (CHAN, аты))
[/ code]

Алдымен біз сервердің пәрмен жіберетінін тексереміз ЖОЛ бұл біреудің серверге қосылғанын көрсетеді. Содан кейін никті шығарамыз, никтің IRC url емес екенін тексереміз (егер біз ботты іске қосқаннан кейін, ол URL мекенжайын қарсы алады) ақырында біз құттықтау хатын жібереміз.

Бот командалары:

Енді мен өзімнің ботымды қалай жасаймын менің командаларыма жауап беріңіз? Мысалға назар аударайық:

[code] if line [1] == '$ нұсқасы':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ code]

Бұл мысалда біреу жазса $ нұсқасы ботта оның аты, нұсқасы және авторы көрсетілген хабарлама көрсетіледі. Мысалдың толық коды:

[код] импорттық розетка
импорттық жол

HOST = »localhost»
ПОРТ = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# үй»
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 («JOIN:% s \ r \ n»% CHAN)

ал 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, «\ n»)
readbuffer = temp.pop ()
темп бойынша сызық үшін:
баспа сызығы
жол = string.rstrip (жол)
line = line.split (CHAN + ':')

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

if line [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send («PRIVMSG% s: Welcome @% s ^^ \ n»% (CHAN, аты))

егер len (жол) <1:
егер [1] == '$ нұсқасы':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ code]

Сізге бұл оқулық ұнады деп үміттенемін, және, әрине, мен сізге ботымның кодына сілтеме қалдырамын, сонда сіз оның кодын толығымен көре аласыз және оның қалай жұмыс істейтінін жақсы көре аласыз. (дегенмен жеке пайдалану үшін кейбір командаларды алып тастадым).

CalicoBot


Мақаланың мазмұны біздің ұстанымдарымызды ұстанады редакторлық этика. Қате туралы хабарлау үшін нұқыңыз Мұнда.

12 пікір, өз пікіріңізді қалдырыңыз

Пікіріңізді қалдырыңыз

Сіздің электрондық пошта мекен-жайы емес жарияланады. Міндетті өрістер таңбаланған *

*

*

  1. Деректерге жауапты: Мигель Анхель Гатан
  2. Деректердің мақсаты: СПАМ-ны басқару, түсініктемелерді басқару.
  3. Заңдылық: Сіздің келісіміңіз
  4. Деректер туралы ақпарат: заңды міндеттемелерді қоспағанда, деректер үшінші тұлғаларға жіберілмейді.
  5. Деректерді сақтау: Occentus Networks (ЕО) орналастырған мәліметтер базасы
  6. Құқықтар: Сіз кез-келген уақытта ақпаратты шектей, қалпына келтіре және жоя аласыз.

  1.   AurosZx дижо

    Хех, мен сенің IRC-де жүрген боттың боттарын жіберіп алмадым 😛 Өте қызықты мақала.

  2.   Сезар дижо

    Өте қарапайым және түсініктеме.
    Егер python кодында барлық шегіністер жоқ болса ше?

  3.   rafa дижо

    Ботты бағдарламалау үшін өте жақсы мақала және IRC-ке қосылу қаншалықты оңай :))

    Бұл MSN немесе MSNGroups-та чаттарда mIRC сценарийлерін жазатын бағдарламашылар сияқты сезінетін кездерді еске түсіреді.

  4.   22 дижо

    Қызықты оны сақтаймын 😀

  5.   Генезис Варгас Дж. (@elprincipiodeto) дижо

    excelente !!

  6.   Элинкс дижо

    Өте пайдалы, рахмет Son_Link!

    Рахмет!

  7.   дбилликс дижо

    Алақай ...

    сіздің жолдарыңызды ұстану және жұмыс істейтін жалғыз нәрсе - бұл сынақ
    импорттық розетка
    импорттық жол

    HOST = »localhost»
    ПОРТ = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# үй»
    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 («JOIN:% srn»% CHAN)

    Арнаны және никті ауыстыру, төменде келтірілгендер қателік синтаксисін жібереді

    Мен басқа таныстардан сұрадым, олар маған питонға ұқсамайтынын айтты

    Мен не істеп жатқанымды білмеймін, не үшін бәрін көшіріп, питонға қойып, оны енгізіп, каналға қосылатынымды білмеймін, бірақ 250 секундтан кейін канал оны алып тастайды, өйткені жауап жоқ.

  8.   пинфри дижо

    Толық код мен үшін жұмыс істемейді, соңғы абзац сәтсіздікке ұшырайды және мен қатені таба алмаймын. Егер мен сол бөлімді жойсам, ол керемет қосылып, жұмыс істейді. Windows 2.7.3 жүйесінде Python 7 нұсқасымен тексерілген.

    PS: Менің жағдайда серверге парольмен қосылып, келесі жолдарды қосамын:
    PASS = »Passdelbot»
    s.send («PASS% s \ r \ n»% PASS)

  9.   DoLpHiN дижо

    Сәлем Сон Линк, мақала үшін көп рахмет, өте қызықты, мен жіберілген командаларға жауап бере алмаймын. Бағдарлама егер соңғысына кірмейді, мен неге екенін анықтай алмаймын: «if len (line)> 1:»
    Мен сіздің жауабыңызды күтемін.
    Gracias