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

Сегодня я научу вас программировать морда для 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. Команд много, но, как я сказал ранее, я не буду вдаваться в подробности.
Например, мы можем заставить бота здороваться с пользователями, которые подключаются:

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

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

КаликоБот


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

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

*

*

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

  1.   АуросZx сказал

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

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

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

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

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

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

  4.   Truko22 сказал

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

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

    отлично!

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

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

    Привет!

  7.   дбилликс сказал

    Ура…

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

    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:"
    Я жду твоего ответа.
    спасибо