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 действительно прост до безобразия, поэтому, возможно, и нет смысла использовать для него зависимости.

EnglishRussianUkrainian