Frage

Was ist der beste Weg, um Nachrichten von einem IRC-Server mit Python nach dem RFC empfangen zu analysieren? Ich mag einfach eine Art von Liste / was auch immer, zum Beispiel:

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

wird folgendermaßen aus:

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

Und so weiter?

(Edit: Ich möchte IRC-Nachrichten in Allgemein , nicht nur PRIVMSG ist analysieren)

War es hilfreich?

Lösung

Lesen Sie Verdrehte Implementierung http://twistedmatrix.com/

Leider aus der Zeit bin ich, vielleicht jemand anderes kann es für Sie hier einfügen.

Bearbeiten

Nun, ich bin zurück, und seltsam niemand hat es noch klebt so ist es hier:

http://twistedmatrix.com/trac/ Browser / trunk / verdrehte / Worte / Protokolle / 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!']) 

Mit dieser Funktion eng folgt den EBNF im IRC RFC beschrieben.

Andere Tipps

Sie können es mit einem einfachen Liste Verständnis tun, wenn das Format immer so ist.

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()))

Ergebnis:

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

Wollen Sie nur IRC-Nachrichten im Allgemeinen analysieren oder wollen Sie nur PRIVMSGs analysieren? Allerdings habe ich eine Implementierung für das.

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

Wenn Sie ein Low-Level halten wollen Hacking Ich zweite die Twisted-Antwort von Unknown, aber zuerst ich glaube, Sie auf dem vor kurzem angekündigt Yardbird , die eine nette Anfrage Parsing-Schicht auf Twisted ist. Es lässt Sie so etwas wie Django URL verwenden Dispatching für IRC-Nachrichten mit einem Nebeneffekt Umgang mit dem Django ORM zum Erzeugen von Antworten zu haben, etc.

Ich weiß, es ist nicht Python, aber für einen regulären Ausdruck basierten Ansatz für dieses Problem, könnte man einen Blick auf POE :: Filter :: IRCD , die IRC-Server-Protokoll behandelt (siehe POE :: Filter :: IRC :: Compat für das Client-Protokoll Ergänzungen) Parsing für Perl IRC Rahmen :: :: Component POE.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top