7

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

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

变成这样:

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

等等?

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

4

5 回答 5

21

查看 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。

于 2009-05-30T21:58:04.740 回答
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'}
于 2009-05-30T22:26:11.547 回答
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
于 2009-05-30T22:44:01.010 回答
0

如果您想保持低级别的黑客攻击,我会支持 Unknown 的 Twisted 答案,但首先我认为您应该看看最近发布的Yardbird,它是 Twisted 之上的一个很好的请求解析层。它允许您使用类似于 Django URL 调度的东西来处理 IRC 消息,并具有使 Django ORM 可用于生成响应等的附带好处。

于 2009-05-31T04:37:44.463 回答
0

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

于 2010-02-18T11:21:55.270 回答