Python&解析IRC消息

时间:2009-05-30 21:51:59

标签: python parsing irc

根据RFC解析使用Python从IRC服务器接收的消息的最佳方法是什么?我只想要某种列表/其他,例如:

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

成为这个:

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

等等?

(编辑:我想解析一般中的IRC消息,而不仅仅是PRIVMSG的消息)

5 个答案:

答案 0 :(得分:16)

查看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!']) 

此功能严格遵循IRC RFC中描述的EBNF。

答案 1 :(得分:1)

如果格式始终如此,您可以使用简单的列表解析来完成。

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'}

答案 2 :(得分:0)

您是否只想解析一般的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

答案 3 :(得分:0)

如果你想保持低级别的黑客攻击,我会使用Unknown来回答Twisted的回答,但首先我想你应该看一下最近宣布的 Yardbird ,这是一个很好的请求解析Twisted顶部的层。它允许您使用类似于Django URL调度的方法来处理IRC消息,这样可以使Django ORM可用于生成响应等。

答案 4 :(得分:0)

我知道它不是Python,但对于这个问题的基于正则表达式的方法,您可以查看处理IRC服务器协议的POE::Filter::IRCD(有关客户端协议的添加,请参阅POE::Filter::IRC::Compat解析Perl的POE::Component::IRC框架。