Сьогодні я навчу вас, як програмувати морда пункт IRC. Перш за все, для тих, хто не знає, бот - це програма, яка підключається до IRC-каналу та взаємодіє з ним, що дозволяє нам, наприклад, модерувати канал без що ми пов'язані і таким чином уникати спаму, або що він розпізнає серію замовлень і виконує відповідний код.
Хоча вже є готові боти, я, чесно кажучи, один із тих, хто любить створювати власні програми для навчання, і велике задоволення, яке воно нам доставляє, побачивши, що це працює ^^
З урахуванням цього, перейдемо до навчального посібника.
Для програмування бота нам знадобиться a редактор простого тексту будь-який (nano, gedit, medit тощо) у-ель- інтерпретатор python (Знадобиться 2.6 або 2.7, не працює з python 3.x).
Спочатку ми імпортуємо необхідні модулі, у цьому випадку нам знадобляться лише два:
[код] #! / usr / bin / env python# - * - кодування: utf-8 - * -
імпорт сокет
рядок імпорту
[/ Code]
Тепер приступаємо до configurar бот:
[code] HOST=»irc.desdelinux.net»ПОРТ = 6667
NICK = »CalicoBot»
ІДЕНТ = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Головна»
readbuffer = »»
[/ Code]
Я поясню кожну змінну:
- ВЕДУЧИЙ: URL-адреса сервера, до якого ми будемо підключатися
- ПОРТ: Порт сервера. За замовчуванням це 6667.
- НІК, ІДЕНТИКА І ІМЕ: Вони відповідають прізвисько бота, його ідентифікації та справжньому імені.
- ЧАН: Канал, на який увійде бот
- буфер читання: У цій змінній будуть збережені дані, надіслані сервером.
Після налаштування нашого бота ми переходимо до з'єднання
[код] 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)
[/ Code]
Перший рядок не має великої таємниці, другий створює підключення до сервера а останні три надсилають дані бота на сервер для продовження входу.
Після підключення ми створимо a Нескінченна петля в яку ми підемо отримання та надсилання даних з / на сервер:
[код] при 1:readbuffer = readbuffer + s.recv (1024)
temp = string.split (буфер, "\ n")
readbuffer = temp.pop ()
для рядка в temp:
рядок = рядок.rstrip (рядок)
line = line.split (CHAN + ':')
якщо рядок [0] .find ("PING")! = -1:
pingid = рядок [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Code]
З усіх рядків, написаних вище, я прокоментую лише важливі.
з line = line.split (CHAN + ':') ми ділимося тим, що коли нам надсилає сервер давайте щось з каналу.
Наприклад, наступний рядок вказує, що хтось щось писав на каналі:
:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^
Перший - це псевдонім користувача та дані з’єднання (розділені знаком!), Команда (у цьому випадку це вказує, що він писав), канал і, нарешті, після двокрапки - надіслане повідомлення. Я не буду пояснювати багато інших команд, оскільки це не підпадає під цей посібник.
Інші важливі рядки - це ті вони після if. Сервер так часто надсилає команду PING, щоб перевірити, чи користувач все ще підключений. У цьому випадку бот надсилає команду PONG з ідентифікатором, який PING надіслав, щоб вказати серверу, що він все ще підключений.
З цим ми вже маємо базу бота. Тепер я продовжу пояснювати, як змусити бота відповідати відповідно до того, що ми хочемо для певних команд, незалежно від того, чи вони від самого IRC, чи від користувачів.
Відповідь на команди IRC:
PING та PRIVMSG - приклади команд IRC. Є багато команд, але, як я вже говорив раніше, це те, про що я не буду вдаватися в подробиці.
Наприклад, ми можемо змусити бота привітати користувачів, які підключаються:
name = рядок [0] .split ('!') [0] .split (':') [1], якщо name! = NICK та name.find (HOST) == -1:
s.send ("PRIVMSG% s: Ласкаво просимо @% s ^^ \ n"% (CHAN, ім'я))
[/ Code]
Спочатку ми перевіряємо, чи надсилає сервер команду РЕЄСТРАЦІЯ що вказує на те, що хтось підключався до сервера. Потім ми витягаємо нік, ми перевіряємо, що нік не є URL-адресою IRC (якщо не як тільки ми запустимо бота, він привітає url) і нарешті ми відправляємо привітальне повідомлення.
Команди бота:
Тепер як я можу зробити свого бота відповідати на мої власні команди? Давайте краще розглянемо приклад:
[код] якщо рядок [1] == '$ версія':s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]
У цьому прикладі, якщо хтось пише $ версія бот покаже повідомлення із зазначенням його імені, версії та автора. Повний код прикладу такий:
[код] сокет імпортурядок імпорту
ВЕДУЧИЙ = »localhost»
ПОРТ = 6667
NICK = »CalicoBot»
ІДЕНТ = »CalicoBot»
REALNAME = »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 (буфер, "\ n")
readbuffer = temp.pop ()
для рядка в temp:
рядок для друку
рядок = рядок.rstrip (рядок)
line = line.split (CHAN + ':')
якщо рядок [0] .find ("PING")! = -1:
pingid = рядок [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
якщо рядок [0] .find ('JOIN')! = -1:
name = рядок [0] .split ('!') [0] .split (':') [1], якщо 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)
[/ Code]
Сподіваюся, вам підручник сподобався, і, звичайно, я залишаю вам посилання на код мого бота, щоб ви могли бачити його код повністю і краще бачити, як він працює (хоча я видалив деякі команди для особистого користування).
Хе, я не міг пропустити бота фігня, на якій ти їдеш на IRC 😛 Дуже цікава стаття.
Дуже просте і зрозуміле пояснення.
Що робити, якщо в коді python відсутні всі відступи.
Це вже вирішено ^^
Відмінна стаття і як легко підключитися до IRC для програмування бота :)
Це нагадує мені ті часи, коли ми відчували себе програмістами, які писали сценарії для mIRC в чатах на MSN або MSNGroups.
Цікаво, я його зберігаю 😀
відмінно!
Дуже корисно, дякую Son_Link!
Привіт!
Вітаємо…
слідуючи вашим лініям і тестуючи, єдине, що працює, це
імпорт сокет
рядок імпорту
ВЕДУЧИЙ = »localhost»
ПОРТ = 6667
NICK = »CalicoBot»
ІДЕНТ = »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 ("ПРИЄДНАЙТЕСЬ:% srn"% CHAN)
зміна каналу та псевдоніму тепер наводить мене на синтаксис помилки
Я запитав інших знайомих, і вони мені відповідають, що це не схоже на пітон
Я не знаю, що я роблю неправильно, або чому я копіюю все і вставляю це в python і даю йому enter, і він підключається до каналу, але через 250 секунд канал видаляє це, оскільки не було відповіді від pong ...
Яку версію Python ви використовуєте?
Він працює лише з python 2.6 і 2.7, а не з 3.x
Я зміню запис, щоб зробити його зрозумілішим.
Повний код у мене не працює, останній абзац - це те, що не вдається, і я не можу знайти помилку. Якщо я видалю цю частину, вона з’єднується і працює чудово. Тестується за допомогою Python 2.7.3 у Windows 7.
PS: У моєму випадку я підключаюся до сервера за допомогою пароля і додаю такі рядки:
PASS = »Passdelbot»
s.send ("PASS% s \ r \ n"% PASS)
Привіт, син, посилання, велике спасибі за статтю, вона дуже цікава, я просто не можу відповісти на надіслані команди. Програма не вдається до останнього, якщо і я не можу зрозуміти, чому: "if len (рядок)> 1:"
Чекаю вашої відповіді.
Грекіас
Я щойно додав посилання на повний код бота, оскільки він перетворює деякі символи, а код показує його html-код.
У будь-якому разі я спробую спробувати показати все правильно