← На главную

Простейший IRC-бот на Python, а также при чем тут Slack, Gitter и прочие веб-чаты

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

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

#!/usr/bin/env python3 # (c) Aleksander Alekseev 2016, http://eax.me/ 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 действительно прост до безобразия, поэтому, возможно, и нет смысла использовать для него зависимости.