7

IRC サーバーから受信したメッセージを Python で RFC に従って解析する最良の方法は何ですか? たとえば、ある種のリスト/何かが欲しいだけです:

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

これになります:

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

等々?

(編集: PRIVMSG だけでなく、 IRC メッセージ全般を解析したい)

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

低レベルのハッキングを続けたい場合は、Unknown による Twisted の回答を支持しますが、まず、Twisted の上にある優れたリクエスト解析レイヤーである、ごく最近発表されたYardbirdを確認する必要があると思います。IRC メッセージを処理するために Django URL ディスパッチに似たものを使用でき、Django ORM を応答の生成などに利用できるという副次的な利点があります。

于 2009-05-31T04:37:44.463 に答える
0

Python ではないことはわかっていますが、この問題に対する正規表現ベースのアプローチについては、IRC サーバー プロトコルを処理するPOE::Filter::IRCDを参照してください ( POE::Filter::IRC::Compatを参照してください)。クライアント プロトコルの追加) Perl のPOE::Component::IRCフレームワークの解析。

于 2010-02-18T11:21:55.270 に答える
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 に答える