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