Categories: Python

python-irc-bot/

Иногда бывает нужно синтегрироваться со Slack, Gitter, или подобного рода веб-чатом. Например, посылать в него сообщение при происшествии определенного события. К сожалению, подобные сервисы имеют сильно разные и иногда не слишком удобные для этих целей API. Зато многие, включая тот же Slack и Gitter, позволяют ходить в них по IRC. Более того, с помощью программы bitlbee по IRC можно ходить еще и в Skype, Jabber, Twitter и многое другое. Грех этим не воспользоваться.

Ниже приведен код скрипта, отправляющего заданный список сообщений по IRC:

#!/usr/bin/env python3

# (c) Aleksander Alekseev 2016, http://remontka.com/

import socket , ssl , time

def irc_send ( conf , msg_list ) :
if msg_list == [ ] :
return
tcp_sock = socket . socket ( socket . AF_INET , socket . SOCK_STREAM )
ssl_sock = ssl. wrap_socket ( tcp_sock )
ssl_sock. connect ( ( conf [ ‘host’ ] , int ( conf [ ‘port’ ] ) ) )

def ssl_send ( cmd ) :
ssl_sock. write ( cmd . encode ( ) + b r n )

ssl_send ( ‘USER {0} localhost localhost {0}’ . format ( conf [ ‘nick’ ] ) )
ssl_send ( ‘NICK {}’ . format ( conf [ ‘nick’ ] ) )
ssl_send ( ‘PASS {}’ . format ( conf [ ‘password’ ] ) )
ssl_send ( ‘JOIN #{}’ . format ( conf [ ‘channel’ ] ) )
for msg in msg_list:
ssl_send ( ‘PRIVMSG #{} :{}’ . format ( conf [ ‘channel’ ] , msg ) )
# time.sleep(1.1)
ssl_send ( ‘QUIT’ )

while True :
data = ssl_sock. read ( )
if data == b » : # enf of file
break

ssl_sock. close ( )

irc_config = {
‘host’ : ‘irc.gitter.im’ ,
‘port’ : ‘6667’ ,
‘nick’ : ‘devzen_ru_twitter’ ,
‘password’ : ‘SECRET’ ,
‘channel’ : ‘DevZenRu/live’
}

irc_send ( irc_config , [ ‘Message 1’ , ‘Message 2’ ] )

Здесь используется собственная реализация протокола, поскольку мне не очень нравится интерфейс существующих реализаций, того же пакета irc , а также потому что мне нужно было просто отправить сообщение в чат и тут же отключиться. Учитывая простоту протокола, удобнее написать свои пять строк кода и не тянуть лишние зависимости, для использования которых потребуется еще и использовать virtualenv .

Если вам нужно написать что-то чуть более сложное, например, собирать логи, или выполнять команды пользователей в чате, вас может заинтересовать проект Legobot . Обратите также внимание на мою старую заметку Краткое описание протокола IRC и пример бота . Протокол IRC действительно прост до безобразия, поэтому, возможно, и нет смысла использовать для него зависимости.

admin

Recent Posts

После включения диагностического запуска не удается войти в Windows — как исправить?

Некоторые пользователи, экспериментируя с конфигурацией системы в окне msconfig могут столкнуться с ситуацией, когда после…

1 неделя ago

WinScript — очистка и настройка Windows 11 и 10

На сайте не раз публиковались обзоры программ, предназначенных для очистки или настройки последних версий Windows.…

1 неделя ago

Предварительный просмотр накопительного обновления не устанавливается — решение

При установке некоторых обновлений Windows 11, имеющих в названии «Предварительный просмотр накопительного обновления», многие пользователи…

1 неделя ago

FixExec — восстановление ассоциаций .exe, .bat и .com файлов

Некоторые пользователи Windows 11, 10 и предыдущих версий системы могут столкнуться с ситуацией, когда исполняемые…

1 неделя ago

Ошибка 0x800705b4 при обновлении Windows 11 и 10 — как исправить?

При установке обновлений Windows 11/10 некоторые пользователи могут столкнуться с ошибкой с кодом 0x800705b4 и…

1 неделя ago

Обслуживание вашей версии Windows 11 окончено — что делать?

Пользователи Windows 11 могут столкнуться с сообщением «Обслуживание вашей версии Windows окончено» (Your version of…

1 неделя ago