سؤال

ما هي أفضل طريقة لتحليل الرسائل المستلمة من خادم IRC مع Python وفقا ل RFC؟ أريد ببساطة نوعا ما من القائمة / أي شيء، على سبيل المثال:

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

يصبح هذا:

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

وما إلى ذلك وهلم جرا؟

(تحرير: أريد تحليل رسائل IRC في جنرال لواء, وليس فقط primmsg's)

هل كانت مفيدة؟

المحلول

انظر إلى تنفيذ الملتوية http://twistedmatrix.com/

لسوء الحظ أنا خارج الوقت، ربما يستطيع شخص آخر الصجون هنا من أجلك.

يحرر

حسنا، لقد عدت، وغرابة لم يمل أحد حتى الآن هنا هو:

http://twistedmatrix.com/trac/browser/trunk/twisted/wisted/wreds/protocols/irc.ping

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

تتبع هذه الوظيفة عن كثب EBNF الموصوفة في RFC IRC.

نصائح أخرى

يمكنك القيام بذلك بفهم قائمة بسيطة إذا كان التنسيق دائما مثل هذا.

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

هل تريد فقط تحليل رسائل IRC بشكل عام أو هل تريد تحليل primmsgs؟ ومع ذلك لدي تنفيذ لذلك.

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

إذا كنت ترغب في الاحتفاظ باختراق منخفض المستوى، فأنا ثاني الإجابة الملتوية من قبل غير معروف، ولكن أولا أعتقد أنه يجب عليك إلقاء نظرة على الإعلان مؤخرا نبيل وهو طبقة تحليل الطلب لطيفة على رأس الملتوية. يتيح لك استخدام شيء مشابه لعنوان URL DJango لإرسال رسائل IRC مع فائدة جانبية من وجود Django Orm المتاحة لتوليد الردود، إلخ.

أعلم أنه ليس بيثون، ولكن لنهج تعبير عادي في هذه المشكلة، فيمكنك إلقاء نظرة على POE :: Filter :: IRCD, ، الذي يتعامل مع بروتوكول خادم IRC (انظر POE :: Filter :: IRC :: Compat للحصول على إضافات بروتوكول العميل) تحليل PERL POE :: Component :: IRC إطار العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top