[Python] Запрограммируйте бота для IRC

Сегодня я научу вас программировать морда для IRC. Прежде всего, для тех, кто не знает, бот - это программа, которая подключается к каналу IRC и взаимодействует с ним, что позволяет нам, например, модерировать канал без что мы связаны и таким образом избежать спама, или что он распознает серию заказов и выполняет соответствующий код.
Хотя уже есть готовые боты, я, честно говоря, один из тех, кто любит создавать свои собственные программы для обучения, и большое удовлетворение это приносит нам, увидев, что это работает ^^

С учетом сказанного, перейдем к уроку.

Для программирования бота нам понадобится текстовый редактор cualquiera (nano, gedit, medit и т. д.) и интерпретатор python (Потребуется 2.6 или 2.7, не работает с python 3.x).

Сначала мы импортируем необходимые модули, в этом случае нам понадобится всего два:

[код] #! / usr / bin / env python
# - * - кодировка: utf-8 - * -

импортный сокет
строка импорта
[/ Код]

Теперь переходим к configurar бот:

[код] HOST = »irc.fromlinux.net»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Главная»
readbuffer = »»
[/ Код]

Я объясню каждую переменную:

  • ВЕДУЩИЙ: URL-адрес сервера, к которому мы будем подключаться
  • ПОРТ: Порт сервера. По умолчанию это 6667.
  • НИК, ИДЕНТ и НАСТОЯЩЕЕ ИМЯ: Они соответствуют нику бота, его идентификатору и настоящему имени.
  • ЧАН: Канал, в который войдет бот
  • 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)
[/ Код]

Из всех написанных выше строк прокомментирую только важные.
В лице line = line.split (CHAN + ':') мы разделяем то, что сервер отправляет нам, когда давайте что-нибудь получим с канала.
Например, следующая строка указывает, что кто-то что-то написал на канале:

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

Первый - это ник и данные подключения пользователя (разделенные знаком!), Команда (в данном случае это означает, что он написал), канал и, наконец, после двоеточия, отправленное сообщение. Я не буду объяснять многие другие команды, поскольку это не входит в этот учебник.

Остальные важные строчки после if. Сервер время от времени отправляет команду PING, чтобы проверить, подключен ли еще пользователь. В этом случае бот отправляет команду PONG с идентификатором, который отправил PING, чтобы указать серверу, что он все еще подключен.

При этом у нас уже есть база бота. Теперь я перейду к объяснению, как заставить бота реагировать в соответствии с тем, что мы хотим, на определенные команды, будь то от самого IRC или от пользователей.

Отвечая на команды IRC:

PING и PRIVMSG - это примеры команд IRC. Команд много, но, как я сказал ранее, я не буду вдаваться в подробности.
Например, мы можем заставить бота здороваться с пользователями, которые подключаются:

[код] если строка [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, имя))
[/ Код]

Сначала мы проверяем, отправляет ли сервер команду РЕГИСТРАЦИЯ что указывает на то, что кто-то подключился к серверу. Затем извлекаем ник, проверяем, что это ник не 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)
[/ Код]

Надеюсь, вам понравился этот урок, и, конечно же, оставляю вам ссылку на код моего бота, чтобы вы могли увидеть его код полностью и лучше понять, как он работает (хотя я удалил некоторые команды для личного использования).

CalicoBot


Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

12 комментариев, оставьте свой

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   AurosZx сказал

    Хех, я не мог пропустить бота чуши, на которой вы ездите по IRC 😛 Очень интересная статья.

  2.   Прекращаться сказал

    Очень простое и понятное объяснение.
    Что, если в коде Python отсутствуют все отступы.

  3.   Рафа сказал

    Отличная статья и как просто подключиться к IRC для программирования бота :)…

    Это напоминает мне те времена, когда мы чувствовали себя программистами, пишущими скрипты для mIRC в чатах MSN или MSNGroups.

  4.   Truko22 сказал

    Интересно сохраняю

  5.   Генезис Варгас Дж. (@Elprincipiodeto) сказал

    отлично!

  6.   Элинкс сказал

    Очень полезно, спасибо Son_Link!

    Привет!

  7.   dbillyx сказал

    Ура…

    следуя вашим линиям и тестируя единственное, что работает, это
    импортный сокет
    строка импорта

    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 не было ответа ...

  8.   булавка сказал

    Полный код у меня не работает, последний абзац не работает, и я не могу найти ошибку. Если я удалю эту часть, она подключается и работает отлично. Протестировано с Python 2.7.3 в Windows 7.

    PS: В моем случае я подключаюсь к серверу с паролем и добавляю эти строки:
    PASS = »Passdelbot»
    s.send ("ПРОЙДЕН% s \ r \ n"% ПРОЙДЕН)

  9.   ДОЛФИН сказал

    Привет, Сон Линк, большое спасибо за статью, она очень интересная, просто не могу отвечать на отправленные команды. Программа не входит в последнее if, и я не могу понять, почему: "if len (line)> 1:"
    Я жду твоего ответа.
    спасибо