Python и анализ сообщений IRC - PullRequest
6 голосов
/ 31 мая 2009

Как лучше всего анализировать сообщения, полученные с IRC-сервера с помощью Python, в соответствии с RFC? Я просто хочу какой-то список / что угодно, например:

:test!~test@test.com PRIVMSG #channel :Hi!

становится таким:

{ "sender" : "test!~test@test.com", "target" : "#channel", "message" : "Hi!" }

И так далее?

(Изменить: я хочу анализировать IRC-сообщения в общих , а не только PRIVMSG)

Ответы [ 5 ]

16 голосов
/ 31 мая 2009

Посмотрите на реализацию Twisted http://twistedmatrix.com/

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

Редактировать

Ну, я вернулся, и, как ни странно, никто еще не вставил его, вот оно:

http://twistedmatrix.com/trac/browser/trunk/twisted/words/protocols/irc.py#54

def parsemsg(s):
    """Breaks a message from an IRC server into its prefix, command, and arguments.
    """
    prefix = ''
    trailing = []
    if not s:
       raise IRCBadMessage("Empty line.")
    if s[0] == ':':
        prefix, s = s[1:].split(' ', 1)
    if s.find(' :') != -1:
        s, trailing = s.split(' :', 1)
        args = s.split()
        args.append(trailing)
    else:
        args = s.split()
    command = args.pop(0)
    return prefix, command, args

parsemsg(":test!~test@test.com PRIVMSG #channel :Hi!")
# ('test!~test@test.com', 'PRIVMSG', ['#channel', 'Hi!']) 

Эта функция точно соответствует EBNF, описанному в IRC RFC.

1 голос
/ 31 мая 2009

Вы можете сделать это с простым пониманием списка, если формат всегда такой.

keys = ['sender', 'type', 'target', 'message']
s = ":test!~test@test.com PRIVMSG #channel :Hi!"
dict((key, value.lstrip(':')) for key, value in zip(keys, s.split()))

Результат:

{'message': 'Hi!', 'type': 'PRIVMSG', 'sender': 'test!~test@test.com', 'target': '#channel'}
0 голосов
/ 18 февраля 2010

Я знаю, что это не Python, но для подхода на основе регулярных выражений к этой проблеме вы можете взглянуть на POE :: Filter :: IRCD , который обрабатывает протокол сервера IRC (см. POE :: Filter :: IRC :: Compat для добавления протокола клиента) парсинг для Perl POE :: Component :: IRC framework.

0 голосов
/ 31 мая 2009

Если вы хотите придерживаться низкоуровневого хакерства, я вторую отвечаю на вопрос Twisted от Unknown, но сначала я думаю, что вам стоит взглянуть на совсем недавно анонсированный Yardbird , который хороший слой для разбора запроса поверх Twisted. Он позволяет вам использовать что-то похожее на диспетчеризацию URL Django для обработки IRC-сообщений с дополнительным преимуществом доступности Django ORM для генерации ответов и т. Д.

0 голосов
/ 31 мая 2009

Вы просто хотите проанализировать IRC-сообщения в целом или вы просто хотите проанализировать PRIVMSG? Однако у меня есть реализация для этого.

def parse_message(s):
    prefix   = ''
    trailing = ''
    if s.startswith(':'):
        prefix, s = s[1:].split(' ', 1)
    if ' :' in s:
        s, trailing = s.split(' :', 1)
    args = s.split()
    return prefix, args.pop(0), args, trailing
...