Библиотека irc и личный IRC-бот

Предыдущая тема Следующая тема Перейти вниз

Библиотека irc и личный IRC-бот

Сообщение  Замабувараев в Вс Ноя 16, 2014 9:27 pm

Любите покодировать, но нет свежих идей? Начнём с персонального IRC-бота. Если вы интернетчик со стажем, то наверняка пользовались IRC; если нет — прочтите врезку «Стоп… а что такое IRC?», там объясняются базовые понятия. Коротко говоря, IRC — это чат в реальном времени, часто используемый разработчиками открытого ПО для взаимодействия друг с другом. Он очень быстр, в нём легко разобраться, и — главное — можно создавать виртуальных участников чата.

Этим мы и займёмся — напишем «робота», который присоединяется к чату и рассказывает о компьютере. Скажем, вы на работе или в отпуске далеко от дома и хотите наблюдать за домашней системой (или за сервером на площадке провайдера). Наш IRC-бот будет сидеть себе в чате и ждать, когда появитесь вы и спросите его о количестве свободной оперативной памяти.

Программ для мониторинга системы немерено, но они страдают повышенной дотошностью и забивают ваш почтовый ящик письмами с лишними подробностями о работе компьютера. С нашим ботом всё намного проще: если вы хотите узнать, сколько осталось свободного места на диске, или посмотреть, хватает ли оперативной памяти, просто заскочите в IRC и спросите у него (через приватные сообщения). А самое важное — мы ограничим доступ так, чтобы эти данные могли получить только вы!

Стоп… а что такое IRC?


IRC (Internet Relay Chat — ретранслируемый интернет-чат) — это система обмена сообщениями в режиме реального времени, предшественница всемирной паутины (World Wide Web), изобретённая в 1988 году. IRC — открытый текстовый протокол, и написать клиента для него может каждый. IRC-обсуждения проходят в нескольких сетях; одни ориентированы на свободное ПО (irc://chat.freenode.net), другие — на игры, третьи — на болтовню.

Каждая IRC-сеть состоит из нескольких серверов, связанных друг с другом — можно выбрать как ближайший к вам географически, так и любой другой случайным образом. В любом случае вы будете частью одной и той же сети. Например, чтобы начать общаться в сети Freenode, найдите IRC-клиент (например, mIRC, X-Chat, Миранда или ChatZilla — плагин к огнелисе), запустите его и введите:

Код:


/server irc.freenode.net


(команды IRC начинаются со слэша). После этого зарегистрируйте имя пользователя и пароль с помощью следующих команд:

Код:


/nick <mynickname>
/msg nickserv register <password>


Потом можно зайти в «канал» (отдельная комната чата) с помощью команды:

Код:


/join #freebasic-ru


(Название канала начинается с символа решетки.) Теперь можете писать сообщения в общий чат или приватные сообщения отдельным пользователям (например, в X-Chat для этого щёлкните правой кнопкой мыши на имени пользователя и выберите в меню «Открыть диалог»).

Установка


Воспользуемся специальной библиотекой libirc, предоставляющей интерфейс для протокола IRC — тогда нам не придётся писать тонны кода для работы с сокетами и соединениями. Вместо этого мы попросим libirc позаботиться о сетевых взаимодействиях, а сами будем дрессировать бота, пусть делает то, что нам нужно.

Скомпилировать библиотеку из исходных текстов проще простого. Скачайте исходники библиотеки libirc https://www.sethi.su/res/b/irc.7z и запустите компиляцию командой:

Код:


fbc -l Lists -lib irc.bas Property.bas ParseData.bas SendReceiveData.bas SendMessages.bas


Далее создадим две учётных записи для IRC: первая — для вас, вторая — для бота (если вы завсегдатай IRC, то первая у вас уже есть). Это важный этап, поскольку из-за борьбы со спамом на многих IRC-серверах пользователь должен зарегистрироваться, чтобы иметь возможность отправлять приватные сообщения другим участникам чата.

Зайдите в IRC и переключитесь в вашего обычного пользователя. Если вы ещё не зарегистрированы, введите такую команду:

Код:


/msg nickserv register <password>


Параметр <password> замените на подходящий пароль. Примеры команд приведены для серверов Freenode, в других сетях они могут отличаться. Теперь ваш пользователь зарегистрирован на сервере IRC — то есть никто другой это имя не отберёт. Сказать IRC-серверу кто вы такой, можно с помощью команды:

Код:


/msg nickserv identify <password>


Нужно также зарегистрировать как пользователя нашего, пока нерождённого, бота. Переключитесь в другого пользователя и задайте ему пароль таким образом:

Код:


/nick UltraCoolLXFBot
/msg nickserv register thisismypassword


Конечно, можно взять другое имя пользователя и пароль, но запомните их, ведь они понадобятся коду нашего бота! Итак, мы завели две зарегистрированные учётные записи, себе и боту.

Покажи-ка мне код


Мы готовы к созданию бота. Вот его код.

Код:


REM Файл bot.bas

#include once "bot.bi"
   
   Dim Shared strServer As WString*80 => "chat.freenode.net"
   Dim intPort As Integer = 6667
   Dim Shared strBotName As WString*80 => "UltraCoolLXFBot"
   Dim Shared strBotAdminName As WString*80 => "BotAdmin"
   Dim Shared strChannelName As WString*80 => "##freebasic-ru"
   Dim strPassword As WString*80 => "<password>"
   
   ' Создание объекта
   objIrc = New IrcLibrary.IrcClient(strServer, intPort, strBotName)
   ' Присоединение к каналу
   objIrc->JoinChannel(strChannelName)
   ' Установка указателей на функции
   objIrc->PrivateMessageEvent = @PrivateMessage
   ' Присоединение к каналу
   objIrc->JoinChannel(strChannelName)
   ' Пытаемся соединиться с сервером
   objIrc->OpenIrc()
   ' Отправляем регистрационные данные бота
   objIrc->SendMessage("nickserv", "identify " & strPassword)
   ' Цикл получения данных от сервера
   Do
   Loop Until objIrc->GetData()
   
   ' закрываем соединение
   objIrc->CloseIrc()
   ' Очистка
   Delete(objIrc)

' Личное сообщение
Function PrivateMessage(ByRef User As WString, ByRef MessageText As WString)As Integer
   Dim intMemory As UInteger = Fre()
   objIrc->SendMessage(strBotAdminName, "Количество свободной памяти в байтах = " & WStr(intMemory))
   Return 0
End Function


Вот код заголовочного файла

Код:


REM Файл bot.bi

#define unicode
#include once "irc.bi"

' Сообщение в журнал
Declare Sub LogMessage(ByRef MessageText As WString)
' Инвайт
Declare Function Invite(ByRef FromUserName As WString, ByRef Channel As WString)As Integer
' Серверное сообщение
Declare Function ServerMessage(ByRef ServerCode As WString, ByRef MessageText As WString)As Integer
' Уведомление
Declare Function Notice(ByRef Channel As WString, ByRef NoticeText As  WString)As Integer
' Сообщение с канала
Declare Function ChannelMessage(ByRef Channel As WString, ByRef User As WString, ByRef MessageText As WString)As Integer
' Личное сообщение
Declare Function PrivateMessage(ByRef User As WString, ByRef MessageText As WString)As Integer
' Пользователь присоединился
Declare Function UserJoined(ByRef Channel As WString, ByRef UserName As WString)As Integer
' Пользователь покинул
Declare Function UserLeaved(ByRef Channel As WString, ByRef UserName As WString, ByRef MessageText As WString)As Integer
' Смена ника
Declare Function NickChanged(ByRef OldNick As WString, ByRef NewNick As WString)As Integer
' Пользователь вышел
Declare Function UserQuit(ByRef UserName As WString, ByRef MessageText As WString)As Integer
' Пинг и понг от сервера
Declare Function PingEvent(ByRef Server As WString)As Integer
Declare Function PongEvent(ByRef Server As WString)As Integer
' Объект IRC-клиента
Dim Shared objIrc As IrcLibrary.IrcClient Ptr


Давайте пройдёмся по коду. Первые строки просто сообщает компилятору FreeBASIC о подключении заголовочных файлов библиотеки libirc. Наш бот будет принимать и отвечать в кодировке UTF-8, поэтому никаких проблем с русскими буквами быть не должно. На шести следующих строках объявляются имя сервера и порт для подключения, а также имя бота, имя владельца бота, имя канала, на котором будет висеть бот и пароль — перед компиляцией их потребуется изменить на имя вами зарегистрированного бота.

Но сперва нужно сделать одну вещь: связать с сообщениями, которые бот получает от IRC-сервера, некоторые действия. Наш бот ведь не глухонемой, и он должен знать, на какие сообщения давать ответ. Вызовы

Код:


objIrc->PrivateMessageEvent = @PrivateMessage
objIrc->JoinChannel(strChannelName)


об этом позаботятся, они говорят боту: «Получив сообщение А, перейди к подпрограмме B».

После этого в строке objIrc = New IrcLibrary.IrcClient создаётся объект IRC-бота. Затем мы открываем соединение с IRC-сервером на основе предоставленной ранее информации. Итак, на данном этапе у бота есть все необходимое для подключения к IRC-серверу.

Например, первая строка этого куска кода говорит: «Если получим сообщение 001, вызываем функцию Wellcome». Сообщение 001 – специальный код, возвращаемый IRC-сервером на стадии установки соединения: сервер отправляет приветствие пользователю, что связь успешно установлена. Если вы любитель посидеть в IRC, то знаете, что во время установки соединения на экране появляется множество сообщений о статусе сервера, сообщений данного сообщества, сообщение дня и так далее. Код 001 означает начало приветствий.

Далее следует обработчик ещё для одного события: приватное сообщение. Обработчик говорит боту, какие функции вызвать в тех случаях, когда бот получает приватное сообщение. IRC-боты могут реагировать и на всякие другие сообщения, например, присоединение пользователя к каналу, смена темы канала, но для нашего случая этого достаточно.

Команда objIrc->OpenIrc() приводит бота в действие. Бот обучен, какой сервер использовать и какие подпрограммы вызывать при получении определенных сообщений; он соединяется с сервером и через несколько секунд получает сообщение 001, о котором мы говорили ранее. Оно активирует внутренний обработчик команд для реагирования на сообщение Wellcome. В этот момент бот отправляет сообщения серверу на присоединение к каналам.

После соединения бота с сервером мы отправляем личное сообщение

Код:


objIrc->SendMessage("nickserv", "identify " & strPassword)


Nickserv — это встроенный сервис-обработчик имени пользователя на большинстве серверов IRC. Мы предоставляем пароль бота для аутентификации его на сервере.

Теперь наш бот будет смирно сидеть на канале, пока его оттуда не выгонят. Самая важная функция здесь — это PrivateMessage. Она вызывается когда бот получает личное сообщение, то есть сообщение в отдельном диалоге вне основного канала. В ответ на любое сообщение бот отправляет текущее количество свободной памяти в системе пользователю BotAdmin, то есть вашему обычному пользователю.

Продолжаем работать


Пора запустить бота. Откройте файл bot.bas и измените конфигурационные переменные сверху в соответствии с вашими настройками, а именно впишите имя пользователя и пароль для бота, вами зарегистрированные, своё имя пользователя, имя канала, на котором будет висеть бот (strServer, strBotName, strBotRealName, strDisconnectText, strBotAdminName, strChannelName, strPassword и intPort). Запустите IRC-клиента, авторизуйтесь на сервере и зайдите в канал, который вы указали для бота. Скомпилируйте бота командой

Код:


fbc bot.bas -l irc


Затем запустите бота.

Через пару секунд бот установит соединение, авторизуется на сервере и зайдёт в указанный канал. Командой privmsg начните приватный диалог с ботом и скажите ему всё, что угодно — бот пришлёт результат выполнения функции Fre. Отлично! Теперь можно запустить бота на любом компьютере и отслеживать уровень загрузки системы просто общаясь с ботом в IRC-чате.

Хотя нарекания остаются. Кто бы не заговорил с ботом в приватном канале, результат выполнения функции Fre отправится вам. Бот также умеет выполнять только команду Fre — может, вам этого и достаточно, но он способен на гораздо большее.

Если всё работает нормально, можно добавить в функцию PrivateMessage новые возможности, например, таким образом:

Код:


Function PrivateMessage(ByRef User As WString, ByRef MessageText As WString)As Integer
   If User = strBotAdminName Then
      Dim intMemory As UInteger = Fre()
      objIrc->SendMessage(strBotAdminName, "Количество свободной памяти в байтах = " & WStr(intMemory))
   End If
   Return 0
End Function


На этот раз мы проверяем (If User = "BotAdmin"), кто отправляет боту приватное сообщение, и продолжим только если это BotAdmin, то есть вы!

Если мы хотим посмотреть всю кухню IRC-взаимодействия бота и сервера, то можно добавить в месте «установка указателей на функции» строчку

Код:

   
   objIrc->LogMessageEvent = @LogMessage
   

И функцию

Код:


Sub LogMessage(ByRef MessageText As WString)
   ' Печатаем на консоль, но можно сохранять в файл
   Print(WStr(Time) & " " & MessageText)
End Sub


Теперь у нас есть расширяемый IRC-бот, который отвечает на ваши команды и только вам. Он ни о чём не проболтается случайному посетителю (если только тот не зайдёт под вашим именем и паролем). Вряд ли вы захотите разрешить боту выключать компьютер, но с его помощью можно получить о компьютере массу информации, запускать и останавливать приложения, отправлять письма по электронной почте.

Это очень гибкое решение: если кажется, что с компьютером что-то случилось, можно запустить бота на web-сервере и допросить его; или запустить бота на домашнем компьютере и прямо с работы запускать и останавливать с его помощью определённые процессы. Возможности безграничны — а всего-то нужен доступ к IRC!

Ссылки


Библиотека irc https://www.sethi.su/res/b/irc.7z


Последний раз редактировалось: zamabuvaraeu (Ср Ноя 19, 2014 12:59 am), всего редактировалось 1 раз(а) (Обоснование : Обновление библиотеки libirc и параметров компиляции)
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 34
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Библиотека irc и личный IRC-бот

Сообщение  trew в Вт Ноя 18, 2014 12:05 pm

Ссылка на архив битая.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Библиотека irc и личный IRC-бот

Сообщение  Замабувараев в Вт Ноя 18, 2014 12:26 pm

trew пишет:Ссылка на архив битая.
Поправил, теперь не битая.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 34
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Библиотека irc и личный IRC-бот

Сообщение  trew в Вт Ноя 18, 2014 2:01 pm

Да, теперь скачал. Позднее попробую, спасибо.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Библиотека irc и личный IRC-бот

Сообщение  Замабувараев в Ср Ноя 19, 2014 1:00 am

trew пишет:Да, теперь скачал. Позднее попробую, спасибо.
Обновил библиотеку, изменил параметры компиляции. Теперь всё должно работать.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 34
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Библиотека irc и личный IRC-бот

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения