Python与解析IRC消息

8 投票
5 回答
10761 浏览
提问于 2025-04-15 11:56

用Python按照RFC标准解析从IRC服务器收到的消息,最好的方法是什么?我只是想要一个列表或者其他什么东西,比如:

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

变成这样:

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

然后继续?

(补充说明:我想要解析IRC消息的一般格式,而不仅仅是PRIVMSG的消息)

5 个回答

0

如果你想进行一些底层的黑客操作,我支持Unknown的Twisted回答。不过首先,我觉得你应该看看最近发布的Yardbird。这个东西是建立在Twisted之上的一个很不错的请求解析层。它让你可以用类似Django的URL分发方式来处理IRC消息,还有一个额外的好处就是可以使用Django的ORM来生成响应等等。

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

看看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协议文档中描述的EBNF格式。

撰写回答