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